2011-08-09 73 views
0

真的停留在某種東西上。我試圖更新數據庫,並且代碼看起來是寫的 - 如果我將它直接粘貼到phpMyAdmin中,它會很好地工作 - 但代碼本身不起作用......我花了一天的時間嘗試弄清楚爲什麼它不工作,我完全沒了主意......sql語句在phpMyAdmin中工作,但不會在mysql_query中工作

function restoreSession() 
{ 

mysql_connect("theHost", "root", "rootPWD") or die(mysql_error()); 
mysql_select_db("myDatabase") or die(mysql_error());  

$restore_cmd = 'UPDATE wp_dor_cart66_sessions SET user_data = (SELECT user_data FROM wp_dor_cart66_stored_sessions WHERE ip_address = "' . $_SERVER['REMOTE_ADDR'] . '")'; 

$clean_up = "DELETE FROM `wp_dor_cart66_sessions` WHERE `ip_address` = \"" . $_SERVER['REMOTE_ADDR'] . "\" AND id NOT IN (SELECT id FROM (SELECT id FROM `wp_dor_cart66_sessions` ORDER BY id DESC LIMIT 1) user_data)"; 

mysql_query($clean_up) or die('Query failed: ' . mysql_error()); 
$result = mysql_query($restore_cmd) or die('Query failed: ' . mysql_error()); 
echo "<br/>"; 
echo $restore_cmd; 
echo "<br/>"; 
var_dump($result); 
echo "<br/>"; 
print_r($result); 
} 

輸出結果是這樣的:

UPDATE wp_dor_cart66_sessions SET user_data = 
(SELECT user_data FROM wp_dor_cart66_stored_sessions 
WHERE ip_address = "196.54.110.24"); 

bool(true) 

1 

它不會出現任何錯誤 - 但我只是無法讓它更新。如果它在phpMyAdmin中不起作用 - 我會知道SQL有什麼問題 - 但它看起來是正確的...我真的沒有想法 - 任何幫助將不勝感激!


這裏有一些格式的語句再次:

$restore_cmd = ' 
    UPDATE 
     wp_dor_cart66_sessions 
    SET 
     user_data = (
      SELECT 
       user_data 
      FROM 
       wp_dor_cart66_stored_sessions 
      WHERE 
       ip_address = "' . $_SERVER['REMOTE_ADDR'] . '" 
     ) 
'; 

$clean_up = " 
    DELETE FROM 
     `wp_dor_cart66_sessions` 
    WHERE 
     `ip_address` = \"" . $_SERVER['REMOTE_ADDR'] . "\" 
     AND id NOT IN (
      SELECT 
       id 
      FROM 
       (
        SELECT 
         id 
        FROM 
         `wp_dor_cart66_sessions` 
        ORDER BY 
         id DESC 
        LIMIT 
         1 
       ) user_data 
     ) 
"; 
+0

可能只是我(今天很喜歡)但第二個查詢(DELETE ... NOT IN ...)應該如何工作? – VolkerK

+0

謝謝!該格式更容易閱讀。刪除語句的工作方式是選擇具有特定IP地址的所有會話,然後刪除所有不在選區中的所有會話 - 選擇限制爲1.因此,刪除除最近記錄以外的所有內容。 。我已經測試了刪除了幾次,它的工作到目前爲止... – Brendan

+0

但不應該內部選擇以某種方式與IP地址相關(即選擇組的最大值ip = remote_addr)?現在不是,它總是選擇wp_dor_cart66_sessions中_all_記錄的最高ID。 – VolkerK

回答

0
$restore_cmd = 'UPDATE wp_dor_cart66_sessions SET user_data = (SELECT user_data FROM wp_dor_cart66_stored_sessions WHERE ip_address = \"' . $_SERVER['REMOTE_ADDR'] . '\")'; 

需要躲避引號

+0

我之前嘗試過......添加斜槓使得它出錯......我儘可能地嘗試了每一個我能想到的組合,只要引號和轉義字符去......沒有任何作品 - 儘管如此。 .. – Brendan

0

貌似報價錯誤,試試這個:

"UPDATE wp_dor_cart66_sessions SET user_data = (SELECT user_data FROM wp_dor_cart66_stored_sessions WHERE ip_address = '" . $_SERVER['REMOTE_ADDR'] . "')";
+0

好的建議 - 但結果相同。它工作到目前爲止,它沒有錯誤,但在數據庫中沒有更新......我將echo'd結果粘貼到phpMyAdmin中,但它沒有問題,但是......這就是爲什麼這是一個謎。 .. – Brendan

+0

$ _SERVER ['REMOTE_ADDR']是否會返回您所期望的內容? –

+0

是的 - 它正在返回我期待的。我最終通過簡化sql命令來實現這個工作 - 如上所述 - – Brendan

0

如果可能是你在您的SELECT中有多個結果。 如果你這樣做......

$restore_cmd = 'UPDATE wp_dor_cart66_sessions SET user_data = (SELECT user_data FROM wp_dor_cart66_stored_sessions WHERE ip_address = "' . $_SERVER['REMOTE_ADDR'] . '" LIMIT 1)'; 

...注意LIMIT 1

+0

有趣的建議...儘管應該永遠不會有多於一個結果 - 因爲之前的查詢會刪除除最新行之外的所有行。我試過了,但不幸的是,結果相同 - 什麼都沒發生...... – Brendan

0

你肯定第一個查詢是不是刪除所有匹配的行?

我不明白第一個查詢結束時的「user_data」部分。但是我會在每次查詢後檢查受影響的行數,以查看查詢是否對數據產生任何影響,如果是這樣,它執行得好還是隻有一些邏輯錯誤。

+0

這是一個有趣的想法,但我非常確定情況並非如此。我之前已刪除了刪除行 - 以確保沒有任何內容被刪除 - 但它仍然無效。 – Brendan

相關問題