为了账号安全,请及时绑定邮箱和手机立即绑定

使用WHERE子句将数组传递给查询

使用WHERE子句将数组传递给查询

小唯快跑啊 2019-06-03 16:34:58
使用WHERE子句将数组传递给查询给定一个ID数组$galleries = array(1,2,5)我希望有一个SQL查询,它在WHERE子句中使用数组的值,如下所示:SELECT *FROM galleriesWHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */如何生成这个查询字符串以便与MySQL一起使用?
查看完整描述

4 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

小心!这个答案包含了一个严厉的SQL注入脆弱性。不要使用这里提供的代码示例,除非确保任何外部输入都是经过消毒的。

$ids = join("','",$galleries);   $sql = "SELECT * FROM galleries WHERE id IN ('$ids')";


查看完整回答
反对 回复 2019-06-03
?
跃然一笑

TA贡献1826条经验 获得超6个赞

使用PDO:[1]

$in = join(',', array_fill(0, count($ids), '?'));$select = <<<SQL
    SELECT *
    FROM galleries
    WHERE id IN ($in);SQL;$statement = $pdo->prepare($select);$statement->execute($ids);

使用MySQLi [2]

$in = join(',', array_fill(0, count($ids), '?'));$select = <<<SQL
    SELECT *
    FROM galleries
    WHERE id IN ($in);SQL;$statement = $mysqli->prepare($select);$statement->bind_param(str_repeat('i', count($ids)), ...$ids);
    $statement->execute();$result = $statement->get_result();

说明:

使用SQLIN()运算符检查给定列表中是否存在值。

一般来说,它看起来是这样的:

expr IN (value,...)

我们可以构建一个表达式来放置在()从我们的阵列。请注意,括号内必须至少有一个值,否则MySQL将返回一个错误;这等于确保输入数组至少有一个值。若要帮助防止SQL注入攻击,请首先生成?为每个输入项创建参数化查询。在这里,我假设包含您的ID的数组被调用$ids:

$in = join(',', array_fill(0, count($ids), '?'));$select = <<<SQL
    SELECT *
    FROM galleries
    WHERE id IN ($in);SQL;

给定由三个项组成的输入数组$select看起来像:


SELECT *FROM galleries
WHERE id IN (?, ?, ?)

再次注意,有一个?对于输入数组中的每个项。然后,我们将使用PDO或MySQLi来准备和执行上述查询。

使用IN()带字符串的运算符

由于绑定参数的存在,很容易在字符串和整数之间进行更改。对于PDO,不需要更改;对于MySQLi更改str_repeat('i',str_repeat('s',如果你需要检查字符串。

[1]:为了简洁起见,我省略了一些错误检查。您需要检查每个数据库方法的常见错误(或者将DB驱动程序设置为抛出异常)。

[2]:需要PHP 5.6或更高版本。同样,我省略了一些错误检查,以保证简洁性。


查看完整回答
反对 回复 2019-06-03
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

假设你事先正确消毒了你的输入.。

$matches = implode(',', $galleries);

然后调整查询:

SELECT *FROM galleries
WHERE id IN ( $matches )

根据数据集适当地引用值。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 885 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信