【问题标题】:Unable to sort data by price in PHP an AJAX无法在 PHP 和 AJAX 中按价格对数据进行排序
【发布时间】:2020-03-20 21:50:16
【问题描述】:

我正在尝试根据价格从低到高从高到低sql中的数据进行排序,所以我尝试使用下面的代码,但它没有按@排序987654324@

我得到语法错误或访问冲突基本上我尝试了所有解决方案,但无法按价格对数据进行排序。

HTML

<li class="dropdown-item">
 <input type="radio" class="filter_all sort" name="sort" id="new" value="new">
 <label for="new">Date Published</label>                                                        
</li>
<li class="dropdown-item">
 <input type="radio" class="filter_all sort" name="sort" id="asc" value="ASC">
 <label for="asc">Price : Low to High</label>
</li>
<li class="dropdown-item">
  <input type="radio" class="filter_all sort" name="sort" id="desc" value="DESC">
  <label for="desc">Price : High to Low</label>
</li>

脚本

       $(document).ready(function () {
            filter_data();
            function filter_data() {
                $.post(
                        "fetch.php",
                        {
                            action: 'fetch_data',
                            cate: get_filter('cate'),
                            brand: get_filter('brand'),
                            model: get_filter('model'),
                            sort: get_filter('sort')
                        }
                )
                        .done(function (data) {
                            $('.filter_data').html(data);
                        });
            }
            function get_filter(class_name) {
                var filter = [];
                $('.' + class_name + ':checked').each(function () {
                    filter.push($(this).val());
                });
                return filter;
            }
            $('.filter_all').click(function () {
                filter_data();
            });
        });

PHP

if (isset($_POST["action"])) {
$query = "SELECT * FROM allpostdata WHERE sts = '1'";


if (!empty($_POST['cate'])) {
    $query .= " AND sca IN (" . str_repeat("?,", count($_POST['cate']) - 1) . "?)";
} else {
    $_POST['cate'] = []; // in case it is not set 
}

if (!empty($_POST['brand'])) {
    $query .= " AND product_brand IN (" . str_repeat("?,", count($_POST['brand']) - 1) . "?)";
} else {
    $_POST['brand'] = []; // in case it is not set 
}

if (!empty($_POST['model'])) {
    $query .= " AND mdl IN (" . str_repeat("?,", count($_POST['model']) - 1) . "?)";
} else {
    $_POST['model'] = []; // in case it is not set 
}

if (!empty($_POST['sort'])) {
    $query .= " GROUP BY prs ORDER BY prs (" . str_repeat("?,", count($_POST['sort']) - 1) . "?)";
} else {
    $_POST['sort'] = []; // in case it is not set 
}

$stmt = $conn->prepare($query);
$params = array_merge($_POST['cate'], $_POST['brand'], $_POST['model'], $_POST['sort']);
$stmt->execute($params);
$result = $stmt->fetchAll();
$total_row = $stmt->rowCount();
$output = '';

谁能帮助我如何根据价格对数据进行排序。

【问题讨论】:

  • 您不能参数化 ORDER BY 子句。只需将允许的值列入白名单(用于验证),然后通过字符串连接包含请求的值
  • @ADyson 我该怎么做一个小例子
  • 你在问我如何将两个字符串连接在一起以形成一个更大的字符串?
  • @sanojlawrence SELECT * FROM allpostdata WHERE sts = '1' ORDER BY price ASCSELECT * FROM allpostdata WHERE sts = '1' ORDER BY price DESC 。另外,看看这里w3schools.com/sql/sql_orderby.asp

标签: php html sql ajax sorting


【解决方案1】:

您不能参数化 ORDER BY 子句中的项目。

为了安全地解决这个问题,只需有一个简单的允许值白名单(用于验证),然后使用常规字符串连接包含请求的值:

因此,如果$_POST["sort"] 变量是一个数组,其中始终只有一个项目,并且该项目将包含ASCDESC,那么它将是这样的:

if (!empty($_POST['sort'])) { 
  if ($_POST["sort"][0] == "ASC" || $_POST["sort"][0] == "DESC") { //simplistic whitelist
    $query .= " GROUP BY prs ORDER BY prs " . $_POST['sort'][0]; 
  } 
}

(注意,您在 SQL 中也有一些不正确的括号)。

然后更改参数列表以排除“排序”值:

$params = array_merge($_POST['cate'], $_POST['brand'], $_POST['model']);

【讨论】:

  • 我试过没有变化,它没有按价格排序。
  • 好的...您是否尝试过调试为什么会发生这种情况?记录(或回显,如果您愿意)此脚本运行时 $_POST["sort"] 的值是多少。还要检查 $query 的最终值,这样您就可以准确地看到正在执行的查询。也许添加一些日志记录,这样您就可以查看代码是否进入了if 块......这是您可以而且应该做的所有基本调试工作,以便调查这种性质的问题。开始这样做,你会突然发现找到问题的根本原因变得更快、更容易
  • 当我回显 $_POST['sort'] 我得到 Array to string conversion 错误
  • 对。所以你要为“排序”提交多个值?或者它真的只有一个值,但您出于某种原因决定将它放入一个数组中?如果发生这种情况,那是您的 JavaScript 代码的错。我看不出有任何需要在那里提交数组,除非您的页面有我不知道的地方?
  • 好吧好吧。我确实想知道您为什么需要 GROUP BY...但我看不到您的数据库,所以我不想对此发表评论
猜你喜欢
  • 2012-07-21
  • 2018-01-13
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多