-2

1 つの 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;
}

これについてご意見をお寄せいただきありがとうございます。

4

1 に答える 1

0

これを指摘したいだけ..

PDO がサイレントに失敗するのを防ぐために、PDO 接続でエラー モードを設定できます。

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

PDO::ERRMODE_WARNINGエラーが必要な場合もありますが、それでも続行します。

于 2013-04-22T20:03:17.263 に答える