首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐条逃逸命令

逐条逃逸命令
EN

Stack Overflow用户
提问于 2010-07-14 15:48:23
回答 9查看 422关注 0票数 3

可能重复:

mysql_fetch_array() expects parameter 1 to be resource, boolean given in select

我需要一些帮助。

我有一个疑问:

代码语言:javascript
复制
$order = isset($_GET['order']) ? mysql_real_escape_string($_GET['order']) : 'title';
$query = mysql_query("SELECT * FROM entry ORDER BY $order ASC");

您可以按标题、日期或作者订购。

但是,如果有人给$order其他东西,它就会:

代码语言:javascript
复制
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp\www\entries.php on line 20

如何消除此错误消息?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-07-14 16:03:00

您不应该将列标识符视为字符串文本。在您的示例中,您可能会得到这样的SQL:

代码语言:javascript
复制
SELECT * FROM entry ORDER BY O\'Hare ASC

这将在任何SQL解析器中导致语法错误。

我有几条建议:

  1. 将您的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的输入顺序“;

票数 2
EN

Stack Overflow用户

发布于 2010-07-14 15:53:10

您不能在order子句中使用类似colu\'nname的内容--这意味着mysql_real_escape_string不是这里的解决方案。

相反,您应该检查$order实际上包含表中某一列的名称--如果没有,则不运行查询。

例如,您可以使用这样的东西:

代码语言:javascript
复制
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
}
票数 7
EN

Stack Overflow用户

发布于 2010-07-14 15:52:55

只是不向用户提供任何订单选项,这不是。如果您正在使用文本输入,用选择替换它。只要列存在,就不应该有错误。

您可以在一个开关箱中硬编码每个选项:

代码语言:javascript
复制
switch($_GET['order']){
    case 'date' : 
         $order = 'date';
         break;
    case 'author' : 
         $order = 'author';
         break;
    default
         $order = 'title';
}

这也将防止SQL注入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3247974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档