我很难正确地将数组内嵌到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中的字符串,然后将其绑定到一个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查询中同时使用。
我假设: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)];
$params = array ( 'url0' => 'get-started', 'url1' => 'contact' );
echo 'WHERE url REGEXP ("' . implode('|', ($params)) . '")';