mysqli_stmt_num_rows 准备好的语句没有 return 行数

mysqli_stmt_num_rows with prepared statement doesn't return number of rows

准备好的语句 returns 0 行,而它应该 return 行:

我的代码:

  $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));

我的数据:

输出:


我哪里错了...?
$myresult 应该是 1,因为有 IS 这样一行...

您已经正确地注意到在 mysqli_stmt_execute($stmt); 之后需要 mysqli_stmt_store_result($stmt);
根据 PHP 文档:

If you use mysqli_stmt_store_result(), mysqli_stmt_num_rows() may be called immediately.

但是,我需要指出您不需要它,或者实际上您根本不需要使用 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()->num_rows.

而不是 (bool) $stmt->get_result()->fetch_row()