我[终于]正在学习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
。这意味着无法执行最后一个查询,但这并没有多大帮助,因为它可能是以前发生的问题。
Configuration类返回正确的值。它之前使用的是mysql,我测试了它是否返回了正确的值(确实如此)。
我在000webhost.com免费帐户。从this forum post和this other开始,这里的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);
你能看出我做错了什么吗?如果没有,你能否至少指点我继续测试它?我主要(但不仅仅)this tutorial。非常感谢你。
答案 0 :(得分: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块),并希望有人遇到类似错误的问题会解决这个问题。