使用PHP Order By对查询结果进行排序

时间:2013-07-17 15:41:20

标签: php sql-order-by

以下代码显示表中的数据,然后根据两个组合框的结果对其进行过滤。我可以在提交表单后按ID排序结果,但不能在初始加载时排序(所有列出的都是)。我已经尝试$sql = "SELECT * FROM Places ORDER BY ID";在列表加载时工作,但在提交表单时返回错误。希望有道理。有任何想法吗?谢谢!

// Default query
$sql = "SELECT * FROM Places";
// check if form was submitted
if (isset($_POST['area'])) {
    $connector = 'where';
    if ($_POST['area'] != 'All') { 
        $sql .= " where Area = '".$_POST['area']."' ORDER BY ID";
        $connector = 'and';
    }
    if ($_POST['theme'] != 'All') { 
        $sql .= " $connector Theme = '".$_POST['theme']."' OR Theme2 = '".$_POST['theme']."' 
        ORDER BY ID";
    }
}

4 个答案:

答案 0 :(得分:0)

您的ORDER BY ID条款必须出现在声明的最后。如果同时填充$_POST['area']$_POST['theme'],您最终会得到如下查询:

SELECT ... WHERE Area = 'some area' ORDER BY ID AND Theme = 'some theme'

ORDER BY位添加为查询的最后一部分。

答案 1 :(得分:0)

我认为您缺少默认行为声明。即您的IF语句没有else子句。所以你正在检查isset,如果它改变了选择查询,但没有什么可说的IF! isset SELECT查询应该是.... ORDER BY ID。

此外,每次设置/更改其中的一部分时,我都会尝试回显您的SQL查询,以准确了解发送给数据库的内容。

最后,我总是检查mysql.general_log表以查看上次运行的查询,以查看数据库结束时实际发生的情况。

答案 2 :(得分:0)

看起来$ _POST ['area']可能!='全'和$ _POST ['主题']!='全'。在这种情况下,您将把ORDER BY子句放入两次。那可能是你的问题。

所以试试这个。

// Default query
$sql = "SELECT * FROM Places";
// check if form was submitted
if (isset($_POST['area'])) {
    $connector = 'where';
    if ($_POST['area'] != 'All') { 
        $sql .= " where Area = '".$_POST['area']."'";
        $connector = 'and';
    }
    if ($_POST['theme'] != 'All') { 
        $sql .= " $connector Theme = '".$_POST['theme']."' OR Theme2 = '".$_POST['theme'] . "'";
    }

    if ( $_POST['area'] != 'All' || $_POST['theme'] != 'All' ) {
        $sql .= ' ORDER BY ID';
    }
}

答案 3 :(得分:0)

感谢您的帮助,无论如何我已经解决了服务器端的问题,因此无需代码。感谢您关注安全问题,我想到了这些,但我不确定它有多糟糕!如果我将代码更改为PDO会有很大帮助吗?我已经将用户的权限降低到最小。再次感谢。