3

行が以前に存在しなかった場合に行を挿入するように設計された準備済みステートメントがあります。1 行だけを実行する場合は問題なく動作します。2 つある場合は、最初の行が追加され、2 番目の行は無視されます。最初の行が存在し、2 番目の行が存在しない場合、2 番目の行が追加され、後続のすべての行が失敗します。

事実上、挿入は一度だけ機能し、あたかも IF NOT EXISTS が新しいパラメーターのバインディングを更新しないかのようです。

サンプルコードは次のとおりです。

$dbConn = 'mssql:host=' . $server . ';dbname=' . $base;
$dbh = new PDO( $dbConn, $user, $pass);

// Go through each course code and add it
// Ignore if it already exists
$stmt = $dbh->prepare('IF NOT EXISTS (SELECT * FROM _ExamCoursesTEMP 
                       WHERE ExamCourseCode = :examCode AND CourseCode = :courseCode )
                       BEGIN
                             INSERT INTO _ExamCoursesTEMP ( ExamCourseCode, CourseCode ) VALUES ( :examCode2, :courseCode2 )
                       END');

$counter = 0;

foreach( $courseCodes as $courseCode )
{
    $stmt->bindParam(':examCode', $examCode );
    $stmt->bindParam(':courseCode', $courseCode );
    $stmt->bindParam(':examCode2', $examCode );
    $stmt->bindParam(':courseCode2', $courseCode );

    $updateCount = $stmt->execute();

    $counter++;
}

最初の updateCount は 1 を返し、残りはすべて空です。

これが私のコードの問題なのか、PDO を介した準備済みステートメントのバインディングなのか、mssql の癖なのかはわかりません。

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

0

への 2 番目のパラメーターbindParamは、参照によって渡されます。したがって、パラメーターを変数に 1 回バインドするだけで済み、ループ内で同じ変数に割り当てられた値を変更できます。

于 2013-03-20T04:09:11.270 に答える