2013-03-21 103 views
1

我有一個查詢,每遇到它,運行兩次,這是不是打算。我已將日誌記錄添加到文件之前和之後,並在運行腳本之前清除文件。INSERT INTO調用一次,但運行兩次(不是在一個循環中)

我不認爲我需要發佈其他代碼,因爲我相信我的日誌記錄證明這個查詢只被調用一次。

代碼:

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt', 
    "\n\nImmediately before ban query 1. ".date('r ')." (1)", 
    FILE_APPEND); 

$sth=$Mdbh->query(" 
    INSERT INTO 
     banned_IP 
    SET 
     ip_add  = '$ip', 
     proxy_ip = '$proxy_ip' 
"); 
$sth->execute(); 

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt', 
    "\n\nBanned the user using query1. ".date('r ')." (2)", 
    FILE_APPEND); 

return 999; 

注意,有立即return它運行得即使它被稱爲兩次之後,我的PDOErrors.txt文件將顯示每個運行的診斷數據,它沒有按」噸。

第一次診斷數據進入PDOErrors.txt運行,但第二次不運行!

這裏的PDOErrors.txt

Immediately before ban query 1. Thu, 21 Mar 2013 13:38:56 +0800 (1) 

exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'ip_add'' in /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper/public/includes/classes/loginAttempt.class.php:137 
Stack trace: 
#0 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/loginAttempt.class.php(137): PDOStatement->execute() 
#1 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/login.class.php(980): loginAttempt->recordLoginAttempt(Array) 
#2 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/ajax/login.user.php(25): Login->doLogin(Array) 
#3 {main} 

副本我要指出,我完全是空的每次運行前的banned_IP數據庫表。

我也記錄所有的查詢,因爲這是一個開發環境和查詢的日誌可以看到下面:

708 Query  INSERT INTO 
         banned_IP 
       SET 
         ip_add   = '127.0.0.1', 
         proxy_ip  = '' 

708 Query  INSERT INTO 
         banned_IP 
       SET 
         ip_add   = '127.0.0.1', 
         proxy_ip  = '' 
708 Quit 

我覺得我滿意的是,查詢纔會被調用一次作爲如果不是,PDOErrors.txt將包含兩組診斷數據。錯誤消息似乎是在空數據庫表的查詢的第一次運行時生成的。有什麼可能導致這個?

+0

我有這樣的事情一旦問題,有我的網頁上的腳本它是基於可見的加載滑塊圖像,每個圖像都有一個新的請求,並且由於我的URL重寫,所有內容都先指向我的'index.php',然後加載。我希望這個提示可以幫助你,因爲我不確定你的系統故障到底是什麼。 – MahanGM 2013-03-21 06:47:57

+0

Thanks @MahanGM,我不確定這是否適用於我的情況根據Firebug,只有一個http請求正在發送,但感謝您的輸入。 – 2013-03-21 07:29:08

+0

我找到了解決方法。數據庫表的'ip_add'被索引爲唯一的,但是當我添加一個帶有自動增量值的'id'列時,突然它不再有錯誤,儘管它仍然輸入了兩次。我認爲必須是MySQL中的一個錯誤,因爲如果腳本不止一次運行,PDOErrors.txt會顯示它。我認爲這種解決方法對我來說已經足夠了,因爲這是一個很少運行的過程。 – 2013-03-21 08:28:14

回答

2

PDO-> query將執行查詢並返回PDOStatement對象,現在您再次執行導致此錯誤的返回的PDOStatement。

使用PDO->準備返回PDOStatement對象對象,然後執行該語句或只是使用PDO->查詢和不執行PDOStatement對象

相關問題