Мой вопрос довольно прост: возможно ли использовать функции store_result()
и bind_result()
с PHP PDO?
Вот пример кода, с которым я столкнулся:
$stmt = $mysqli->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1")) { $stmt->bind_param('s', $email); // Bind "$email" to parameter. $stmt->execute(); // Execute the prepared query. $stmt->store_result(); $stmt->bind_result($user_id, $username, $db_password, $salt); // get variables from result. $stmt->fetch();
Я видел, как они использовались в контексте mysqli
, но не с PHP PDO. store_result()
и bind_result()
указаны в mysqli на www.php.net. Мне любопытно, если они действительны, или если есть сопоставимые методы.
Изменить: Очевидно, что существует некоторый перевод между двумя методами. Мое предположение заключается в том, что store_result
и bind_result()
похожи на команды fetch()
PDO.
Дело в том, что нет никакого смысла использовать ни store_result (), ни bind_result () с PDO .
Просто получайте данные и используйте их в любом месте. Это и есть точка PDO.
$sql = "SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->execute(array($email)); $row = $stmt->fetch();
Теперь у вас есть данные пользователя в массиве $row
.
Хранение результирующей строки в отдельных переменных очень редко практикуется в наши дни. Но если вы предпочитаете такой древний способ обработки данных, вы можете добавить
extract($row);
к приведенному выше коду, чтобы получить ваши глобальные переменные.
Основная проблема с mysqli-way заключается в том, что чрезвычайно сложно использовать его с любым уровнем абстракции.
В реальной жизни мы никогда не вызываем базу данных в глобальном масштабе , а скорее в такой функции, как эта
function getUserData() { // getting data return $array; }
и по какой-то причине этот простой, но в основном используемый код становится чрезвычайно сложным с mysqli! В реальной жизни нам не нужны отдельные переменные, а единственный массив, который нужно вернуть. Но с mysqli нам нужно сначала получить эти переменные, а затем поместить их в массив и только затем вернуть их. Просто сумасшедший!
Вместо store_result
и bind_result
; вы можете использовать list
построений языка. Пример использования:
$stmt = $pdo->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1") $stmt->bindValue( 1, $email, PDO::PARAM_STR); $stmt->execute(); list($user_id, $username, $db_password, $salt) = $stmt->fetch( PDO::FETCH_NUM );
PDO::FETCH_NUM
используется, потому что:
list()
работает только на числовых массивах и предполагает, что числовые индексы начинаются с 0.
Это возможно, и я недавно использовал в своем проекте.
$prep_stmt = "SELECT id FROM member WHERE username = ? LIMIT 1"; $stmt = $mysqli->prepare($prep_stmt); if ($stmt) { $stmt->bindparam(1, $username); $stmt->execute(); $result=$stmt->fetchALL(PDO::FETCH_OBJ); } if ($stmt->rowCount() == 1) { echo"user exist"; $stmt->close(); }