私は次のPHPスクリプトを持っています。これはうまく実行され、PDOトランザクションを正しく使用してすべてのデータをMySQLに挿入しますが、最初の実行時のみです。最初の実行後、同じデータをもう一度挿入してみます。次に、フィールドの属性が。を介して作成される新しい値を停止しているため、最初の値はlastInsertId
0を返し始めます。unique key
email
userId
auto_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());
}