Jump to content
  • 0

Подготовленные выражения и COUNT(*) в MySQLi


Jey Val Star
 Share

Question

Здравствуйте.

Никак не могу допетрить как сделать проще:

function check_user($mysqli, $login, $password = FALSE){    // определяем проверять пароль    $where = ($password) ? 'WHERE `login` = ? AND `password` = ?' : 'WHERE `login` = ?';        // запрос на подсчет количества строк    if ($query = mysqli_prepare($mysqli, 'SELECT COUNT(*) FROM `users` ' . $where))     {         if($password) mysqli_stmt_bind_param($query, "ss", $login, md5($password));                  else mysqli_stmt_bind_param($query, "s", $login);                // выполняем запрос        mysqli_stmt_execute($query);        // подготавливаем вывод        mysqli_stmt_bind_result($query, $result);        // получаем результат запроса        mysqli_stmt_fetch($query);    }    else    {           // ошибка при запросе - выводим сообщение об ошибке        echo 'Не удалось получить данные ' , mysqli_error() , '<br>(db_check)';         exit();    }    // возвращаем полученное значение    return $result;} 

Мне нужно просто проверить на совпадение логина и пароля (или просто логина) при этом защититься от инъекций

Работает пока только в таком виде.

 

Можно ли сократить данный код?

if ($query = mysqli_prepare($mysqli, 'SELECT COUNT(*) FROM `users` ' . $where))     {         if($password) mysqli_stmt_bind_param($query, "ss", $login, md5($password));                  else mysqli_stmt_bind_param($query, "s", $login);                // выполняем запрос        mysqli_stmt_execute($query);        // подготавливаем вывод        mysqli_stmt_bind_result($query, $result);        // получаем результат запроса        mysqli_stmt_fetch($query);    } 

Заранее спасибо

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0
защититься от инъекций

Для этого более чем достаточно экранировать(mysqli_real_escape_strin или addslashes) пользовательские данные и, в данном случае, обрамить их кавычками.

 

проверить на совпадение логина и пароля

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

 

По поводу mysqli_prepare(это аналог MySQL команды PREPARE): его рекомендуют пользовать при выполнении нескольких запросов, которые отличаются значением параметров. Суть  данной конструкции заключается в подготовке запрос к исполнению(разбор запроса и построение его плана исполнения), которое происходит один при подготовке, а при непосредственном  выполнеии запросов этот этап опускается. В вашем случае в этом нет смысла ибо запрос выполняется один раз.

Link to comment
Share on other sites

  • 0
а еще не пойму, зачем вы делаете COUNT(*) ?

Эта функция просто проверяет наличие записей в БД, на сколько я понял для проверки "Есть ли такая запись или нет" используют COUNT

(В первом случае при авторизации - идет проверка логина и пароля

Во втором случае при регистрации - проверяет занятость логина)

 

 

 

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

Что-то я в жизни упустил - с каких это пор пароль проверяют не в БД? И зачем делать доп работу?

Пардон, был не прав)

 

Маленькое пояснение:

Из-за уменьшения эффективности MD5 и SHA-1, разработчики стали использовать так называемую "соль". Эту соль добавляют к паролю и хешируют. Но что-бы соль не потерялась ее нужно сохранить. Для этого ее (соль) записывают в БД и после вытаскивают из бд вместе с паролем и проверяют средствами PHP

 

Вот пример 

$query = mysqli_prepare($mysqli, 'SELECT `id`,`password`,`salt` FROM `users` WHERE login = ?');mysqli_stmt_bind_param($query, "s", $login);if( mysqli_stmt_execute($query)){    // подготавливаем вывод    mysqli_stmt_bind_result($query, $id, $pass_db, $salt);    // получаем результат запроса    mysqli_stmt_fetch($query);        if($pass_db == crypt($password, $salt)) return $id;    else return FALSE;}
Edited by Jey Val Star
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy