无法在使用AJAX的php中使用多个ORDER BY

无法在使用AJAX的php中使用多个ORDER BY,php,ajax,Php,Ajax,我试图在此声明中按日期和价格从低到高使用订单 SELECT * FROM allpostdata WHERE sts = '1' AND mca='Vehicle' ORDER BY pdt DESC, prs ASC 我使用了echo$query获取查询,下面是我的操作方式 按pdt DESC查找订单是默认查询,我希望prs成为用户选项 当我选择order bylow to high或high to low时,语句会更改,但查询不会执行任何操作,它不会按价格排序 如何按prs任何解决方案排序

我试图在此声明中按日期和价格从低到高使用
订单

SELECT * FROM allpostdata WHERE sts = '1' AND mca='Vehicle' ORDER BY pdt DESC, prs ASC
我使用了
echo$query
获取查询,下面是我的操作方式

按pdt DESC查找订单是默认查询,我希望
prs
成为用户选项

当我选择order by
low to high
high to low
时,语句会更改,但查询不会执行任何操作,它不会按价格排序

如何按
prs
任何解决方案排序

pdt
表示
Date
prs
表示
Price

HTML

<div class="dropdown-menu dropdown-menu-right" aria-labelledby="sortby">
     <li class="dropdown-item">
         <div class="md-radio my-1">
              <input type="radio" class="filter_all sort" name="sort" id="asc" value="ASC">
              <label for="asc">Price : Low to High</label>
          </div>
      </li>
      <li class="dropdown-item">
           <div class="md-radio my-1">
                <input type="radio" class="filter_all sort" name="sort" id="desc" value="DESC">
                <label for="desc">Price : High to Low</label>
           </div>
       </li>
    </div>
PHP

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

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 
}
$query .= " ORDER BY pdt DESC";
if (!empty($_POST['sort'])) {
    if ($_POST["sort"][0] == "ASC" || $_POST["sort"][0] == "DESC") { //simplistic whitelist
        $query .= ", prs " . $_POST['sort'][0];
    }
}
echo $query;
$stmt = $conn->prepare($query);
$params = array_merge($_POST['cate'], $_POST['brand'], $_POST['model']);
$stmt->execute($params);
$result = $stmt->fetchAll();
$total_row = $stmt->rowCount();
$output = '';
为“按日期排序”添加第三个按钮


什么是
pdt
?您意识到,您的查询将首先在该字段上排序,
prs
只会在
pdt
相同的记录之间起到平局作用?@GregSchmidt
pdt
产品日期
prs
价格
所以,我认为这里应该发生的是,你会按照日期对事物进行排序,然后按照价格对日期相同的事物进行排序。这与您看到的相符吗?那么,您不应该在每个查询中都包含“pdt DESC”,仅当未请求价格排序时。然后,当触发
price
时,您需要跳过添加
ORDER BY pdt DESC
。如果有人为排序参数发送ASC或DESC以外的内容,这将导致没有排序顺序。垃圾输入,垃圾输出。参数验证应该单独进行,并且应该拒绝。它可以工作,在触发prs下的订单后
如何触发pdt DESC下的订单,有三个选项按日期下订单,价格低,价格高。我以为您只想在触发价格时按prs下单。您是在问如何在选择一个排序顺序后取消选中单选按钮吗?你不能。您可以添加第三个选项“按日期排序”。
if (isset($_POST["action"])) {
$query = "SELECT * FROM allpostdata WHERE sts = '1' AND mca='Vehicle'";

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 
}
$query .= " ORDER BY pdt DESC";
if (!empty($_POST['sort'])) {
    if ($_POST["sort"][0] == "ASC" || $_POST["sort"][0] == "DESC") { //simplistic whitelist
        $query .= ", prs " . $_POST['sort'][0];
    }
}
echo $query;
$stmt = $conn->prepare($query);
$params = array_merge($_POST['cate'], $_POST['brand'], $_POST['model']);
$stmt->execute($params);
$result = $stmt->fetchAll();
$total_row = $stmt->rowCount();
$output = '';
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="sortby">
  <li class="dropdown-item">
    <div class="md-radio my-1">
      <input type="radio" class="filter_all sort" name="sort" id="asc" value="ASC">
      <label for="asc">Price : Low to High</label>
    </div>
  </li>
  <li class="dropdown-item">
    <div class="md-radio my-1">
      <input type="radio" class="filter_all sort" name="sort" id="desc" value="DESC">
      <label for="desc">Price : High to Low</label>
    </div>
  </li>
  <li class="dropdown-item">
    <div class="md-radio my-1">
      <input type="radio" class="filter_all sort" name="sort" id="date" value="date">
      <label for="date">Date : High to Low</label>
    </div>
  </li>
</div>
if (empty($_POST['sort']) || $_POST['sort'][0] == "date") {
    $query .= " ORDER BY pdt DESC";
} elseif ($_POST["sort"][0] == "ASC" || $_POST["sort"][0] == "DESC") {
    $query .= " ORDER BY prs " . $_POST['sort'][0];
}