【问题标题】:Using PHP Order By to sort query results使用 PHP Order By 对查询结果进行排序
【发布时间】:2013-07-17 15:41:19
【问题描述】:

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

【问题讨论】:

  • ORDER BY 方法是正确的,但是您需要告诉我们更多关于“提交表单时出错”的信息。请向我们展示您的表单以及提交的代码。
  • 您好,错误是'mysql_fetch_array() 期望参数 1 是资源,给定布尔值...'
  • - 如果有帮助,代码由 web 包生成
  • 您正在生成无效的 sql,导致查询失败。可能是该区域中悬空的and!=所有代码部分。你也有大开的SQL injection attack 漏洞,所以享受你的服务器 pwn3d。
  • 对不起,我没有明白这段代码实际上是表单发布到的那个。您生成的查询中可能存在 SQL 语法错误。请在将 $sql 发送到 MySQL 之前向我们展示其内容。

标签: php sql-order-by


【解决方案1】:

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

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

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

【讨论】:

  • 另外,您的代码对 SQL 注入开放。不要将用户输入(例如$_POST)中的任何内容与您的查询连接起来。阅读“SQL injection”。
【解决方案2】:

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

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

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

【讨论】:

  • 所以我需要说“如果未发送表单,则显示全部,按 id 排序”?
  • 好吧,如果它在设置表单时有效,但在不设置时无效,那么我认为值得一试。
【解决方案3】:

$_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';
    }
}

【讨论】:

  • 谢谢,我试了一下,效果和原代码一样
【解决方案4】:

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

【讨论】:

  • 请编辑您的答案并简要描述解决方案 - 它可以帮助偶然发现此线程的人。然后将您自己的答案标记为已接受,以结束主题。如果您还有其他问题,那么...提出一个新问题!
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多