【问题标题】:sql returning no resultssql没有返回结果
【发布时间】:2017-07-07 06:05:10
【问题描述】:

下面的代码没有返回任何结果,如果我在 $dep 的代码中使用变量,如果我手动将值放入 1,它会返回预期的结果。我试过不带引号的单引号和双引号。我查看了大量示例,但我看不出我做错了什么

$dep = 1;
    if (!$names) {
        $sql = "SELECT topic_id, topic_pid, ispublic, isactive, topic, dept_id FROM '.TOPIC_TABLE
            . ' WHERE dept_id='$dep' ORDER BY `sort`";
        $res = db_query($sql);

【问题讨论】:

  • 你确定 if (!$names) 没有让你失望吗?
  • 在这里检查错误
  • 它是 osticket 核心代码核心的一部分,并且工作得非常好,我所做的唯一更改也是通过 dept_id 添加 where 子句,当它是 dept_id=1 但不是什么时候它的布局类似于上面的代码
  • TOPIC_TABLE 是常量吗?你的语法是完全错误的,因为不应该这样引用表,而且你永远不会打破引号来使用外部变量。
  • 你在下面有答案,问他们。

标签: php mysql osticket


【解决方案1】:

我很确定您的错误与使用的引号错误有关。 在你的代码中,你写

$sql = "SELECT topic_id, topic_pid, ispublic, isactive, topic, dept_id FROM '.TOPIC_TABLE
        . ' WHERE dept_id='$dep' ORDER BY `sort`";

在 FROM 之后,您使用的是单引号 ('),但您的整个查询已被包含在双引号 (") 中,因此产生了问题。

应该是:

$sql = "SELECT topic_id, topic_pid, ispublic, isactive, topic, dept_id FROM ".TOPIC_TABLE
        . " WHERE dept_id='$dep' ORDER BY `sort`";

编辑:忘记指出您应该认真使用 PDO 或任何其他 SQL 注入预防方法。如果在任何情况下,您的 $dep 变量可以通过公共表单发送,那么您最终可能会在最好的情况下转储数据库。

【讨论】:

    【解决方案2】:

    查询的第二行存在语法错误 - 如果您想要在查询中使用单引号,那么您需要将其全部括在双引号中:

    $sql = "SELECT topic_id, topic_pid, ispublic, isactive, topic, dept_id FROM ' .TOPIC_TABLE
                . " WHERE dept_id='$dep' ORDER BY `sort`";
    

    顺便说一句,使用字符串连接构建这样的查询是一个非常糟糕的想法,并且会让您容易受到 SQL 注入攻击 - 您应该改用准备好的语句和参数。

    【讨论】:

    • 你错过了第一行引号错误。在 FROM 之后,应该有双引号,正如我在回答中指出的那样。我同意 SQL 注入
    【解决方案3】:

    首先正如 Fred -ii 所说,确保 if 语句正确执行。那么如果dept_id 是一个整数值,那么你不应该像 scaisEdge 所说的那样需要单引号。否则 SQL 看起来很好。确保数据库中有正在传入的dept_id 的契约记录。

    【讨论】:

    • 审查您的代码@Michael Di Prisco 是正确的,因为您的报价没有正确排列。使用您在问题中的引号,sql 最终将如下所示:SELECT topic_id, topic_pid, ispublic, isactive, topic, dept_id FROM '.TOPIC_TABLE . ' WHERE dept_id='1' ORDER BY sort 完全正确。未正确连接实际表名
    猜你喜欢
    • 2013-02-19
    • 2023-04-04
    • 2012-10-29
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多