可能重复:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
我需要一些帮助。
我有一个疑问:
$order = isset($_GET['order']) ? mysql_real_escape_string($_GET['order']) : 'title';
$query = mysql_query("SELECT * FROM entry ORDER BY $order ASC");您可以按标题、日期或作者订购。
但是,如果有人给$order其他东西,它就会:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp\www\entries.php on line 20如何消除此错误消息?
发布于 2010-07-14 16:03:00
您不应该将列标识符视为字符串文本。在您的示例中,您可能会得到这样的SQL:
SELECT * FROM entry ORDER BY O\'Hare ASC这将在任何SQL解析器中导致语法错误。
我有几条建议:
mysql_query()中构建它。如果使用变量,现在可以检查SQL字符串,这会使上述错误更容易捕获。$sql = "SELECT * $order ASC从条目顺序“;//在这里您可以记录$sql,或者输出到Firebug,等等,$query =$query,返回值并不表示错误。您需要检查错误状态,因为它们可能由于许多原因而发生。
$query = mysql_query($sql);if ($query === false) { die(mysql_error());}
mysql_real_escape_string() --而不是列名、表名、SQL关键字等。我使用的是一个关联数组,它将$_GET输入映射到有效的列名,因此我知道它是安全的。这还允许您在应用程序参数中使用与列名不同的值。$ordercolumns = => ( "t“=>”=>“date );$order =”=>“;//缺省if (isset($_GET"order") &isset($ordercolumns[$_GET”order“)){ $order =$ordercolumns[$_GET”order“;}/现在我们知道$order只能是‘标题’或'date',//因此没有必要转义它。$sql = "SELECT * $order ASC的输入顺序“;
发布于 2010-07-14 15:53:10
您不能在order子句中使用类似colu\'nname的内容--这意味着mysql_real_escape_string不是这里的解决方案。
相反,您应该检查$order实际上包含表中某一列的名称--如果没有,则不运行查询。
例如,您可以使用这样的东西:
if (!in_array($_GET['order'], array('column1', 'title', 'id', 'other_column'))) {
// deal with the problem
// and don't run the query
// because $_GET['order'] is not one of the allowed values
}发布于 2010-07-14 15:52:55
只是不向用户提供任何订单选项,这不是。如果您正在使用文本输入,用选择替换它。只要列存在,就不应该有错误。
您可以在一个开关箱中硬编码每个选项:
switch($_GET['order']){
case 'date' :
$order = 'date';
break;
case 'author' :
$order = 'author';
break;
default
$order = 'title';
}这也将防止SQL注入。
https://stackoverflow.com/questions/3247974
复制相似问题