PHP脚本,用于在维护键关系的同时插入解析的电子邮件数据
我目前正在完成一个PHP脚本,该脚本解析电子邮件并将其插入到数据库表中- 用户表PHP脚本,用于在维护键关系的同时插入解析的电子邮件数据,php,mysql,sql,email-parsing,Php,Mysql,Sql,Email Parsing,我目前正在完成一个PHP脚本,该脚本解析电子邮件并将其插入到数据库表中- 用户表 userId-int-auto_increment-PK 电子邮件-varchar 电子邮件表 emailId-int-auto_increment-PK userId-int-FK attachmentId-int-FK body-varchar 主题-varchar 附件表 attachmentId-int-auto_increment-PK 附件名称-varchar 文件类型-varchar 内容-
- userId-int-auto_increment-PK
- 电子邮件-varchar
- emailId-int-auto_increment-PK
- userId-int-FK
- attachmentId-int-FK
- body-varchar
- 主题-varchar
- attachmentId-int-auto_increment-PK
- 附件名称-varchar
- 文件类型-varchar
- 内容-mediumblob
- 代码-varchar
INSERT INTO users (email) values ('$emailFrom');
INSERT INTO emails (subject, body) values ('$subject', '$body');
INSERT INTO attachments (attachmentName, fileType, content, code) values ('$attachmentName', '$fileType', '$content', '$code');
但后来我意识到这不能处理电子邮件表中的FK关系。单独执行每个查询的最佳方法是重新查询生成的Id,然后将新Id放在相关的FK行中吗?对不起,我不清楚
将其合并到一个表中并避免此问题会有任何缺点吗?首先检查users表中是否存在$emailFrom,将userid转换为$userid。 如果它不存在,则插入它并将新的userid获取到$userid中 然后插入附件并以$attachmentid获取新的attachmentid存储 最后,在电子邮件中插入:
INSERT INTO emails (userid, attachmentid, subject, body)
values ($userid, $attachmentId, '$subject', '$body');
然后您的外键将被正确设置。我建议使用事务,确保插入的全部内容被视为原子(一个插入)。如果其中一个查询失败,您的数据不会最终处于错误状态,这将保护您的数据 您的代码没有避开您正在使用的API类型(mysql、mysqli、pdo),但我将给出一个使用pdo的代码片段(未测试):
您可以使用以下链接阅读有关代码段中使用的API调用的更多信息:
很抱歉,我花了这么长时间才回复您。是的,这有助于我启动并运行它。谢谢你花时间回答这个问题!
<?php
try {
$dbo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt1 = $dbo->prepare('INSERT INTO users SET email = :email');
$stmt2 = $dbo->prepare('INSERT INTO attachments SET attachment_name = :attachmentName, file_type = :fileType');
$stmt3 = $dbo->prepare('INSERT INTO emails SET set user_id = :userId, subject = :subject, body = :body, attachment_id = :attachmentId');
try {
$dbo->beginTransaction();
$stmt1->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->execute();
$userId = $dbo->lastInsertId();
$stmt2->bindParam(':attachmentName', $attachmentName, PDO::PARAM_STR);
$stmt2->bindParam(':fileType', $fileType, PDO::PARAM_STR);
$stmt2->execute();
$attachmentId = $dbo->lastInsertId();
$stmt3->bindParam(':userId', $userId, PDO::PARAM_INT);
$stmt3->bindParam(':subject', $subject, PDO::PARAM_STR);
$stmt3->bindParam(':body', $body, PDO::PARAM_STR);
$stmt3->bindParam(':attachmentId', $attachmentId, PDO::PARAM_INT);
$stmt3->execute();
$dbo->commit();
} catch(Exception $e) {
$dbo->rollback();
error_log($e->getMessage());
}
} catch(Exception $e) {
error_log($e->getMessage());
}