0

好的,我在这里感到困惑。

我有这段代码,它完美无缺

$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)){
?>

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

我现在所做的只是改变了以下

$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
4

3 回答 3

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 已弃用。我建议您使用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);
于 2013-03-15T15:40:48.110 回答
3

因为demo是字符串,所以应该用单引号括起来。

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

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

于 2013-03-15T15:41:02.763 回答
0

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

既然到了这一章,让我提醒你,mysql_* 函数将来会被删除,你不应该再使用它们了。

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

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

于 2013-03-15T15:47:56.367 回答