You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:运行PHP代码时出现mysqli_stmt::bindvalue()未定义方法错误

解决mysqli_stmt::bindvalue()未定义的致命错误

嘿,这个问题我太熟了——你这是把PDO和MySQLi的API搞混啦!bindValue()是PDO语句对象的方法,但你用的是MySQLi的mysqli_stmt对象,它根本没有这个方法,所以才会抛出“调用未定义方法”的致命错误。

核心问题&修复方案

MySQLi绑定参数要用bind_param()方法,而且它的用法和PDO的bindValue()还有点不一样:

  1. 第一个参数必须是类型字符串,用来指定后续每个参数的数据类型;
  2. 后续参数必须是变量的引用,不能直接传字面量。

举个例子,假设你的add_post方法原本是这么写的(报错的部分):

// 错误写法:误用了PDO的bindValue()
public function add_post($user_id, $post_content){
    global $conn;
    $query = $conn->prepare("INSERT INTO posts (user_id_p, post_content) VALUES (?, ?)");
    $query->bindvalue(1, $user_id); // 这里就是报错的第28行!
    $query->bindvalue(2, $post_content);
    $query->execute();
}

改成MySQLi正确的写法:

// 正确写法:使用mysqli_stmt的bind_param()
public function add_post($user_id, $post_content){
    global $conn;
    $query = $conn->prepare("INSERT INTO posts (user_id_p, post_content) VALUES (?, ?)");
    // 第一个参数"is"表示:第一个变量是整数(int),第二个是字符串(string)
    // 类型符对应规则:i=整数,s=字符串,d=浮点数,b=二进制数据
    $query->bind_param("is", $user_id, $post_content);
    $query->execute();
}

额外提醒:你的posts()方法也有小问题

顺便看了眼你的posts()方法,里面用的fetchAll()也是PDO的方法,MySQLi的mysqli_stmt对象不能直接这么用。要获取所有结果,得先调用get_result()拿到结果集,再用fetch_all():

public function posts(){
    global $conn;
    $query = $conn->prepare("SELECT * FROM `posts`,`users` WHERE userId = user_id_p ORDER BY `post_id` DESC");
    $query->execute();
    // 获取结果集,再取出所有关联数组格式的数据
    $result_set = $query->get_result();
    return $result_set->fetch_all(MYSQLI_ASSOC);
}

这样修改后,两个方法都能正常工作啦。

内容的提问来源于stack exchange,提问作者R.Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:32