无法选择带有ORDER BY和php的表单DB,如果

无法选择带有ORDER BY和php的表单DB,如果,php,mysql,Php,Mysql,我使用下面的to语句从SQL中加载数据。在执行php IF之前,SELECT查询工作正常 当执行if语句时,我想在单个语句中使用2 ORDER BY 致命错误:未捕获的异常“PDOException”带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064您有 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便使用正确的语法“和sca IN” 在中的第1'行 C:\Users\Amin\Documents\NetBeansProjects\fetch.php:

我使用下面的to语句从SQL中加载数据。在执行php IF之前,SELECT查询工作正常

当执行if语句时,我想在单个语句中使用2 ORDER BY

致命错误:未捕获的异常“PDOException”带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064您有 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便使用正确的语法“和sca IN” 在中的第1'行 C:\Users\Amin\Documents\NetBeansProjects\fetch.php:34堆栈跟踪:

0 C:\Users\Amin\Documents\NetBeansProjects\fetch.php34:PDO->prepare'SELECT*FROM a...1{main}抛出 第34行的C:\Users\Amin\Documents\NetBeansProjects\fetch.php

我如何解决这个问题

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

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'])) {
    if ($_POST["sort"][0] == "ASC" || $_POST["sort"][0] == "DESC") { //simplistic whitelist
        $query .= " ORDER BY prs " . $_POST['sort'][0];
    }
}

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

正如@aynber已经提到的,orderby应该是查询中的最后一个子句。因此,正确的形式如下:

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];
}
}

MySQL查询具有特定的属性。初始查询中的ORDER BY pdt DESC把一切都搞糟了。@aynber那么解决方案是什么?在所有IF语句的末尾添加它。您尝试过调试这个问题吗?您是否转储了生成的SQL查询以查看其是否有效?@NicoHaase是的,我在这里尝试的是转储的SQLSELECT*,来自allpostdata,其中sts='1'和mca='Vehicle'顺序由pdt DESC、prs ASC查询中的此部分、prs ASC last if语句。您可以在结束if和共享之前回显您的查询吗。pdt DESC下的订单有效,但如果!空的$\u POST['sort']不起作用,这可能是由于缺少分号造成的;我现在已经添加了它。您能再次检查吗?我在该查询不起作用之前添加了分号,从allpostdata中选择*其中sts='1'和mca='Vehicle'顺序按pdt DESC,prs ASC查询中的此部分,prs ASC last if语句执行上述查询时出现了什么错误?