以下代码显示表中的数据,然后根据两个组合框的结果对其进行过滤。我可以在提交表单后按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";
}
}
答案 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会有很大帮助吗?我已经将用户的权限降低到最小。再次感谢。