Php数组转MySQL查询条件结构

问题描述 投票:0回答:2

我在 PHP 中有以下数组:

$arr = [1, 3, '4A', '5A', '5C', '2B', '2C', '2E'];

不知何故,我需要将此数组转换为如下所示的字符串:

 $filter =     "(id like '1%') OR 
                (id like '3%') OR 
                (id like '4A%') OR 
                (id like '5A%' OR id like '5C%') OR 
                (id like '2B%' OR id like '2C%' OR id like '2E%')";

数组值的第一个字符表示唯一的类别,并用括号括起来。 最后我会用这个来查询数据库;

$sql = "SELECT * FROM list WHERE {$filter}";

有人可以帮我将此数组转换为正确的字符串吗?实现这一目标的最佳方法是什么?

让您了解我正在尝试的内容: 我的数据库行中的“id”列看起来像; 1B2875。其中第一个字符 (1) 表示类别,第二个字符 (B) 表示子类别。给定的数组是客户端过滤器请求的结果。

php mysql arrays regex filtering
2个回答
2
投票

您可以在 SQL 中使用正则表达式:

SELECT * FROM list WHERE id REGEXP '^(1|3|4A|…)[0-9]+$'

括号内的值可以用PHP函数生成

implode('|', $filter_strings)

请注意,您应该首先验证并转义过滤字符串,以防止用户输入操纵查询。函数

preg_quote
在这里很有用。


0
投票

填充条件段数组和

%
包装值数组,然后使用准备好的语句(如果查询中有任何占位符)或标准查询(如果没有占位符)执行查询

代码:(PHPize演示

$array = [1, 3, '4A', '5A', '5C', '2B', '2C', '2E'];

$conditions = [];
$params = [];
foreach ($array as $v) {
    $conditions[] = 'id LIKE ?';
    $params[] = "%$v%";
}

$sql = 'SELECT * FROM list';
if ($conditions) {
    $sql .= ' WHERE ' . implode(' OR ', $conditions);
    $result = $mysqli->execute_query($sql, $params);
} else {
    $result = $mysqli->query($sql);
}

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

如果您还没有享受 PHP8.2,还有其他方法来绑定参数/值并执行查询

© www.soinside.com 2019 - 2024. All rights reserved.