2010-08-20 88 views
0

我有一个非常简单的表,其中包含'受害者'列表以及该类型被销毁的相应编号。我试图使这个信息的输出页,使用此代码:从MySQL中检索值

foreach($victims as $vic) 
{ 
    $hits = mysql_query("SELECT amount 
          FROM victims 
         WHERE victim = ".$vic); 

    echo $hits; 

    print "$vic: $hits <br /><hr>"; 
} 

然而,hits出来空。我的SQL查询有什么问题?

+2

根据'$ vic'的类型,您很可能具有MASSIVE SQL注入漏洞。或者明确地将它转换为一个整数,如果它是''。(int)$ vic);',或者用引号括起来并且转义它:''“.mysql_real_escape_string($ vic)。”'“); ' – ircmaxell 2010-08-20 17:56:06

回答

1
foreach($victims as $vic) 
{ 
    $hits = mysql_query('SELECT amount 
         FROM victims 
         WHERE victim = "' . mysql_real_escape_string($vic) . '"'); 

    if($hits && mysql_num_rows($hits)>0) { 
     while($row = mysql_fetch_array($hits)) { 
       echo '<p>' . $row['amount'] . ' hits</p>'; 
     } 
    } else { 
     echo '<p>' . mysql_error() . '</p>'; 
    } 
} 
+1

一些错误检查会很好,因为我有一种感觉,那就是有一个查询错误(因为'mysql_query'返回一个资源,并且打印一个资源导致一个数字)... – ircmaxell 2010-08-20 17:54:45

+0

这提出1警告: mysql_fetch_array():提供的参数不在第25行的/var/www/vhosts/queenofsheep.com/httpdocs/Sheep/victimlist.php中有效的MySQL结果资源 chickens:' – Andy 2010-08-20 17:57:41

+0

这就是为什么需要进行错误检查; - )...您的查询出现错误... – ircmaxell 2010-08-20 17:59:03

0

mysql_query()不返回实际结果查询,而是一个resource与您可以再访问结果。

这是一个典型的模式:

$result = mysql_query(...); 
$row = mysql_fetch_assoc($result); 
print($row['amount']); 

mysql_fetch_assoc每次调用返回结果集的下一行。如果你期待多行退换,你可以在while循环称之为:

$result = mysql_query(...); 
while ($row = mysql_fetch_assoc($result)) { 
    print($row['amount']); 
} 
0

由于没有健全的错误在任何答案的检查,我把整个事情在这里:

foreach($victims as $vic) 
{ 
    $sql = "SELECT amount 
       FROM victims 
       WHERE victim = '".mysql_real_escape_string($vic)."'"; 
    $result = mysql_query($sql); 
    $result or die('Query Error: '.mysql_error() . ' - ' . $sql); 

    $hitsarray = mysql_fetch_assoc($result); 
    if ($hitsarray) { 
     $hits = $hitsarray['amount']; 
    } else { 
     // No row was found 
     $hits = 0; 
    } 

    echo $hits; 

    print "$vic: $hits <br /><hr>"; 
} 

噢,这就解决了导致问题的查询错误。请注意包含字符串中$vic变量的引号以及正确转义字符串...

+0

错误检查和安全问题当然很重要。我没有在我的回答中包含这个,因为我发现它们超出了问题的范围:为什么mysql_query()没有返回OP期望的内容?进入其他问题似乎摆脱了原来的问题。例如,我个人比较喜欢为查询准备好的语句,并且不会绕过我的数据库调用,但这与要求的内容没有直接关系。 – 2010-08-20 18:10:39

+0

够公平的@爱德华......它仍然是我的一个主要宠物看到东西被遗漏了。主要是因为如果有错误检查,原始问题将不存在(因为他们会看到错误并理解为什么没有发生)... – ircmaxell 2010-08-20 18:13:20