переменные не выводятся из оператора mysqli после привязки - PullRequest
0 голосов
/ 26 мая 2020

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

 $sql = "SELECT id, email, username FROM users WHERE email = ?";
    if ($stmt = mysqli_prepare($link, $sql)) {
      mysqli_stmt_bind_param($stmt, "s", $param_email);
      $param_email = $email;
      if (mysqli_stmt_execute($stmt)) {
        mysqli_stmt_store_result($stmt);
        if (mysqli_stmt_num_rows($stmt) == 1) {
          mysqli_stmt_bind_result($stmt, $id, $email, $username);
          $error = 0;
          $to = $email;
          echo "id:".$id;
          echo $username;
          echo $email;
        } else {
         //some stuff
        }
      } else {
        $error = 1;
      }
    }

Что мне не хватает?

1 Ответ

2 голосов
/ 26 мая 2020

Причина, по которой вы не видите никаких значений, извлеченных из базы данных, заключается в том, что вы забыли вызвать fetch() после bind_result().

Однако вы слишком усложняете. Вам не нужно так много операторов if, и вы не должны использовать bind_result(), если у вас более одного столбца. Это становится очень запутанным. Используйте get_result() для получения результатов, а затем выберите единственную строку, которая вам нужна (при условии, что адрес электронной почты уникален, а ваш SELECT возвращает 0 или 1 записи).

$stmt = $link->prepare("SELECT id, email, username FROM users WHERE email = ?");
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();

if ($result) {
    $error = 0;
    $to = $result['email'];
    echo "id:".$result['id'];
    echo $result['username'];
    echo $result['email'];
} else {
    $error = 1;
}

Нет необходимости в mysqli_stmt_num_rows. Сами данные говорят вам, было что-то возвращено или нет. Это также защищает вас от аналогичной проблемы при использовании небуферизованных запросов. Легко случайно пропустить mysqli_stmt_store_result().

Никогда не проверяйте возвращаемое значение mysqli_stmt_execute() или mysqli_prepare(). Это ужасная и грязная практика. Убедитесь, что у вас включен отчет об ошибках. См. Как получить сообщение об ошибке в MySQLi?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...