нечувствительный к регистру поиск в mongodb для имен пользователей в php - PullRequest
2 голосов
/ 01 февраля 2012

Я пытаюсь найти способ сделать запрос mongodb без учета регистра, используя PHP, потому что в настоящее время при проверке пользователя "Имя пользователя" и "имя пользователя" могут быть разными именами пользователей ...

$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 голосов
/ 01 февраля 2012

PHP драйвер Mongo имеет внутренний объект Regex:

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

И, кстати, я настоятельно рекомендую проверить значение $ _POST и, вероятно, преобразовать ваше регулярное выражение, чтобы получить только имя пользователя (без дополнительных до / после => new MongoRegex('/^' . $securevalue . '$/i')

Редактировать: мой ответ не был точным: начальный якорь позволяет монго использовать индекс для этого запроса, если он доступен.

2 голосов
/ 07 марта 2017

Поскольку MongoRegex устарело, используйте MongoDB \ BSON \ Regex . Обновленный пример из предыдущего ответа:

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

Я обернул переменную POST в preg_quote () , чтобы очистить потенциально опасные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...