2013-04-03 109 views
0

我已经对此here提出了一个问题。但是因为我没有得到答案,所以帮了我很多,我想再问一次。如何更正此mysql_query,使用正确的语法并使其正常工作?

In Database [1] 
    Table Characters 
+----+------------------+-------+---------+ 
|account_name| lastaccess| online| voted | 
+------------+-----------+-------+--------+ 
| Account1 | 1231321231| 1 | 1 | 
| Account1 | 132312213 | 0 | 0 | 
| Account3 | 13231212 | 0 | 0 | 
+------------+-----------+-------+--------+ 
    In Database [2] 
    Table Accounts 
+----+------------------+ 
| Login | lastIp | 
+-----------+-----------+ 
| Account1 | 0.0.0.0.0 | 
| Account1 | 0.0.0.0.0 | 
| Account3 | 0.0.0.0.0 | 
+-----------+-----------+ 

我已经有一个函数,获取lastIP帐户的位置。

function getclientip() 
    { 
     if (isset($_SERVER["REMOTE_ADDR"])) { 
      return $_SERVER["REMOTE_ADDR"]; 
     } else if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { 
      return $_SERVER["HTTP_X_FORWARDED_FOR"] ; 
     } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { 
      return $_SERVER["HTTP_CLIENT_IP"] ; 
     } 
      return "0.0.0.0"; 
    } 
$Ip=getclientip(); 
$sql='SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\';'; 
echo mysql_error(); 
$result = mysql_query($sql); 
if (false === $result) { 
} 
while($row = mysql_fetch_array($result)) 
{ 

我想要做的是:

mysql_query('update characters SET voted=1 where account_name like \''.$row['login'].'\' and online=1;') ; 

但是,在MIN(lastaccess)只。 我希望你明白我的意思,在其他情况下问我我会更好地解释。

+0

如果您已经问过这个问题,我会建议您提供一个链接。 – 2013-04-03 21:04:59

+0

注意*答案正确的人,但我太困了,不注意他的问题。无论如何,我真的没有足够的技巧来自己解决它。所以这就是为什么我重新问。链接:http:// stackoverflow。com/questions/15779416 /试图检查错误 – 2013-04-03 21:06:59

+0

@JW已经给了你一个有效的答案,包括一个嵌入SQL的PHP​​版本。请尝试回答并报告错误。 – koriander 2013-04-03 21:19:02

回答

0

我试图解释我的回答对你,对更好地理解和删除混淆部分:

我一直在你的这部分代码:

function getclientip() 
    { 
     if (isset($_SERVER["REMOTE_ADDR"])) { 
      return $_SERVER["REMOTE_ADDR"]; 
     } else if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { 
      return $_SERVER["HTTP_X_FORWARDED_FOR"] ; 
     } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { 
      return $_SERVER["HTTP_CLIENT_IP"] ; 
     } 
      return "0.0.0.0"; 
    } 
$Ip=getclientip(); 

现在你可以加入这一行的SQL你更新代码行: 其meens此行

$sql='SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\';'; 

这行:

mysql_query('update characters SET voted=1 where account_name like \''.$row['login'].'\' and online=1;') ; 

,你在你的问题,加入这个部分现在的结果写为:

$sql='UPDATE characters SET voted=1 where online=1 AND account_name IN (SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\');'; 

现在你想更新只在MIN(LASTACCESS),那么你可以使用此查询,对于我升序通过LASTACCESS,其平均值从下到这个行的顶部LASTACCESS柱的更高,然后选择,在其它的字行,我选择一行具有最小LASTACCESS,然后我通过它来更新命令集投= 1:

UPDATE characters SET voted=1 where online=1 AND account_name IN 
(SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\' ORDER BY lastaccess ASC LIMIT 1); 

您可以使用临时表d。使用MIN功能:

UPDATE characters SET voted=1 where online=1 AND account_name IN 
(SELECT tempTable.login FROM (SELECT login, MIN(lastaccess) FROM accounts WHERE lastIp like \''.$Ip.'\' GROUP BY login) tempTable; 

和不`吨忘记,你的结果没有任何行,因为它的更新命令..

mysql_query('UPDATE characters SET voted=1 where online=1 AND account_name IN 
    (SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\' ORDER BY lastaccess ASC LIMIT 1);'); 

mysql_query('UPDATE characters SET voted=1 where online=1 AND account_name IN 
(SELECT tempTable.login FROM (SELECT login, MIN(lastaccess) FROM accounts WHERE lastIp like \''.$Ip.'\' GROUP BY login) tempTable;'); 

我希望是什么你需要。

+0

'mysql_query('update characters SET voted = 1 where account_name like \''。$ row ['login']。'''and online = 1;')';但是只有MIN(lastaccess)。并且这两个表都在不同的数据库中。所以没有。这不会工作。根本就不想让这个登录名只有1个字符,而不是所有的“voteed = 1”。所以我试图使用MIN(lastaccess)作为一个点,更新字符投票= 1只有在MIN(lastaccess) – 2013-04-03 21:10:38

+0

有没有人有任何其他的idias? :D – 2013-04-03 21:20:12

+0

@JW代码我得到的错误是'警告:mysql_fetch_array()期望参数1是资源,在第50行D:\ xampp \ htdocs \ vote \ vote.php中给出了布尔值,并且行50是'while $ row = mysql_fetch_array($ result))' – 2013-04-03 21:28:39

0

非常好,我会跳过你的功能,因为REMOTE ADRES始终可用。

$Ip = $_SERVER['REMOTE_ADDR']; 
$sql= mysqli_query($database, "SELECT login FROM accounts WHERE lastIp = '$ip' "); 

while($row = mysqli_fetch_assoc($sql)) { 
    if(mysqli_query("UPDATE characters SET voted = '1' WHERE account_name = "'.$row['login'].'" AND online = '1'")) { 
     print 'updated succesfully'; 
    } else { 
     print 'update did not complete'; 
    } 
} 

我不会评论你的行为,我只是说这是你从我那里得到的唯一答案。