首页 >后端开发 >php教程 >如何使用可变的 LIKE 条件构建安全的 MySQLi 预准备语句?

如何使用可变的 LIKE 条件构建安全的 MySQLi 预准备语句?

DDD
DDD原创
2024-12-04 11:39:151013浏览

How to Build a Secure MySQLi Prepared Statement with Variable LIKE Conditions?

使用变量 LIKE 条件构建 SELECT 查询作为 mysqli 准备语句

处理用户输入时,必须准备语句以防止SQL注入并确保数据完整性。当 LIKE 条件的数量可变时,这变得具有挑战性。

问题概述

代码片段尝试通过根据用户输入动态创建 LIKE 条件来解决此问题。但是,它无法正确格式化准备好的语句的参数。

解决方案

解决方案在于在参数周围放置 % 通配符,而不是占位符。这确保了参数用于过滤查询。

详细说明

  1. 初始化成分:

    a.使用 OR 创建 WHERE 子句表达式数组。
    b.确定值的数据类型(在本例中为字符串)。
    c.将数据类型和参数合并到一个数组中。

  2. 准备条件:

    a。将用户输入转换为唯一值数组。
    b.对于每个值,创建一个 LIKE 表达式。
    c.更新参数数组以包含数据类型和通配符值。

  3. 准备查询:

    a。从基本的 SELECT * 查询开始。
    b.如果有条件,请添加带有动态表达式的 WHERE 子句。

  4. 绑定参数并执行:

    a.使用 splat 运算符 (...) 将参数数组绑定到准备好的语句。
    b.执行语句并检索结果(如果有)。

示例代码:

$string = "Bill N_d Dave";

$conditions = [];
$parameters = [''];
foreach (array_unique(explode(' ', $string)) as $value) {
    $conditions[] = "name LIKE ?";
    $parameters[0] .= 's';
    $parameters[] = "%{$value}%";
}

$query = "SELECT * FROM info";
if ($conditions) {
    $stmt = $mysqli->prepare($query . ' WHERE ' . implode(' OR ', $conditions));
    $stmt->bind_param(...$parameters);
    $stmt->execute();
    $result = $stmt->get_result();
} else {
    $result = $conn->query($query);
}

foreach ($result as $row) {
    echo "<div>{$row['name']}</div>\n";
}

附加说明:

  • 如果没有指定条件,则执行不带条件的查询WHERE 子句。
  • 如有必要,请考虑使用 addcslashes() 转义用户输入中的通配符。

以上是如何使用可变的 LIKE 条件构建安全的 MySQLi 预准备语句?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn