2012-09-11 75 views
0

我想将两个变量传递到ORDER BY $ variable1 $ variable2里面的MySQL语句。变量从下拉菜单表单中获得。将变量传递给ORDER BY MySQL语句

PHP

if(isset($_POST['order'])){ 
     $sort1 = mysql_real_escape_string($_POST['sort']); 
     $sort2 = mysql_real_escape_string($_POST['order']); 
     } 
     if([email protected]$_POST['order']){ 
      $sort1 = 'ID'; 
      $sort2 = 'DESC'; 
     } 
     $topics = mysql_query(" SELECT topic_id AS 'ID', topic_head AS 'Title', 
             topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' 
           FROM forum_topics 
           ORDER BY '{$sort1}' '{$sort2}' ") or die (mysql_error()); 
         ?> 

HTML表单

<ul class="sort"> 
     <li><form action="topics.php" method="post"> 
       <label class="label">Sort Table By</label> 
       <select name="sort"> 
        <option value =""> </option> 
        <option value ="ID">ID</option> 
        <option value ="Title">Title</option> 
        <option value ="TAGS">TAGS</option> 
        <option value ="VIEWS">VIEWS</option> 
        <option value ="CREATED ON">CREATED ON</option> 
        <option value ="CREATED BY">CREATED BY</option> 
       </select> 

       <label class="label">Order By</label> 

       <select name = "order" class="tap_Select"> 
        <option value =""> </option> 
        <option value ="ASC">Ascending</option> 
        <option value ="DESC">Descending</option> 
       </select> 

       <input type="submit" name="order" value="SORT" > 
      </form> 
     </li> 
    </ul> 

请帮助。

UPDATE

当我删除约$ SORT1和$ SORT2

报价我得到这个错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SORT' at line 4

更新2

当我做了$ SQL =“.....”,而不通过mysql_querry() 我得到这个

SELECT topic_id AS 'ID', topic_head AS 'Title', topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' FROM forum_topics ORDER BY ID SORT

+2

在HTML表单中,您有两个称为'订单'的元素,select和submit按钮。 – andrewsi

回答

6

请勿使用引号,

ORDER BY 'ID' 'DESC' 

不正确。它应该是

ORDER BY ID DESC 

引号将id和desc转换为纯字符串,而不是关键字/字段名。

+0

+1删除报价(错过了我自己) – Dave

+0

请参阅更新。 –

+0

@dot:将你的查询建立为'$ sql =“....”',这样你就可以回显你正在创建的字符串。这总是一个好主意,尤其是当你正在调试时 - 更容易看到“真实”的查询,而不仅仅是你从错误消息中得到的片段。所以... $ sql,然后向我们展示您正在构建的查询。 –

1

删除括号并添加排序元素之间用逗号

ORDER BY $sort1 $sort2 ") or die (

编辑:进行以下修改,所以我们可以看到这是怎么回事...

走这条线(S)

$topics = mysql_query(" SELECT topic_id AS 'ID', topic_head AS 'Title', 
            topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' 
          FROM forum_topics 
          ORDER BY '{$sort1}' '{$sort2}' ") or die (mysql_error()); 

将查询粘贴到变量中,并将mysql_query中的字符串替换为变量;

$query="SELECT topic_id AS 'ID', topic_head AS 'Title', 
            topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' 
          FROM forum_topics 
          ORDER BY '{$sort1}' '{$sort2}' "; 
$topics = mysql_query($query) or die (mysql_error()); 

然后回显查询并将结果剪切/粘贴到问题中。有些事情没有按照你认为的方式发生。

echo $query; 
+0

删除了引号和逗号...错误地使用了两个“排序”变量作为单独排序的列与“排序”和“方向” – Dave

+0

请参阅问题更新 –

+0

查看更新的响应... note留下您的版本的查询完整在我的示例 – Dave

0
$topics = mysql_query("SELECT 
    topic_id AS `ID`, 
    topic_head AS `Title`, 
    topic_tags AS `TAGS`, 
    topic_owner AS `CREATED BY`, 
    topic_date AS `CREATED ON` 
FROM forum_topics 
ORDER BY {$sort1} {$sort2}' 
") or die (mysql_error()); 

您需要删除'各地ORDER BY值。另外请注意首选使用别名值附近的反标记。

还请注意,您应该使用mysqli_ *或PDO作为mysql_ *已被弃用(请参阅大多数mysql_ *相关功能的PHP.net上的大红色警告。

+0

请参阅问题更新 –

+0

@DotOyes如果该错误仍然显示'接近'SORT',这似乎表明您仍然在发送单引号。 –

+1

你的邻居是不正确的。 OP想要指定字段和排序方向。您改为使用两个字段。 –

1

看来你的列名包含空格,所以你需要使用反引号:

ORDER BY `{$sort1}` {$sort2} 

还要注意的是mysql_real_escape_string没有提供任何保护的ORDER BY条款的情况。您需要针对允许输入的白名单检查您的输入。

+0

如果我从下拉菜单中获取值,这是否有助于白名单?你认为什么是白名单? –

+0

@Dot Oyes不,永远不要相信用户输入。您需要对列名称列表(以及asc/desc命令...)进行硬编码并检查。任何人都可以向脚本发布任何值。 – jeroen

+0

请你指点我一个例子。谢谢。 –