2013-07-03 2 views
0

После многих рекомендаций от других я решил сделать переход с mysql_ на PDO. Я начал смотреть на PDO буквально около 15 минут назад, и я застрял, пытаясь преобразовать эту строку кода в формат PDO.Переключение с mysql_ на PDO

function verify_user($username, $recover_password) { 
     return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password_recovery` = '$recover_password'"), 0) == 1) ? true : false; 
} 

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

$verify_user = "SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password_recovery` = '$recover_password'"; 
    $result = $con->prepare($verify_user); 
    $result->execute(); 

Проблема, которую я имею является второй частью строка кода - mysql_result. Теперь, когда запрос запущен, я не знаю, как вернуть true или false с помощью PDO. Буду признателен за любую помощь. Благодаря!

Обновлен:

$result = $con->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = :username AND `password_recovery` = :recover_password"); 
$result->bindParam(':username', $username, PDO::PARAM_STR); 
$result->bindParam(':password_recovery', $recover_password, PDO::PARAM_STR); 
$result->execute(); 

От чтения этой страницы вы при условии, что будет:

$result = $con->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = :username AND `password_recovery` = :recover_password"); 
$result->bindParam(':username', $username, PDO::PARAM_STR); 
$result->bindParam(':password_recovery', $recover_password, PDO::PARAM_STR); 
$result->execute(); 
return ($con->fetch($result) == 1) ? true : false; 

Я, вероятно, мили, но я ценю помощь, которую вы мне дали :) Я сделаю еще пару поисков.

+0

Вы используете PDO неправильно. '$ username' и' $ recover_password' должны быть заполнителями, ** NOT ** напрямую вставляется в строку запроса. Что касается получения результатов, вот подсказка: http://php.net/manual/en/pdostatement.fetch.php –

+0

Я думаю, что это должно быть правильно? (отредактированный основной пост) – user2547576

+0

лучше с параметрами. неправильно с извлечением. вы выбираете счет, поэтому ВСЕГДА верните 1 строку. вам нужно получить данные этой строки, а затем проверить результаты подсчета. –

ответ

-1

Я бы записать функцию таким образом:

function verify_user($username, $recover_password) { 
    $sql = "SELECT COUNT(`user_id`) AS count FROM `users` 
     WHERE `username` = ? AND `password_recovery` = ?"; 
    $stmt = $con->prepare($sql); 
    $stmt->execute(array($username, $recover_password)); 
    while ($row = $stmt->fetch()) { } /* should be exactly one row anyway */ 
    return $row["count"] == 1; 
} 

Там нет необходимости использовать bind_param(), так как вы можете просто передать значения в качестве аргумента массив для execute(). И нет необходимости указывать тип параметра (это фактически игнорируется, по крайней мере, в драйвере MySQL PDO).

Также будьте осторожны, чтобы сделать проверку ошибок. Функции prepare() и execute() возвращают false при ошибке. Многие вещи могут вызвать ошибку. Вы можете пропустить имя столбца. В вашем соединении с базой данных могут отсутствовать права доступа к базе данных. Кто-то мог отказаться от стола.

FWIW, правильная проверка ошибок важно при использовании mysql_ * и mysqli_ * API это слишком, но мне кажется, что немногие люди делают это правильно.

В приведенном выше коде я не показываю проверку возвращаемых значений, потому что я сделал предположение, что мы включили исключения, когда мы создали соединение PDO.

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

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

+0

Анонимный downvoter: что, по-вашему, отсутствует в моем ответе? Возможно, я смогу его улучшить. –

Смежные вопросы