【问题标题】:Cannot do $STH->execute() with PDO不能用 PDO 做 $STH->execute()
【发布时间】:2012-11-14 14:35:50
【问题描述】:

我 [终于] 正在学习 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 postthis 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。非常感谢。

【问题讨论】:

  • 你从var_dump($STH->ErrorInfo())得到什么?您需要在执行后运行它,因此您需要暂时删除 die() 调用。
  • 多亏了这个我解决了。显然,以前的 mysql 代码不能正常工作,但没有对其进行足够的测试(仅一次)。只需将“auto_increment”添加到 id 值即可,一切正常。它返回了 id 的重复键(加上一个错字)。
  • 我愿意,但这不是答案。您应该发布自己的解决方案作为答案,并尽可能接受。
  • 好的,不过对我来说这是一个有效的解决方案,因为我指定了can you at least point me in some direction to keep testing it?

标签: php insert pdo


【解决方案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 块),并希望遇到类似错误的人能用这个答案解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多