Операторы, подготовленные PDO: как выполнить, проверить затронутые строки и извлечь поле - PullRequest
4 голосов
/ 27 декабря 2011

Я очень новичок в PDO - мне говорят только в этом направлении сегодня утром. Итак, выслушай меня. Я пытаюсь переписать свою функцию подтверждения входа из стандартного mysql_query() в подготовленное заявление PDO, но у меня возникают некоторые проблемы.

Функция loginCheck () пропускает предоставленную электронную почту и пароль, а затем извлекает соль из соответствующей электронной почты. Если число затронутых строк этого запроса было 1, примените переменную $salt к результату этого запроса.

Для последней части функции я ранее просто использовал:

// standard mysql query goes here

if (mysql_num_rows($query) == 1) {
    $salt = mysql_result($query, 0);
}

Теперь вся моя функция выглядит так:

// new mysql query below 

global $dbh;

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1");
$stmt->execute($email);

// not sure what to write here?

но у меня возникают проблемы с пониманием того, как перевести верхнюю часть кода в нечто похожее в PDO. Я также, вероятно, делаю что-то еще здесь не так (как всегда), поэтому укажите это мне тоже.

Я просмотрел руководство по PHP и просто не могу понять большую его часть. Есть идеи?

Ответы [ 2 ]

13 голосов
/ 27 декабря 2011

Я думаю, вы ищете PDOStatement::rowCount:

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`=? LIMIT 1");
$stmt->execute($email);
if ($stmt->rowCount() == 1) {
    $salt = $stmt->fetchColumn(0);
}

Я бы лучше написал это так:

$stmt = $dbh->prepare("SELECT `salt` FROM `users` WHERE `email`= :email LIMIT 1");
$stmt->execute(compact('email'));

$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
    // work with $user['salt']
}

Явное именование является более надежным, чем в зависимости от количества столбцов.


Чтобы понять руководство, вам необходимо понять объектно-ориентированные обозначения / понятия. Документация для PDO класса выглядит следующим образом:

PDO {
   ...
   PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
   ...
}

Это означает, что объект PDO ($dbh в вашем примере) имеет метод prepare, который возвращает объект PDOStatement. Вы используете это так:

$stmt = $dbh->prepare(...);

Итак, $stmt - это PDOStatement объект. Зная это, вы можете посмотреть документацию для PDOStatement и увидеть, что у нее есть метод int PDOStatement::rowCount ( void ), который вы можете использовать.

2 голосов
/ 27 декабря 2011

Вот мой любимый учебник по PDO.Он отвечает на все ваши вопросы:

...