[英]PHP GET MySQL order by if not empty echo else echo how
我有一个页面,其中显示所有库存产品,我希望按ID或名称或日期等进行订购。
一种方法是通过表行标题上的链接获取订单,并像这样获取订单
$order_by = $_GET['order'];
if (!empty($order_by)) {
echo "id";
} else {
echo "$order_by";
}
现在我们必须以某种方式将其回显给查询,但是我不知道如何,查询就像这样:
$result = mysqli_query($database,"SELECT * FROM `stock` order by `id` ASC");
$rows = mysqli_num_rows($result);
if (mysqli_num_rows($result) > 0) {
我尝试通过用'id'替换订单来插入整个PHP $ order_,但它给了我错误。
任何想法如何做到这一点?
首先,您需要检查$_GET['order']
是否有效,使用in_array()
并检查接收到的订单是否在允许值的数组中(白名单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 ) );
整个“ 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注入。
您可以使用这样的东西:
$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){
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.