【问题标题】:Mysqli bind_param errorMysqli bind_param 错误
【发布时间】:2016-04-22 11:53:10
【问题描述】:

我的准备语句有问题,我在堆栈中搜索了答案,并尝试了很多都无济于事,我检查了插入语句是否正确,我也尝试过使用该语句作为常规语句似乎有效的声明, 我得到的错误如下

Fatal error:call to function bind_param()on a non object in ** on line 23

当我对第一个查询使用普通查询时,第二个不会显示错误

代码是

public function reg_user($name,$username,$password,$email){
        $password = password_hash($password);
        $stmt = $this->db->prepare("SELECT uid FROM users WHERE uname= ? OR uemail = ?");
        $stmt->bind_param("ss", $username,$email);
        $stmt->execute();
        $count_row = $stmt->num_rows; 
        if($count_row == 0){
            $stmt = $this->db->prepare("INSERT INTO users (uname,upass,fullname,uemail) VALUES(?,?,?,?)");
            $stmt->bind_param("ssss", $username,$password,$name,$email); //line 23 
            $return = $stmt->execute();
            return $return;
        } else{
            return false;
        }
    }

【问题讨论】:

  • 不能同时绑定多个参数。您应该将它们作为数组传递给execute(),或者每次绑定一个参数。前者更模块化,冗余更少
  • 错误不能出现在第23行——代码只有15行!
  • 是的,但它是包含更多行的类的一部分,当这是有错误的函数时,发布完整类是没有意义的
  • 不知道这里有没有人对真实的解释感兴趣。

标签: php mysqli


【解决方案1】:

在第一个$stmt->execute之后添加这两行代码

$result = $stmt->get_result();
$count_row = $result->num_rows;

您的代码失败的原因是因为您试图从 Prepared Statement 对象而不是 Result 获取行数

【讨论】:

  • 在尝试标准查询后忘记将其改回准备,更新问题以添加回准备中,这也给了我同样的问题
  • 那么错误是第二次调用bind_param引起的?
  • 第 23 行是第二个绑定,它给出了错误但使用标准查询的第一个绑定工作,这让我感到困惑
  • 在第一个 $stmt->execute 之后尝试添加以下代码: $result = $stmt->get_result(); $count_row = $result->num_rows;如果可行,现在让我来编辑答案
  • 成功了!编辑你的答案,我会标记为答案
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2016-03-03
相关资源
最近更新 更多