2013-03-15 116 views
0

好吧我有我自己在这里困惑。PHP错误代码在哪里查询

我有这样的代码它的作品完美

$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

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

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

作为旁注,查询是用SQL Injection脆弱,如果变量的值(小号)从外部来了。请看下面的文章,了解如何防止它。通过使用PreparedStatements你可以摆脱使用单引号围绕值。

+1

JW谢谢是的错过了'Demo'part谢谢有时坐着看着你想念的东西基本的 – 2013-03-15 15:44:34

+0

不客气':D' – 2013-03-15 15:45:58

3

您需要报价比较字符串错误:

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

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

无论如何,因为它已经mentinoned,mysql_queryis 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); 
0

其实问题是,不加引号,MySQL将评估就像一列中的语句,列演示显然并不在目前的范围存在。查询失败,返回与此类似的错误:ERROR 1054 (42S22): Unknown column 'Demo' in 'where clause'。为了避免这种情况,您需要使用错误检查。

由于我们在这一章,让我提醒你,mysql_ *函数将在未来被删除,你不应该再使用它们。

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

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