2013-12-09 50 views
2

我想在我的sql查询中使用post变量值来按照用户选择的顺序对数据进行排序。该表可以正确显示相应的字段,但值不会排序。在mysql查询中的post变量

我知道这是受sql注入,但是,我在我的本地服务器上进行培训的目的。

<?php 
$sort_in = $_POST['SortIn']; 

$sql = 'select * from db.Runner order by "'.$_POST['SortIn'].'"'; 
    $result = mysql_query($sql, $con); 

    if($result) 
    { 
     echo "<table border = '1'> 
     <tr> 
     <th>RunnerID</th> 
     <th>EventID</th> 
     </tr>"; 

     while($row = mysql_fetch_array($result)) 
     { 
      echo "<tr><td>"; 
      echo $row['RunnerID']; 
      echo "</td><td>"; 
      echo $row['EventID']; 
      echo "</td><td>"; 
      </tr>"; 
     } 
     echo "</table>"; 
?> 
+3

如果你是为了培训目的而做的,你应该抛弃陈旧/不推荐使用的mysql _ *()函数,并至少使用mysqli或PDO进行学习。 –

回答

5

您正在生产和运行像

select * from db.Runner order by "fieldname"; 

查询这当然应该是的

select * from db.Runner order by fieldname; 
select * from db.Runner order by `fieldname`; -- for MySql 
select * from db.Runner order by [fieldname]; -- for MSSQL 

(我建议一个的最后两个,根据您的数据库,例如,如果您的字段名称恰好是“订单”)。

卸下双引号

$sql = 'select * from db.Runner order by '.$_POST['SortIn']; 

以及可能通过适当的定界符,例如替换它们

$sql = 'select * from db.Runner order by `'. $_POST['SortIn'] . '`'; 

您已经提到的SQL注入和mysql_ VS mysqli_所以我会保持我的嘴今天关闭;)虽然我真的不明白了一个道理 - 即使是训练项目上localhost - 不这样做的权利, 老实说。

在发布这个答案后,一些有用的评论是由您的操作系统MarcB和其他回答zan。尽管这是训练,请注意他们,因为他们是很好的建议!

+0

我想添加另一个变量$ _POST ['SortBy']以降序排列,如果用户希望这样做。我怎么做?谢谢 – zan

+0

你可以把'SortOrder'作为'+ 1'或'-1',并在你的查询中加入'($ _POST ['SortOrder'] == -1?“DESC”:“ASC”)。 – CompuChip

1

你竟然排序上的字符串,而不是一个字段,删除查询报价:

$sql = 'select * from db.Runner order by '.$_POST['SortIn']; 

附:我不会开始一个关于注射咆哮;)

+0

如果我想按另一个post变量中指定的asc或dsc顺序排序,那么如果没有将这两个变量连接起来,我该怎么做? – zan

+1

@zan在准备好之前,通过列入白名单验证变量是否有效。 –