我有一个页面,我显示库存中的所有产品,我希望它们按ID或名称或日期等订购。
这样做的方法是通过表格行标题上的链接获取订单,并像这样获取
Queue
现在我们必须以某种方式回应查询,但我不知道如何,查询是这样的:
$order_by = $_GET['order'];
if (!empty($order_by)) {
echo "id";
} else {
echo "$order_by";
}
我尝试插入整个PHP $ order_by替换了#id; id'但它给了我错误。
知道如何实现这个目标吗?
答案 0 :(得分:1)
首先,您需要检查$_GET['order']
是否有效,使用in_array()
并检查收到的订单是否在允许值数组(白名单数组)中。我不认为mysqli_real_escape_string()
足以保护order by子句,因为它是列名,而不是值。如果验证失败,请使用默认列名称(id
)。
$order_whitelist = [ 'id', 'name', 'date' ];
if ( !empty( $_GET['order'] ) && in_array( $_GET['order'], $order_whitelist, true ) )
$order_by = $_GET['order'];
else
$order_by = 'id';
现在可以安全地构建查询,为此sprintf()
函数可能很有用。
$result = mysqli_query( $database, sprintf( "SELECT * FROM `stock` order by `%s` ASC", $order_by ) );
答案 1 :(得分:0)
不需要替换整个“order by”。只需插入您想要的订单。
<?php
$order_by = $_GET['order'];
if(!empty($order_by)){
$result=mysqli_query($database,"SELECT * FROM `stock` order by `".$order_by."` ASC");
$rows=mysqli_num_rows($result);
if(mysqli_num_rows($result)>0) {do something}
?>
请注意,这不会被清理,并且可能导致SQL注入。
答案 2 :(得分:0)
您可以使用以下内容: -
$order_by = $_GET['order'];
if(empty($order_by)){
$order_by='id';
}
if(!empty($order_by)){
$result=mysqli_query($database,"SELECT * FROM `stock` order by `".$order_by."` ASC");
$rows=mysqli_num_rows($result);
if(mysqli_num_rows($result)>0){