2014-04-07 32 views
-1

我已經嘗試了幾乎所有我知道的東西,但無法解決這個相當奇怪的一組錯誤。mysql INSERTs背靠背隨機失敗

我想在消息隊列表中做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」: 「112」, 「end_sms_alert」: 「112」}

的問題是:

  1. 首屆插入總是能夠插入ID 0
  2. 的2nd插入總是失敗,但ID是自動增加的
  3. 正在發生第3個和第4個插入,但所使用的ID是第2步的ID,因此它們被有效覆蓋。
  4. 由於我無法弄清楚的原因,alert_type在數據庫中始終顯示1。雖然我直接插入2,3。

有人可以幫我解決這個問題嗎?

+2

誰能遵循這一點,是上帝。 –

+0

@ Fred-ii-我很抱歉,我應該更多地解釋代碼嗎? – rednivlat

+1

從一開始就開始,因爲第一個auto_increment值是'1',而不是'0'。 'mysql_insert_id()''0'的響應是錯誤的。 –

回答

1

經過兩次downvoted和收藏一次後,我很困惑,代碼有什麼問題。感謝@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周後),所以對於明顯的錯誤表示歉意。

謝謝大家