我真的希望你能帮忙!
我使用以下函数在我的PHP / MySql应用程序中发送消息:
public function sendMail($sender_id, $recipient_id, $subject, $message) {
$q = "INSERT INTO MAIL_MESSAGE (subject, message, date) VALUES ('$subject', '$message', NOW() )";
$s = mysql_query($q);
if (mysql_affected_rows()==1) {
$message_id = mysql_insert_id();
$q = "INSERT INTO MAIL (user_id, sender, message_id) VALUES ('$recipient_id','$sender_id','$message_id')";
$s = mysql_query($q);
if (mysql_affected_rows()==1)
return true;
}
return false;
}
我使用两个表(MAIL_MESSAGE和MAIL),因为'$ sender_id'可以向多个'$ recipient_id'发送相同的消息。
现在问题是,如果最后一个查询失败,我在MAIL_MESSAGE中有一行没有MAIL中的对应行。 我该如何解决这个问题?
交易可以提供帮助,但我不知道如何让它发挥作用!
提前感谢您的帮助。
答案 0 :(得分:1)
在序列开头添加“begin”以启动事务。仅在两个插入成功时提交事务,否则回滚事务。
我不了解PHP,但根据您的示例,它看起来如下所示:
public function sendMail($sender_id, $recipient_id, $subject, $message) {
$s = mysql_query("begin");
$q = "INSERT INTO MAIL_MESSAGE (subject, message, date) VALUES ('$subject', '$message', NOW() )";
$s = mysql_query($q);
if (mysql_affected_rows()==1) {
$message_id = mysql_insert_id();
$q = "INSERT INTO MAIL (user_id, sender, message_id) VALUES ('$recipient_id','$sender_id','$message_id')";
$s = mysql_query($q);
if (mysql_affected_rows()==1) {
$s = mysql_query("commit");
return true;
}
$s = mysql_query( "rollback" );
return false;
}