如何正确内爆数组以在MySQL中实现REGEXP?

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

我很难正确地将数组内嵌到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 mysql regex pdo prepared-statement
3个回答
2
投票

您可以将数组内嵌到PHP中的字符串,然后将其绑定到一个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 );

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

P.S .:使用PDO,您可以使用命名参数或位置参数,但不能在同一SQL查询中同时使用。


1
投票

我假设:url0:url1

WHERE url REGEXP (:url0| :url1)

是PDO的占位符。因为|是位运算符(按位或),并且将返回整数(在大多数情况下为0),所以这不会带您到任何地方。

第二个(期望的)示例

WHERE url REGEXP ('get-started|contact')

更合理。可以如下构造和执行:

$stmt = $db->prepare("SELECT * FROM mytable WHERE url REGEXP(:pattern)");
$stmt->execute(['pattern' => implode('|', $params)];

0
投票
$params = array ( 'url0' => 'get-started', 'url1' => 'contact' );
echo 'WHERE url REGEXP ("' . implode('|', ($params)) . '")';
© www.soinside.com 2019 - 2024. All rights reserved.