gpt4 book ai didi

php - 如何正确地内爆数组以在 mySQL 中实现 REGEXP?

转载 作者:行者123 更新时间:2023-12-01 00:34:27 24 4
gpt4 key购买 nike

我很难正确地将数组内爆到 REGEXP 中以在 mySQL 中使用它。如果数组中只有 1 个项目,结果将按预期返回。但是,如果我在数组中有多个项目,如下例:

Array ( [url0] => get-started [url1] => contact )

我没有得到预期的结果

似乎我在这一行中有错误,但我无法弄清楚:

   WHERE url REGEXP (:' . implode('| :', array_keys($params)) . ')';

期望的是这样工作:

WHERE url REGEXP (:url0| :url1)
WHERE url REGEXP ('get-started|contact')

谢谢

更新 - 额外代码

$params = [];
foreach ($urls as $idx => $url) {
$params['url' . $idx] = $url;
}

url REGEXP (:' . implode('| :', array_keys($params)) . ')';

最佳答案

您可以将数组内爆为 PHP 中的字符串,并将其绑定(bind)到一个 SQL 查询参数:

$urls = implode('|', $params);

$sql = 'SELECT ... WHERE url REGEXP :urls';

$stmt = $pdo->prepare($sql);

$stmt->execute( [ 'urls' => $urls ] );

或者您可以使每个数组元素成为一个 SQL 查询参数,然后使用 CONCAT_WS() 在 SQL 中将它们内爆.

$sql = "SELECT ... WHERE url REGEXP CONCAT_WS('|', ?, ?, ?)";

$stmt = $pdo->prepare($sql);

$stmt->execute( $params );

您需要与数组中元素的数量一样多的 ? 参数占位符。

对于 PDO,您可以使用命名参数或位置参数,但不要在同一个 SQL 查询中同时使用两者。


关于您对使用命名参数的评论:

对于具有 IN ( )REGEXP 值列表的查询,我不会按照您使用它的方式使用命名参数。麻烦多于它的值(value)。在这种情况下使用位置参数会更简单。

但是要实现你想要的:

$keys = array_keys($params);
$keys_with_colons = array_map(function ($s) { return ":$s"; }, $keys);
$url_placeholders = implode(',', $keys_with_colons);
$sql = "SELECT ... WHERE url REGEXP CONCAT_WS('|', $url_placeholders)";

关于php - 如何正确地内爆数组以在 mySQL 中实现 REGEXP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com