Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这个SQL IF语句有什么问题?_Php_Mysql_If Statement - Fatal编程技术网

Php 这个SQL IF语句有什么问题?

Php 这个SQL IF语句有什么问题?,php,mysql,if-statement,Php,Mysql,If Statement,因此,我正在构建一个搜索脚本,需要传递两个变量,但首先我要确保SQL查询是正确的,所以我现在正在硬编码变量。所以我的变量是 $comma_separated = "'Alberta','Ontario'"; 这将传递到查询,如下所示: $sql = "SELECT * FROM persons WHERE 1=1"; if ($firstname) $sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstn

因此,我正在构建一个搜索脚本,需要传递两个变量,但首先我要确保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
但对我来说,问题似乎是对的,我在这里遗漏了什么


提前感谢。

将最后一部分更改为:

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

您不能让
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";

您的SQL包含两个
,其中

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')

编辑。请参见上文。您在查询中使用了两次
WHERE
,这实际上是错误的。字符串值周围必须有单引号。这个字符串不是问题所在。@MikeBrant是的,你是对的。不知道我在想什么。。。修正了。你在内爆时的语法有问题。当我回显它时,我得到
”。内爆(,$province)。“
。在我等待你的评论时,我会尽力修复它,但你可能会击败我。@JLA我觉得它很好。您是否做了一些与字符串引用不同的事情?如果您在该行前面的某个地方漏掉了一个报价,您可能会得到这个结果。我已经仔细检查了这一点,没有检索到任何结果。好的,所以我以一种远不如您所展示的@Mike Brant优雅的方式来解出这个问题。但它是这样的:首先我内爆$province,然后用单引号将其括起来,如下所示()。所以我的代码是这样的:
$inpolosion=inpolde(“,”,$province)$内爆=“””“$in爆。””
然后我按照前面的建议通过查询传递它<代码>如果($province)$sql.=“和($inflation)”中的省现在一切正常!谢谢你的帮助@在查询中使用输入之前,不要忘记转义该输入。