为什么不能使用 PDO 访问特定的数据库,但可以使用没有 DBname 的 mysqli? (使用 devserver/phpmyadmin)?

Why can't access to especific DB using PDO, but can using mysqli without DB name? (usign devserver/phpmyadmin)?

我在 windows 10 x64 机器上安装 easyphp/devserver (v17.0)。 使用表并测试以使用简单的 php 文件存储远程数据(对于数据库来说非常新)。 我正在尝试为我的项目设置对我的数据库的访问(最好使用 PDO)。

通过mysql命令设置所有数据库:

CREATE database arduDB;
CREATE USER 'Atmega'@'localhost';
GRANT USAGE on *.* to 'Atmega'@'localhost';
GRANT ALL PRIVILEGES ON arduDB.* TO 'Atmega'@'localhost';
CREATE USER 'Atmega'@'%';
GRANT USAGE on *.* to 'Atmega'@'%';
GRANT ALL PRIVILEGES ON arduDB.* TO 'Atmega'@'%';
FLUSH PRIVILEGES;

这里一切都很好。

但无法使用 PDO 访问我的数据库 (arduDB),但可以在不使用数据库名称的情况下使用 MYSQLI 'arduDB'。

我从 phpmyadmin 中删除了 '' (Any) 用户,但仍然无法使用 PDO 访问。 一整天都在搜索和阅读有关此问题的信息,但找不到发生这种情况的原因。 我也用密码创建了另一个用户,但也无法使用 PDO 访问数据库。

似乎phpmyadmin 无法关联数据库的权限,

已编辑 此 'add.php',不使用 'arduDB' 名称通过 MYSQLI 授予访问权限:

<?php
    $servername = "localhost";
    $username = "Atmega";

    // Create connection
    $conn = new mysqli($servername, $username);

    // Check connection
    if ($conn->connect_error) {
        die("Failed: " . $conn->connect_error);
    }
    echo "Connected!!!";
?>

在网络浏览器中显示 "Connected"。但是如果我尝试使用 arduDB 参数,同样的错误。

但是当我使用PDO时,提示arduDB数据库,我无法访问我的数据库。

<?php
    $servername = "localhost";
    $username = "Atmega";

try {
    $conn = new PDO("mysql:host=$servername;dbname=arduDB", $username);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected!!!";
    }
catch(PDOException $e)
    {
    echo "Failed: " . $e->getMessage();
    }
?>

SQLSTATE[HY000] [1044] 拒绝用户 ''@'localhost' 访问数据库 'ardudb' 要么 SQLSTATE[HY000] [1044] 拒绝用户 'Atmega'@'localhost' 访问数据库 'ardudb'

拜托,我需要在我的代码中配置或使用什么才能在我的项目中使用 PDO 授予对特定数据库的访问权限?

Finlay 我找到了回应。 正如 André Verwijs 在他的 post 中所说,phpmyadmins 使用 "unix_socket" 将用户密码存储在 'mysql' 数据库中。这就是即使为任何用户创建或更改密码,在 phpmyadmin 的 'User accounts' 部分的密码列中总是出现 "NO" 的动机。 要解决此问题,André Verwijs 建议在 mysql 控制台中执行此操作:

use mysql;

SELECT user, plugin FROM user;

UPDATE user SET plugin="mysql_native_password"; 

update user set authentication_string=password('USE-HERE-PASSWORD'), plugin='mysql_native_password' where user='Atmega';

FLUSH PRIVILEGES;

使用此 phpmyadmin 将使用插件 "mysql_native_password" 作为 mysql 数据库中的密码。现在可以使用正确的用户和密码(或没有密码)访问我的数据库。