我正在尝试在我的主机上设置一个新站点(主机路由,如果它很重要)但我在尝试使用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');
如何布置数据库:
我可以在我的其他子域/主站点上使用mysqli connect fine,但我无法让PDO工作。
我试过这个,我已经看过了:
$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1');
但它返回了语法错误。
任何人都知道造成这种情况的原因是什么?
这一切都在我的本地服务器上运行,除连接线外,上传时没有任何变化。
答案 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上)遗漏了host
或dbname
,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}},否则您可能会公开您的登录凭据。