我正在使用一个简单的SQL查询来输出一个通过sql语句排序的表。我想在url中传递一个变量(以避免必须创建多个sql语句)来设置sql字符串中的ORDER BY属性,我不确定这是否可行。这就是我提出的,虽然代码有效但它不起作用。
function list_entries()
{
db_connect();
$orderby = $_GET["orderby"];
$sql = mysql_query("SELECT * FROM astaro ORDER BY '".$orderby."'");
while($row = mysql_fetch_array($sql)) {
echo "Table Outputs - I trimmed this because it's not important";
}
echo "</table>";
db_disconnect();
}
我也意识到pdo和预处理语句的优点,但这是一个仅供内部使用的小应用程序,因此过度复杂化会产生反作用!
答案 0 :(得分:0)
我不确定但它应该是:
替换:
$orderby = '$_GET["orderby"]'; $sql = mysql_query("SELECT * FROM table ORDER BY '.$orderby.'");
致:
$orderby = $_GET["orderby"];
$sql = mysql_query("SELECT * FROM table ORDER BY '".$orderby."'");
答案 1 :(得分:0)
您正在引用变量:
$orderby = '$_GET["orderby"]';
因此$orderby
字面上会包含文字$_GET["orderby"]
。
您应将其更改为:
$orderby = $_GET["orderby"];
你不应该在sql语句中引用变量:
$sql = mysql_query("SELECT * FROM astaro ORDER BY ".$orderby);
但是,无论您使用何种类型的数据库函数(mysql_*
函数都已弃用),这都容易受到SQL注入攻击。在这种情况下,避免sql注入的唯一方法是使用允许的orderby
字符串的白名单,并检查它。
答案 2 :(得分:0)
这里的问题是你的查询最终实际上是
SELECT * FROM table ORDER BY'。$ _ GET [“orderby”]。'
$ _ GET ['oderby']实际上是字面写出来的,不要用引号括起来。像这样的代码 实际上你正在寻找:
$orderby = $_GET["orderby"];
$sql = ("SELECT * FROM table ORDER BY '.$orderby.'");
echo $sql;
答案 3 :(得分:0)
您使用数据库的方式存在安全漏洞。请尝试学习PDO并删除已弃用的mysql驱动程序,因为它将在下一个PHP版本中删除。
永远不要让用户知道您的表格,无论是列名还是表名。