我很难正确地将数组内爆到 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 );
您需要与数组中元素数一样多的?
参数占位符。
使用PDO,可以使用命名参数或位置参数,但不要在同一 SQL 查询中同时使用两者。
关于您对使用命名参数的评论:
我不会对具有IN ( )
值列表的查询使用命名参数,也不会REGEXP
您使用它的方式。这比它的价值更麻烦。在这种情况下,使用位置参数会更简单。
但要实现你想要的:
$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)";
我假设:url0
和:url1
WHERE url REGEXP (:url0| :url1)
是 PDO 的占位符。这不会带你去任何地方,因为|
是一个位运算器(按位OR(,并且会返回一个整数(在大多数情况下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)) . '")';
结果:
WHERE url REGEXP ("get-started|contact")