fapchat
@fapchat

Почему fetch() возвращает bool?

Вот часть моего кода
if (isset($_POST['email1']) && isset($_POST['password1']))
   {
       $email = $_POST['email1'];
       $password = $_POST['password1'];
      //$hashed_password = password_hash($password, PASSWORD_DEFAULT);   
      if (!($stmt = $connection->prepare("SELECT * FROM users WHERE email = ?"))) 
      {
          echo "Prepare failed: (" . $connection->errno . ") " . $connection->error;
      } 
      if (!$stmt->bind_param("s", $email)) 
      {
          echo "Не удалось привязать параметры: (" . $stmt->errno . ") " . $stmt->error;
      }
      if (!$stmt->execute()) 
      {
          echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
      }
      $result = $stmt->fetch();
      $hashed_password = $result["password"];
      if (password_verify($password, $hashed_password)) 
      {            
          echo "Вы успешно залогинились";
          $stmt->close();
      }
   }

Я множество форумов перечитал. И как я понял, при использовании fetch в случае комманды SELECT, возвращается массив символов... У меня почему-то возвращается bool
Вот, что пишет php
Warning: Trying to access array offset on value of type bool in C:\Server\data\htdocs\qwert-master\index.php on line 59

То, что моя команда что-то возвращает - точно. Вот пример её использования через phpmyadmin
616752459ce3e539027060.png
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
karabanov
@karabanov
Системный администратор
$result = $stmt->fetch(PDO::FETCH_ASSOC);

PDOStatement::fetch
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Во-первых, вместо fetch надо использовать get_result|fetch_assoc.

Во-вторых, это какой-то жутко древний код, в нем очень много лишнего.
Недавно, наконец-то, весь этот ужас из документации убрали, и там можно увидеть нормальный пример

// перед коннектом говорим mysqli чтобы сообщала об ошибках сама, 
// чтобы не проверять каждую команду вручную
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

// и дальше просто
$stmt = $connection->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$hashed_password = $row["password"];
if (password_verify($password, $hashed_password)) 
{            
      echo "Вы успешно залогинились";
}
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
У вас все смешалось, соединение, стэйтмент, резалт...
....
if (!$stmt->execute()) 
      {
          echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
      }
$result = $stmt->get_result();
$row = $result->fetch_assoc();
var_dump($row);
Ответ написан
Комментировать
toxa82
@toxa82
$stmt->bind_param("s", $email)
Почему "s" если у вас там вопросительный знак и должен быть "0"? Включите вывод ошибок и посмотрите что у вас в реальности получается в sql, у вас в запросе ошибка, и я подозреваю что из-за неправильного бинда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽