无法使用PDO连接MySQL

4
我正在跟随这个教程,目前在04:00左右,想通过PDO连接到我的MySQL数据库。但是当我尝试建立连接时,网页总是显示“无法连接”。 当我使用PHPStorm内置的数据库程序时,我不得不将我的服务器时区更改为Europe/Amsterdam,然后我才能连接到我的数据库。
我尝试在'new PDO()'代码中添加端口号。 我尝试在代码和MySQL服务器上更改时区,但是它会出现此错误;
mysql> SET GLOBAL time_zone = 'Europe/Amsterdam';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Europe/Amsterdam'

<?php

try {
    $pdo = new PDO('mysql:host=localhost:dbname=mytodo', 'root', '');
} catch (PDOException $e) {
    die('Could not connect.');
}

$statement = $pdo->prepare('select * from todos');

$statement->execute();

var_dump($statement->fetchAll());

require 'index.view.php';

额外信息:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

mysql> SET GLOBAL time_zone = 'Europe/Amsterdam'; 不是 PHP 或 PDO。请澄清问题。这是一个 SQL 查询还是 PDO 连接? - user3783243
好的,所以我使用了“常识”的代码,重启了我的mysql服务,然后出现了这个错误: 致命错误:未捕获的PDOException:SQLSTATE [HY000] [2054]服务器请求客户端未知的身份验证方法您可以通过以下方式修复: ALTER USER 'YOUR_USER_NAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ENTER_YOUR_PASSWORD_HERE'; - user10141648
“ALTER USER 'YOUR_USER_NAME'” 不在这个问题中。另外,您想要使用该语句做什么? - user3783243
2个回答

3
你正在跟随的教程已经非常过时。
连接到PDO的代码必须遵循我在文章如何使用PDO连接MySQL中解释的某些规则。简而言之:
  • 它应该配置错误报告模式
  • 它应该以正确的方式设置连接字符集
  • 它不应该捕获自己的错误来报告它们
  • 它应该遵循正确的DSN语法,没有任何额外的装饰
  • 它还可以设置一些有用的设置
所以代码应该像这样:
$host = '127.0.0.1';
$db   = 'mytodo';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$pdo = new \PDO($dsn, $user, $pass, $options);

这里你可以看到正确的连接代码,它可以完成很多任务。其中包括,在您的代码无法连接数据库时,告诉您实际的问题所在。


致命错误: 未捕获的 PDOException 错误: SQLSTATE[HY000] [2054] 服务器请求了客户端未知的身份验证方法。 - user10141648
是的!现在你知道问题所在了。而这个特定问题的解决方案很容易通过谷歌搜索获得,就像我说的一样:这是一个众所周知的问题。只要记住 - 问题可能是任何东西,关键是获取实际的错误消息。其余的都很简单。 - Your Common Sense
好的,所以我使用了“常识”的代码,重新启动了我的mysql服务,然后出现了这个错误:致命错误:未捕获的PDOException:SQLSTATE [HY000] [2054]服务器请求客户端未知的身份验证方法。您可以通过以下方式修复:ALTER USER 'YOUR_USER_NAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ENTER_YOUR_PASSWORD_HERE'; - user10141648

0

您的代码在 localhost 附近出现了错误。

使用分号代替冒号。

请改为以下写法:

$pdo=new PDO('mysql:host=localhost;dbname=mytodo','root','');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接