我有以下 PHP 脚本,它运行良好,并正确使用 PDO 事务将所有数据插入 MySQL,但仅在第一次运行时。初次运行后,我尝试再次插入相同的数据。然后第一个lastInsertId
开始返回 0,因为该unique key
字段上的属性email
正在停止userId
通过创建新值auto_increment
。
在阅读了类似的答案后,我仍然不知道如何检查这种情况并解决问题。我写了这个$userCheck
,以便我可以查看 from 的值是否$fromParsed
与数据库中已经存在的电子邮件地址相匹配。我不知道如何获取此查询的值,然后编辑脚本,以便如果用户已经在那里使用相同的电子邮件地址,那么它会获取userId
of $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());
}