0

我[终于]在学习 PDO,过去一个小时我一直在处理一个我似乎无法解决的问题。我有这个代码:

//Simple script that connects to mysql and database.
$db = new PDO ("mysql:host=".Configuration::get('MysqlServername').";dbname=".Configuration::get('MysqlDatabase').";charset=UTF-8",
          Configuration::get('MysqlUsername'),
          Configuration::get('MysqlPassword')) or die ("Error connecting");

// To test why it doesn't work
$STH = $db->prepare("INSERT INTO htranslations (keyword, en, page, last) VALUES (?, ?, ?, NOW())") or die ("Error preparing");
$STH->bindValue(1, "New_test", PDO::PARAM_STR) or die ("Error binding 1");
$STH->bindValue(2, "New test", PDO::PARAM_STR) or die ("Error binding 2");
$STH->bindValue(3, $_SERVER['PHP_SELF'], PDO::PARAM_STR) or die ("Error binding 3");
$STH->execute() or die ("Error executing");

注意:这些or die设置仅作为临时措施来测试错误的来源。这段代码根本不起作用,我不知道为什么。现在,我尝试过:

  • 做的时候var_dump($db);,我object(PDO)#1 (0) { }打开我的浏览器。我想这不是它应该是的,但我不知道,在网上找不到太多。未执行的or die语句让我认为这可能是正确的。

  • 显示的错误是Error executing。这意味着无法执行最后一个查询,但这并没有多大帮助,因为它可能是以前出现的问题。

  • 配置类返回正确的值。它以前与 mysql 一起工作,我对其进行了测试以查看它是否返回了正确的值(确实如此)。

  • 我在 000webhost.com 免费帐户。从这个论坛帖子其他帖子来看,这里的 PDO 应该没有任何问题。此外,print_r(PDO::getAvailableDrivers());返回 mysql、sqlite 和 sqlite2。

  • 反过来,在 execute() 语句的数组中插入值也不起作用。

以前工作的 mysql_* 代码是(之前已转义):

 $sql="INSERT INTO htranslations (keyword, en, page, last) VALUES ('$Id', '$Text', '".$_SERVER['PHP_SELF']."', now())";
 mysql_query($sql);

你能看出我做错了什么吗?如果没有,你至少能给我指出一些方向来继续测试它吗?我主要(但不仅)遵循本教程。非常感谢。

4

1 回答 1

1

感谢用户 andrewsi,我可以解决我的问题。

基本上,我不知道在哪里寻找错误,所以我运行这段代码var_dump($STH->ErrorInfo());来找出问题所在,然后修复它。我的结果代码是:

//Simple script that connects to mysql and database.
$db = new PDO ("mysql:host=".Configuration::get('MysqlServername').";dbname=".Configuration::get('MysqlDatabase').";charset=UTF-8",
          Configuration::get('MysqlUsername'),
          Configuration::get('MysqlPassword')) or die ("Error connecting");

// To test why it doesn't work
$STH = $db->prepare("INSERT INTO htranslations (keyword, en, page, last) VALUES (?, ?, ?, NOW())");
$STH->execute(array("New_test","New test",$_SERVER['PHP_SELF']));
var_dump($STH->ErrorInfo());

它返回了一个重复的键,那时我意识到(曾经)与旧 mysql_* 一起工作的代码在这里不起作用,只是因为数据库中的一个错误。

但是我学会了如何以 PDO 方式检查错误(好吧,仍然需要 try/catch 块),并希望遇到类似错误的人能用这个答案解决这个问题。

于 2012-11-18T15:56:19.713 回答