PHP PDO:无法连接,无效的目录名称

时间:2013-08-28 22:07:45

标签: php mysql sql pdo mysqli

我正在尝试在我的主机上设置一个新站点(主机路由,如果它很重要)但我在尝试使用PDO时遇到此错误(第一个PDO站点即时尝试):

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36

当我使用这些设置时:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

....

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1');

如何布置数据库:

enter image description here

我可以在我的其他子域/主站点上使用mysqli connect fine,但我无法让PDO工作。

我试过这个,我已经看过了:

 $stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1');

但它返回了语法错误。

任何人都知道造成这种情况的原因是什么?


这一切都在我的本地服务器上运行,除连接线外,上传时没有任何变化。

2 个答案:

答案 0 :(得分:12)

而不是:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");

尝试:

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");

(添加 host =

它最有可能在您的本地服务器上运行,因为您有mysql:localhost...mysql:127.0.0.1...并且它被忽略(因为它缺少 host = )并且默认情况下它是本地主机。

答案 1 :(得分:1)

PDO manual page,您可以看到需要将连接包装在try/catch块中。这样,如果连接出现问题,它会告诉你。像这样:

try {
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";

    // Then actually do something about the error
    logError($e->getMessage(), __FILE__, __LINE__);
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__);
    // etc.
    die(); // Comment this out if you want the script to continue execution
}

您收到此错误的原因是因为您的连接出错,但由于您没有告诉脚本停止,因此不会。查看生成的错误消息,如何解决它应该是显而易见的。 Michael Prajsnar的回答似乎是正确的,因为你没有设置“主持人”。

修改

事实证明,如果您在PDO连接DSN部分(至少在Unix上)遗漏了hostdbname,PDO 不会抱怨。我测试了它并将其保留为空白将默认为“localhost”,因此我能够完全连接,完全保留了本地主机连接,这可以解释为什么它在本地服务器上工作但在生产服务器上没有。实际上,除了像这样的数据库引擎之外,完全可以在DSN中连接提供任何内容:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************");

唯一的问题是它不会使用数据库,因此要使用数据库,只需执行:

if ($dbh->query("USE kennyi81_gamersite") === false)) {
     // Handle the error
}

然而,尽管如此,我怀疑您实际上尝试使用try/catch块进行连接(正如您在评论中提到的那样),除非您以某种方式提供了有效的数据库凭据。以这种方式执行此操作的唯一方法是,如果您实际正确连接并选择了数据库kennyi81_gamersite,则不会产生任何类型的错误。如果没有,你会看到这样的消息:

  

无法连接到数据库。 “mysql”说:SQLSTATE [28000] [1045]   用户'kennyi81_gamer'@'localhost'拒绝访问(使用密码:是)

总之,如果要在连接期间查找错误,请始终将您的连接包装在try/catch块中。请确保不要重新抛出(而不是抓住)PDOException的{​​{1}},否则您可能会公开您的登录凭据。