【问题标题】:PHP PDO - Multiple Inserts in one PDO Prepare doesn't catch errorsPHP PDO - 一个 PDO Prepare 中的多个插入不会捕获错误
【发布时间】:2013-04-22 19:57:52
【问题描述】:

我在一个 PDO 准备语句中传递多个 INSERT 语句并且执行工作;但是,如果任何插入失败,则 execute() 始终返回 TRUE,并且永远不会调用 catch()。

$query = '
INSERT INTO resources SET
    resource_type_id = :audio_resource_type_id
    , resource_status_id = :resource_status_id
    , is_hosted = :is_hosted
    , category_id = :category_id
    , serve_url = :audio_serve_url
    , title = :title;

SET @audio_id = LAST_INSERT_ID();

INSERT INTO resources SET
    resource_type_id = :thumbnail_resource_type_id
    , resource_status_id = :resource_status_id
    , category_id = :category_id
    , serve_url = :thumbnail_serve_url
    , parent_resource_id = @audio_id;';

if ($audio_duration) {
    $query .= '     
    INSERT INTO audio_duration SET
    audio_id = @audio_id
    , duration_seconds = :audio_duration';
}

try {
    $sth = $dbi->dbh->prepare($query);
    $sth->bindParam('audio_resource_type_id', $this->resource_types['audio']);
    $sth->bindParam('thumbnail_resource_type_id', $this->resource_types['THUMBNAIL']);
    $sth->bindParam('resource_status_id', $resource_status_id);
    $sth->bindParam('category_id', $this->category_id);
    $sth->bindParam('audio_serve_url', $audio_serve_url);
    $sth->bindParam('thumbnail_serve_url', $thumbnail_serve_url);
    $sth->bindParam('title', $title);
    $sth->bindParam('audio_duration', $audio_duration);

    $sth->execute();

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage();
    log($e->getMessage());
    alert($e->getMessage());
    return FALSE;
}

感谢您对此的任何想法。

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

只是想指出这一点..

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

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

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

【讨论】:

  • 我在创建数据库连接时设置了 ERRMODE_EXCEPTION。甚至 execute() 的 $return 也返回 TRUE;但是当我查看 MYSQL 日志时,我可以看到查询失败。我正在使用一个数据库类,并且错误被其他查询捕获,只是这个有多个插入让我很伤心。
  • 有什么理由在 1 个语句中运行所有查询?
  • 高流量站点,我正在尝试减少与数据库通信的次数。
  • @Kate 这个数量与真正缓慢的事情相比毫无意义。
  • 如果只通过几次,我会同意;但是,如果它每小时通过几千次怎么办,另外,请记住还有其他查询。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 2011-08-21
  • 2011-11-23
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多