1

私は次のPHPスクリプトを持っています。これはうまく実行され、PDOトランザクションを正しく使用してすべてのデータをMySQLに挿入しますが、最初の実行時のみです。最初の実行後、同じデータをもう一度挿入してみます。次に、フィールドの属性が。を介して作成される新しい値を停止しているため、最初の値はlastInsertId0を返し始めます。unique keyemailuserIdauto_increment

同様の回答を読んだ後でも、この状況をチェックして問題を修正する方法についてはまだ行き詰まっています。の値がすでにデータベースにあるメールアドレス$userCheckの値と$fromParsed一致するかどうかを確認できるように作成しました。userIdこのクエリの値を取得してスクリプトを編集し、ユーザーが同じメールアドレスで既にそこにいる場合はのを取得し、まだそこにない$fromParsed場合$fromParsedは挿入する方法がわかりません。lastInsertId();を取得するために使用を続けuserIdます。

私はこれに対する答えを探してみましたが、PDOトランザクションを含む同様の状況に対する明確な答えを私に与えるものは何も見つかりませんでした。

これに対する答えがやみくもに明白であるならば、申し訳ありません。

try {

    $con = new PDO('mysql:host=localhost;dbname=db', 'root', 'password');

    $attachmentsQuery = $con->prepare('INSERT INTO attachments SET attachmentName = :attachmentName, content = :content, fileType = :fileType');
    $usersQuery = $con->prepare('INSERT INTO users SET email = :email');
    $emailsQuery = $con->prepare('INSERT INTO emails SET userId = :userId, subject = :subject, body = :body, attachmentId = :attachmentId');
    $userCheck = $con->prepare("SELECT userId FROM users WHERE email = '$fromParsed'");

    try {
        $con->beginTransaction();

        $userCheck->execute();
        //Something here?

        $usersQuery->bindParam(':email', $fromParsed, PDO::PARAM_STR);
        $usersQuery->execute();

        $userId = $con->lastInsertId();

        $attachmentsQuery->bindParam(':attachmentName', $filename, PDO::PARAM_STR);
        $attachmentsQuery->bindParam(':fileType', $fileType, PDO::PARAM_STR);
        $attachmentsQuery->bindParam(':content', $content, PDO::PARAM_LOB);
        $attachmentsQuery->execute();

        $attachmentId = $con->lastInsertId();

        $emailsQuery->bindParam(':userId', $userId, PDO::PARAM_INT);
        $emailsQuery->bindParam(':attachmentId', $attachmentId, PDO::PARAM_INT);
        $emailsQuery->bindParam(':subject', $subject, PDO::PARAM_STR);
        $emailsQuery->bindParam(':body', $text, PDO::PARAM_STR);
        $emailsQuery->execute();

        $con->commit();

        } catch(Exception $e) {
                $dbo->rollback();
                die();
        }
} catch(Exception $e) {
        error_log($e->getMessage());
}
4

1 に答える 1

1

これを試してみてください。

if($userCheck->execute() && $userCheck->rowCount() > 0){
    // we have a user.
    $data = $userCheck->fetch(PDO::FETCH_ASSOC);
    $userId = $data['userId'];
}
else {

    $usersQuery->bindParam(':email', $fromParsed, PDO::PARAM_STR);
    $usersQuery->execute();

    $userId = $con->lastInsertId();
}
//Something here?

簡単に説明すると、rowCount によって指定されたレコードがある場合、これは $userQuery からの結果を $data に配置します。クエリが結果を返さない場合、引き続き $userQuery を実行し、新しく作成されたエントリの userId を返します。

于 2012-04-23T19:56:16.867 に答える