【问题标题】:What is wrong with this SQL IF Statement?这个 SQL IF 语句有什么问题?
【发布时间】:2014-05-08 06:14:15
【问题描述】:

所以我正在构建一个搜索脚本并传递两个变量,但首先我想确保 SQL 查询是正确的,所以我现在对变量进行硬编码。所以我的变量是

$comma_separated = "'Alberta','Ontario'";

这将传递给查询,如下所示:

$sql = "SELECT * FROM persons WHERE 1=1";



if ($firstname)
$sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstname) . "'";

if ($surname)
$sql .= " AND surname='" . mysqli_real_escape_string($mysqli,$surname) . "'";

if ($province)
$sql .= " AND province='" . mysqli_real_escape_string($mysqli,$comma_separated) . "' WHERE province IN ($comma_separated)";

$sql .= " ORDER BY surname";

然后当查询运行时,我收到以下消息:

cannot run the query because: You have an error in your SQL syntax; check the manual that    corresponds to your MySQL server version for the right syntax to use near 'WHERE province IN ('Alberta','Ontario') ORDER BY surname LIMIT 0, 5' at line 1

但对我来说,查询看起来是正确的,我在这里缺少什么?

提前致谢。

【问题讨论】:

  • 已编辑。请参见上文。
  • 您在查询中使用了两次WHERE

标签: php mysql if-statement


【解决方案1】:

你不能有两次WHERE。您似乎还试图以两种不同的方式过滤省值。基于$province 将始终是一个值数组(即使只给出一个值)的假设,您可以试试这个:

$sql = "SELECT * FROM persons WHERE 1=1";

if (!empty($firstname)) {
    $sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstname) . "'";
}

if (!empty($surname)) {
    $sql .= " AND surname='" . mysqli_real_escape_string($mysqli,$surname) . "'";
}

if (!empty($province)) {
    array_walk($province, function($value, $key_not_used) use ($mysqli) {
        return mysqli_real_escape_string($mysqli, $value);
    });
    $sql .= " AND province IN ('" . implode(',', $province) . "')";
}

$sql .= " ORDER BY surname";

【讨论】:

  • 你的 implode 语法有问题。当我回显它时,我得到" . implode(, $province) . "。我会在等待您的评论时尝试修复它,但您可能会击败我。
  • @JLA 对我来说看起来不错。您是否做了与字符串引用不同的事情?如果您错过了该行前面某处的单引号,您可能会得到它。
  • 我已经仔细检查过,没有检索到任何结果。
  • 好的,所以我以一种远没有你提出的@Mike Brant 优雅的方式来解决这个问题。但它是这样的:所以首先我将 $province 内爆,然后用单引号将其括起来,如此处所示 (stackoverflow.com/questions/6102398/php-implode-101-with-quotes)。所以我的代码看起来像这样:$implosion = implode("','", $province); $implosion = "'".$implosion."'"; 然后我按照你之前的建议将它传递给查询。 if ($province) $sql .= " AND province IN ($implosion)"; 现在一切正常!感谢您的帮助!
  • @JLA 在查询中使用之前不要忘记转义该输入。
【解决方案2】:

您的 SQL 包含两个 WHERE

SELECT * FROM persons WHERE 1=1
                      AND firstname='fn'
                      AND surname='sn'
                      AND province='p'
                      WHERE province IN ($comma_separated)
                      ORDER BY surname

将最后一位更改为:

$sql .= " AND province='" . mysqli_real_escape_string($mysqli,$comma_separated) . "' AND province IN ($comma_separated)";

变成:

AND province='p'
AND province IN ('Alberta','Ontario')

【讨论】:

    【解决方案3】:

    将最后一部分改为:

    if ($province)
      $sql .= " AND province IN (" . mysqli_real_escape_string($mysqli,$comma_separated) . ")";
    

    【讨论】:

    • 这实际上是错误的。单引号必须出现在字符串值周围。该字符串不是问题所在。
    • @MikeBrant 是的,你是对的。不知道我在想什么……修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多