【问题标题】:Cannot count successfully executed mysqli query无法计数成功执行的 mysqli 查询
【发布时间】:2017-05-21 15:48:00
【问题描述】:

我想看看我的查询是否成功(虽然我成功地执行了插入查询)但在第 25 行得到了这个错误:“mysqli_num_rows() 期望参数 1 是 mysqli_result, boolean given” 我已经检查每一行,我什至使用 mysqli_affected_rows 并失败了。感谢任何帮助,这是我的代码:

<?php
   include "connection.php";  
   $fn = $_POST['first_name'];
   $ln = $_POST['last_name'];
   $uname = $_POST['username'];
   $pwd = $_POST['password'];
   $stat = $_POST['status'];  
   if($fn=="" || $ln=="" || $uname=="" || $pwd=="" || $stat==""){
     echo "ALL FIELD MUST BE FILLED!";
   }                                                                        
   else {
     $sql = "SELECT * from user WHERE username='$uname'";
     $result = mysqli_query($conn, $sql);
     $number = mysqli_num_rows($result);
   if ($number != 0) {
     echo "Username $uname is not available";
   }
   else {
     $options = ['cost' => 12];
     $pwd = password_hash($pwd, PASSWORD_BCRYPT, $options);
     $query = "INSERT INTO user 
              (username,password,first_name,last_name,status) VALUES 
              ('$uname','$pwd','$fn','$ln','$stat')";
     $res = mysqli_query($conn, $query);
     $nmb = mysqli_num_rows($res);

     echo $nmb;                                                             
    }                                                                         
  }                                                                         
?>                                                                                  

【问题讨论】:

  • 第 25 行是哪一行?因为这意味着查询没有正确执行
  • 你使用的是 MySQL,我建议使用PDO。
  • @FluxCoder 这对 PDO 仍然有同样的问题。
  • @Don'tPanic 但是,使用 PDO 更安全,我更喜欢它,因为我发现它也更容易使用。
  • PDO 本身并不安全。使用准备好的语句更安全,但这在 mysqli 中也是可能的,但这里没有这样做,所以我不认为他们会用 PDO 来做。 (不过,我也更喜欢它。我同意它更容易。)

标签: php mysqli insert-into


【解决方案1】:

$nmb = mysqli_num_rows($res); 无法工作,因为$res 是 INSERT 查询的结果。 The documentation for mysqli_query 说:

失败时返回 FALSE。对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,mysqli_query() 将返回一个 mysqli_result 对象。对于其他成功的查询,mysqli_query() 将返回 TRUE。

因此,$res 将始终为false 或true,您将无法在其上使用mysqli_num_rows() 或mysqli_affected_rows()。问题是,无论如何,计算行数在这里没有任何意义。您正在尝试插入一条记录,因此它要么为 1,要么为 0,因此 true 或 false 结果应该足以让您检测查询是否成功。

【讨论】:

  • @Fred-ii- 是的,差不多。不过,我最初添加了一些误导性的 cmets,因为我认为它们最初指的是 SELECT 查询。我认为答案会更明确,并包含更好的解释,我将删除我的一些 cmets。
【解决方案2】:

改变这个:

$res = mysqli_query($conn, $query);

$nmb = mysqli_num_rows($res);

echo $nmb; 

为此:

$res = mysqli_query($conn, $query);
if ($res) { 
   echo "Insert ok";
}
else
{
   echo "Problem to insert";
}

【讨论】:

  • 基本上是 OP 在 cmets 中所说的,但 echo "Problem to insert"; 永远不会帮助他们找出查询失败的真正原因。
猜你喜欢
  • 2017-12-02
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多