Как написать сценарий регистрации в mySQLi? - PullRequest
1 голос
/ 01 января 2012

Я пытаюсь преобразовать мой скрипт, который я использую для регистрации пользователя на моем сайте, из SQL в SQLi. У меня есть какой-то код, и я подумал, было ли это правильно. Спасибо.

$members = new mysqli("localhost", "root", "pass", "members");
$check = $members->prepare("select email from users where email = ?");
$check->bind_param('s', $_POST['r_email']);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
echo "user already registered";
} else {
$user_id = mt_rand(100000000, 999999999);
$add_user = $members->prepare("insert into users(email, password, user_id) values(?, ?, ?)");
$add_user->bind_param('ssi', $r_email, $r_password, $user_id);
$r_email = $_POST['r_email'];
$r_password = md5($_POST['r_password']);
$add_user->execute();
$add_user->close();
}
$check->close();
$members->close();

Ответы [ 2 ]

0 голосов
/ 01 января 2012

Имея дело с сообщением об ошибке, которое вы отметили в своем комментарии, 'Все данные должны быть получены до подготовки нового оператора' ' ...

Ошибка означает именно то, что онаговорит: вы пытаетесь подготовить новый оператор, прежде чем вы получите все данные из предыдущего оператора.Начиная с ручного ввода mysqli::use_result документы ...

Используется для инициирования получения набора результатов изпоследний запрос, выполненный с использованием функции mysqli_real_query () для соединения с базой данных.

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

Далее, из ручного ввода в mysqli_stmt::num_rows docs ...

Возвращает количество строк в наборе результатов.Использование mysqli_stmt_num_rows () зависит от того, использовали ли вы mysqli_stmt_store_result () для буферизации всего набора результатов в дескрипторе оператора.

0 голосов
/ 01 января 2012

Вам необходимо вызвать mysqli_stmt::store_result перед проверкой mysqli_stmt::num_rows (как описано в mysqli_stmt :: num-row ). После этого вам нужно закрыть оператор, используя mysqli_stmt::close ( mysqli_stmt :: close ).

Редактировать: Кроме того, использование md5 для хеширования пароля (особенно без соли) очень небезопасно. Посмотрите на https://stackoverflow.com/a/1581919/140827 для предложений по более безопасным решениям (bcrypt, соль и т. Д.)

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