php - 为什么不能使用 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 授予对特定数据库的访问权限?
解决方案
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 中的密码。现在可以使用正确的用户名和密码(或没有密码)访问我的数据库。
推荐阅读
- reactjs - 从功能性父组件访问子功能 - 反应
- java - 如何将 POST 响应放在字符串的选项卡中?
- ios - 'NSInvalidArgumentException',原因:'-[NSNull renderingMode]:无法识别的选择器发送到实例
- html - 如何在 django 模板的 for 循环中加载图像?
- c# - .netcore 上的 Hangfire 一段时间后无法工作(部署到真实服务器)
- android - ionic 3 inapp 浏览器摄像头访问以进行聊天
- javascript - 通过onClick单击图像时如何从图像中获取信息
- flutter - 是否可以将 pubspec.yaml 文件拆分为多个文件
- jquery - 如何将项目数组作为参数传递给“MVC4 Razor”中的存储过程?
- eclipse - Javadoc 加载减慢了 Eclipse