2011-08-09 24 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

私はちょうど今日(かなり好きですが)かもしれませんが、2番目のクエリ(DELETE ... NOT IN ...)はどのように動作するはずですか? – VolkerK

+0

ありがとう!その書式ははるかに読みやすくなります。 deleteステートメントの仕組みは、特定の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

関連する問題