mysql INSERTs背靠背随机失败

时间:2014-04-07 18:40:56

标签: php mysql sql-insert

我已经尝试了几乎所有我知道但却无法解决这个奇怪的错误集。

我正在尝试在消息队列表中生成4个INSERT。

$ email_start_message,$ sms_start_message,$ email_end_message和$ sms_end_message是存储为blob的字符串,因为将来他们将拥有HTML和图像。

代码如下:

$response = array();

$send_status = 0;

$seller_id = 1275;

$re1 = mysql_query("INSERT INTO pos_msg_que(send_status, sid, uid, alert_type, alert_data, send_time) VALUES ('$send_status','$seller_id','$uid','1','mysql_real_escape_string($email_start_message)','$start_time');");

if (!$re1 == 'false') {
  $response['start_email_alert'] =  '1';
} else {
  $response['start_email_alert'] =  '0';
}

$re2 = mysql_query("INSERT INTO pos_msg_que(send_status, sid, uid, alert_type, alert_data, send_time) VALUES ('$send_status','$seller_id','$uid','2','mysql_real_escape_string($sms_start_message)','$start_time');");

if (!$re2 == 'false') {
  $response['start_sms_alert'] =  '1';
} else {
  $response['start_sms_alert'] =  '0';
}

$re3 = mysql_query("INSERT INTO pos_msg_que(send_status, sid, uid, alert_type, alert_data, send_time) VALUES ('$send_status','$seller_id','$uid','3','mysql_real_escape_string($email_end_message)','$end_time');");

if (!$re3 == 'false') {
  $response['end_email_alert'] =  '1';
} else {
  $response['end_email_alert'] =  '0';
}

$re4 = mysql_query("INSERT INTO pos_msg_que(send_status, sid, uid, alert_type, alert_data, send_time) VALUES ('$send_status','$seller_id',  '$uid','4','mysql_real_escape_string($sms_end_message)','$end_time');");

if (!$re4 == 'false') {
  $response['end_sms_alert'] =  '1';
} else {
  $response['end_sms_alert'] =  '0';
}
echo json_encode($response);

}

表结构是:

+-----------------+------------+------+-----+-------------------+-----------------------------+
| Field           | Type       | Null | Key | Default           | Extra                       |
+-----------------+------------+------+-----+-------------------+-----------------------------+
| id              | int(8)     | NO   | PRI | NULL              | auto_increment              |
| send_status     | int(11)    | NO   |     | NULL              |                             |
| sid             | int(8)     | NO   |     | NULL              |                             |
| uid             | int(8)     | NO   |     | NULL              |                             |
| alert_type      | tinyint(2) | NO   |     | NULL              |                             |
| alert_data      | blob       | NO   |     | NULL              |                             |
| send_time       | datetime   | NO   |     | NULL              |                             |
| advance_time    | int(3)     | NO   |     | NULL              |                             |
| last_attempt_at | timestamp  | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-----------------+------------+------+-----+-------------------+-----------------------------+

现在,当我运行此代码时,JSON响应为:

  

{" start_email_alert":" 1 0"," start_sms_alert":" 0   12"," end_email_alert":" 1 12"," end_sms_alert":" 1 12"}

问题是:

  1. 第一个插入始终获取插入ID 0
  2. 第二个插入始终失败,但ID是自动增加的
  3. 第3次和第4次插入正在进行,但使用的ID是步骤2,因此有效地覆盖。
  4. 由于我无法弄清楚的原因,alert_type始终在DB中显示1。虽然我在字面上插入2,3。
  5. 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

在被投票两次并被收藏一次后,我对代码的错误感到困惑。感谢@AirThomas和@Jasper,我格式化了代码并采用了一些最佳实践,这帮助我解决了这个问题。

问题在于字符串。他们有单引号,并且不知何故没有逃脱(主要是由于一些奇怪的字符编码问题。我没有费心去了解细节)。而是使用(phpfreaks)中的一个简单函数来确保,我在逃避时不会遗忘任何石头。功能是:

function cleanStr($str){
  $str = trim($str);
  if($str == "") return;

  $str = stripslashes($str);//STRIP \ slashes
  if (function_exists(mysqli_real_escape_string)){
    $str = mysqli_real_escape_string($str);
  }else{
    $str = mysql_real_escape_string($str);
  }
  //CONVERT TO HTML
  $str = htmlspecialchars($str);
  //LAST CLEAN UP
  $str = preg_replace("#\'#","",$str);
  return $str;
}

在转义字符串并参数化代码(编辑问题以显示最新代码)后,插入工作就像一个魅力。

我今天学到的东西:

  • 正确转义字符串,而不仅仅是mysql_real_escape_string
  • 像这样使用mysql_error()来捕获mysql错误。
  

echo mysql_errno()。 “:”。 mysql_error()。 “\ n” 个;

  • 格式化查询并尽可能参数化
  • 在发布SO之前正确格式化代码,否则你甚至
  • 使用PDO或mysqli

我刚刚开始编码(4周后),所以对明显的错误道歉。

谢谢大家