php / mysql - PDO准备插入,不起作用,并且没有错误消息

时间:2010-03-25 18:34:24

标签: php mysql insert pdo prepared-statement

我现在真的不知道该怎么做,我已经盯着它好几个小时了,并且要求它......我无法让它工作!。

require_once("Abstracts/DBManager.php");
require_once("UI/UI.Package.php");
class BlogDBM extends DBManager
{
     private $table = "blog_records";
     function saveRecord($title,$url,$desc,$feedId,$pubDate)
     {
      $PDO = $this->db->connect();
      try
  {

   $query = $PDO->prepare("
    INSERT INTO ".$this->table."
    (title,url,desc,feed_id,pubdate) VALUES
    (:title,:url,:desc,:feed_id,:pubdate)");
   $query->bindParam(":title", $title);
   $query->bindParam(":url", $url);
   $query->bindParam(":desc", $desc);
   $query->bindParam(":feed_id", $feedId, PDO::PARAM_INT);
   $query->bindParam(":pubdate", $pubDate, PDO::PARAM_INT);
   $query->execute();
   //return $PDO->lastInsertId();


  } catch(PDOException $e)
  {
   echo "Error " . $e->getMessage();

  }
  $PDO = NULL;
     }
}

6 个答案:

答案 0 :(得分:39)

只是想补充一点,因缺少错误信息而遭遇类似的挫折。

要阻止PDO静默失败,可以在PDO连接上设置错误模式。

$dbh = new PDO();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

如果你想要错误但仍然继续,还有PDO::ERRMODE_WARNING

答案 1 :(得分:17)

我很确定MySQL在desc字段名称上窒息 - 它是reserved word。您必须将其放入“引号”中,或者更好地更改字段名称。

对于错误报告,请使用errorInfo方法。您可以让PDO在异常中实际输出失败查询的结果,但默认行为 - 我认为 - 只有在根本无法进行查询时才会抛出异常,但如果查询不会失败是错误的。

答案 2 :(得分:4)

我也面临着这个错误。

我使用了print_r($con->errorInfo());,它在数组的0000键中提供了0th

然后我匹配所有列名,并发现我使用了错误的字段名称。

This节省了我的一天。

答案 3 :(得分:3)

PDOStatement::bindValue()PDO::PARAM_BOOL一起使用时也会发生这种情况。解决方案:只需切换到PDO::PARAM_INT

答案 4 :(得分:0)

当有人在主id字段上关闭/离开DB自动增量时,可能会出现类似的问题。

答案 5 :(得分:-1)

本周,我对这个无声插入失败感到挣扎。这是适合我的解决方案。我没有在事务上调用commit,因此插入被置于挂起状态但从未在数据库上完成 - 因此没有错误。这很棘手,因为这个项目中的PDR db包装器是一个静态类,所以它不会自动关闭

解决方案:确保在插入/更新/删除操作后或在页面关闭时调用PDO句柄上的提交。

$PDO->exec("COMMIT;");