尝试使用 PDO 连接到错误的数据库时 PHP 不显示错误

Posted

技术标签:

【中文标题】尝试使用 PDO 连接到错误的数据库时 PHP 不显示错误【英文标题】:PHP Does not show errors when trying to connect to a wrong database using PDO 【发布时间】:2015-06-20 19:12:06 【问题描述】:

我对 php 非常陌生,我遇到了一个非常基本的问题,尽管在论坛中查看了类似的问题,但我还没有找到解决方案。

我正在尝试通过 PDO 将 PHP 与我的数据库 (mysql) 连接起来。如果我输入错误的用户名或密码,php 会在浏览器中显示错误,但如果我输入错误的数据库名称,它不会退出任何错误。这怎么可能?我的代码如下:

<?php
try
    $conn = new PDO('mysql:127.0.0.1;dbname=myDb','root','root');
    $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 catch(PDOexception $e)
    echo 'wrong credentials';

我的 php.ini 文件被配置为显示错误,并且在使用以下值对其进行修改后重新启动了 Apache:

error_reporting  =  E_ALL | E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On

我还尝试在脚本开头使用以下代码,但它仍然没有显示与错误数据库名称相关的错误

ini_set('display_errors', 1);
error_reporting(~0);

非常感谢您的帮助,我敢肯定这可能是一件非常愚蠢的事情,但老实说我无法弄清楚。

【问题讨论】:

$conn-&gt;errorInfo() 告诉你什么? 您是否尝试过查看 Apache 错误日志? @RyanVincent 请继续发布这个作为答案。 【参考方案1】:

这变成了一个很难找到和解释的错误,尽管它很简单。

问题是 dsn 字符串不正确。

当前值:'mysql:127.0.0.1;dbname=myDb'

应该是:'mysql:host=127.0.0.1;dbname=myDB' 注意:host= 不见了。

但是,PDO 没有正确验证 dsn 参数字符串,并且连接到 Localhost 数据库没有任何错误

但是,它忽略了 dbname 参数,因此当您尝试查询时,您会收到以下错误:1046 No database selected' em>。

澄清正在发生的事情(参见下面的 Alfredo Delgado): PDO 完全忽略了格式错误的参数,并假设 Localhost 数据库是您想要的。 ;-/

正如阿尔弗雷多·德尔加多所说:

...“在 dsn 中没有 host= 的结果是 PDO 默默地默认为 localhost。由于我碰巧有数据库的本地副本,所以我浪费了几个小时来追逐诸如权限之类的红鲱鱼。”

【讨论】:

这也与 PDO 的“其他问题”有关“PDO::ATTR_EMULATE_PREPARES, false”。它阻止了某些版本的 PHP 和 PDO 引发的异常。我需要检查以后的版本。 see 我今天遇到了这个问题。在 dsn 中没有 host= 的结果是 PDO 默默默认为 localhost。由于我碰巧有数据库的本地副本,因此我浪费了数小时来寻找权限之类的红鲱鱼。 @AlfredoDelgado,我很同情你。 ;-/ 由于错误报告不正确,它确实是一个惊人的“时间汇”,试图找出并解释实际错误。 .更新了答案。 @RyanVincent,是的,我确实有“空格”,但是在 PHP 编程中的那些特定位置是否考虑了空格? @RyanViçeñte,哦,是的,我可以从 PHPMyAdmin 访问数据库!

以上是关于尝试使用 PDO 连接到错误的数据库时 PHP 不显示错误的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP 连接到 Sybase

无法使用 pdo 连接到 mysql

WAMP:尝试连接到 mysql 时“不知道这样的主机”

通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库

使用 PDO 连接到 Sybase 的正确 DSN

无法通过 PDO 连接到 AWS RDS