在PHP中使用MongoDB进行用户名大小写不敏感的查找

3

我正在尝试寻找一种使用PHP以不区分大小写的方式查询mongodb的方法,因为当前检查“Username”和“username”是否属于不同用户名...

$cursor = $collection->findOne(array('username' => /{$_POST['value']}/i));
$lowerInput = strtolower($_POST['value']);
$username = strtolower($cursor['username']);
if($lowerInput == $username){
    echo "That username appears to be in our database!";
}

我尝试了这个,但光标只会寻找大小写敏感的匹配项,因此只有在光标值为小写时才会将其转换为小写。
2个回答

13

PHP的Mongo驱动程序具有内部正则表达式对象:

$cursor = $collection->findOne(
  array('username' => new MongoRegex("/$_POST['value']/i")
);

顺便提一句,我强烈建议检查$_POST的值,并且可能要修改您的正则表达式,仅获取用户名(而不是更多前后 => new MongoRegex('/^' . $securevalue . '$/i')

编辑:我的答案不够准确:锚点允许Mongo在可用的情况下在此查询上使用索引。


谢谢!我知道Mongo有检查正则表达式的能力,但不知道如何在PHP中使用它! - jamcoupe
MongoRegex在重负载下会影响应用程序的性能,供您参考。 - xecute
这个查询无法使用索引,对于大型集合来说将会非常缓慢,因为它需要进行全集合扫描。甚至不需要高负载也是如此。 - mnemosyn
因此,我建议使用锚点,这样MongoDB可以使用至少从起始锚点开始的索引。(感谢您的降级 :p) - Aurélien B

10

由于 MongoRegex 已被废弃,现在使用 MongoDB\BSON\Regex。以下为更新后的示例代码:

$cursor = $collection->findOne(
    [
        'username' => new \MongoDB\BSON\Regex(preg_quote($_POST['value']), 'i')
    ]
);

我使用preg_quote()函数对POST变量进行了包装,以消除可能的有害字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接