好的我在这里很困惑。
我有这个完美的代码
$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
答案 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。