mysqli_stmt_num_rows с подготовленным оператором не возвращает количество строк - PullRequest
0 голосов
/ 28 сентября 2019

Подготовленный оператор возвращает 0 строк, когда должен вернуть строку:

Мой код:

  $conn = mysqli_connect("localhost", "root", "", "test1");
  $myUser = "qqq";
  $stmt = mysqli_stmt_init($conn);
  $sql = 'SELECT `userMail` FROM `users` WHERE `userName`=? LIMIT 1';
  mysqli_stmt_prepare($stmt, $sql);
  mysqli_stmt_bind_param($stmt, "s", $myUser);
  mysqli_stmt_execute($stmt);
  $myresult = mysqli_stmt_num_rows($stmt);
  die(nl2br("myUser = ".$myUser."\nmyresult = ".$myresult));

Мои данные:
enter image description here

Вывод:
enter image description here


Где я ошибаюсь...?
$ myresult должен быть 1, потому что там IS такая строка ...

1 Ответ

1 голос
/ 29 сентября 2019

Как вы уже правильно заметили, вам нужно mysqli_stmt_store_result($stmt); после mysqli_stmt_execute($stmt);.
Согласно PHP документам:

Если вы используете mysqli_stmt_store_result (), mysqli_stmt_num_rows () может быть вызван немедленно.

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

То, что вы пытаетесь достичь, это проверить, существует ли конкретная строка в БД.Это можно сделать, как указано здесь: https://phpdelusions.net/mysqli/check_value

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli("localhost", "root", "", "test1");

$myUser = "qqq";

$sql = 'SELECT 1 FROM `users` WHERE `userName`=? LIMIT 1';
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $myUser);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row();

die(nl2br("myUser = ".$myUser."\nmyresult = ".$exists));

Конечно, вместо (bool) $stmt->get_result()->fetch_row() вы можете использовать (bool) $stmt->get_result()->num_rows.

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