关于WHERE查询的PHP错误代码

时间:2013-03-15 15:40:07

标签: php mysql sql

好的我在这里很困惑。

我有这个完美的代码

$result = mysql_query("SELECT * FROM e_track_access_log WHERE member_id>0 ORDER BY     
datetime_accessed DESC LIMIT 0,20");
?>
            <?php
while($rows=mysql_fetch_array($result)){
?>

我在字段member_id中获取大于0的所有内容

我现在所做的一切都改为以下

$result = mysql_query("SELECT * FROM e_track_access_log WHERE dealer=Demo ORDER BY    
datetime_accessed DESC LIMIT 0,15");
?>
           <?php
while($rows=mysql_fetch_array($result)){
?>

我想要它只是显示有Demo的经销商信息。

这是我收到的错误

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in   
/home/www/controldemo.e-track.co.za/control_main.php on line 177

3 个答案:

答案 0 :(得分:3)

您需要引号来比较字符串:

$result = mysql_query("SELECT * FROM e_track_access_log WHERE dealer='Demo' ORDER BY datetime_accessed DESC LIMIT 0,20");   

但请注意,在这种情况下不要使用双引号,否则您将关闭当前的mysql_query字符串参数。

无论如何,正如我们所指导的那样,mysql_query is deprecated。我建议你使用PDO,它还可以为你提供更多的SQL注入安全性。

以下是其用法示例:

$mysqlString =  'mysql:' 
              .'host='.$yourHost.';' 
              .'dbname='.$yourDBName; 

$conn = new PDO( $mysqlString, $yourUser, $yourPassword);  

$stmt = $conn->prepare(("SELECT * FROM e_track_access_log WHERE dealer=:dealer ORDER BY datetime_accessed DESC LIMIT 0,20");

$stmt->bindParam(':dealer', 'demo');

$stmt->execute();

$data = $query->fetchAll(PDO::FETCH_ASSOC);

答案 1 :(得分:3)

因为demo是一个字符串,所以你应该用单引号将它包起来。

SELECT * 
FROM e_track_access_log 
WHERE dealer = 'Demo' 
ORDER BY datetime_accessed DESC 
LIMIT 0,15

作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

答案 2 :(得分:0)

实际上问题是如果没有引号,mysql会像列一样评估语句,而Demo列显然不存在于当前作用域中。查询失败,返回与此类似的错误:ERROR 1054 (42S22): Unknown column 'Demo' in 'where clause'。为了避免这种情况,您需要使用错误检查。

由于我们在本章,请允许我提醒您将来会删除mysql_ *函数,不再使用它们。

由于之前的mysql错误,您的查询结果为false,因此您没有资源但只有一个简单的布尔值,因此您在php代码中有错误,也因为检查不足。

避免这种情况的两种可能性:检查mysql错误,并检查查询函数返回的结果是否实际上不是false。