首页 > 解决方案 > 为什么不能使用 PDO 访问特定的数据库,但可以使用没有数据库名称的 mysqli?(使用 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 访问 DB。

似乎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!!!";
?>

在网络浏览器中显示“已连接”。但是,如果我尝试使用 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 授予对特定数据库的访问权限?

标签: phpmysqlwindowseasyphpdevserver

解决方案


Finlay 我找到了回应。就像André Verwijs在他的帖子中所说,phpmyadmins 使用“unix_socket”将用户密码存储在“mysql”数据库中。这是因为即使为任何用户创建或更改密码,在 phpmyadmin 的“用户帐户”部分中,密码列中始终显示“否”。为了解决这个问题,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 DB 中的密码。现在可以使用正确的用户名和密码(或没有密码)访问我的数据库。


推荐阅读