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

相关问题