Ошибка RedBean findOne?

Я использую RedBean PHP ORM, чтобы попытаться зарегистрировать/получить пользователей. То есть, учитывая список, разделенный запятыми, я делаю

 $emails = explode(',', trim($app->request->post('emails')));

А затем передайте каждое электронное письмо этой функции

function registerOrGetUser($email)
{
    echo("R or G " . $email . "<br>");
    $user = R::findOne('user', ' email = ? ', array($email));
    if(!$user)
    {
        echo("Couldn't find user " . $email . ", creating new user.<br>");
        //user does not exist, register them
        $user = R::dispense('user');
        $password = $random = substr(md5(rand()),0,8);
        $user->email = $email;
        $user->password = md5($password);
        $user->role = 0;
        R::store($user);
        mail($user->email, "Welcome to imgstat!", "Welcome to imgstat, " . $user->email . "! An account has been created for you. Please sign in with this email address, and the following password: " . $password);
    }
    return $user;
}

Обратите внимание на оператор echo для отладки. Проблема, с которой я сталкиваюсь, заключается в том, что только иногда удается определить, существует ли уже пользователь. То есть, если я попытаюсь добавить

 [email protected]

он получает пользователя (и не регистрирует нового). Однако, если я попытаюсь

 [email protected], [email protected]

он создает ВТОРОГО пользователя в базе данных - с, насколько я могу судить, точно такой же электронной почтой! С этого момента я могу добавить столько [email protected], сколько захочу — они всегда будут получать пользователя и не создавать дубликатов. Но по какой-то причине этот первый дубликат создается ВСЕГДА, если электронная почта не является единственным элементом в списке, разделенном запятыми.

Есть идеи?


person arcologies    schedule 18.01.2014    source источник


Ответы (2)


Остерегайтесь пробелов. Ваш пример [email protected], [email protected], [email protected] идеально подходит к описанной вами проблеме. Взорвав эту строку с помощью ',' вы получите:

Array
(
    [0] => [email protected]
    [1] =>  [email protected]
    [2] =>  [email protected]
)

Вот почему после создания второго пользователя с пробелом в почте это удалось, и с тех пор он был правильно найден. Чтобы избежать пробелов, просто вызовите свою функцию с помощью registerOrGetUser(trim($email))

person rinukkusu    schedule 18.01.2014
comment
Ах, это лучше - покрывает все пробелы, а не только фактические пробелы. Спасибо! - person arcologies; 18.01.2014
comment
Дезинфекция данных жизненно важна, ваш запрос также может завершиться ошибкой в ​​MySQL. - person Ashish Nayyar; 13.06.2016

Нашел!

Глупая ошибка - использование обрезки удаляет только пробелы в начале/конце списка, поэтому были "[email protected]" и "[email protected]"...

Мое исправление:

 $emails = explode(',', str_replace(' ', '', $app->request->post('emails')) );
person arcologies    schedule 18.01.2014