0

下面的代码显示表格中的数据,然后根据两个组合框的结果对其进行过滤。提交表单后,我可以按 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

4 回答 4

0

您的ORDER BY ID子句必须出现在您的陈述的最后。如果$_POST['area']$_POST['theme']都被填满,你会得到这样的查询:

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

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

于 2013-07-17T15:51:15.190 回答
0

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

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

最后,我总是检查 mysql.general_log 表以了解上次运行的查询,以查看 DB 端实际发生的情况。

于 2013-07-17T15:53:09.033 回答
0

看起来 $_POST['area'] != 'All' 和 $_POST['theme'] != 'All' 是可能的。在这种情况下,您将把 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';
    }
}
于 2013-07-17T15:58:32.330 回答
0

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

于 2013-07-18T13:42:30.430 回答