求助:运行PHP代码时出现mysqli_stmt::bindvalue()未定义方法错误
解决mysqli_stmt::bindvalue()未定义的致命错误
嘿,这个问题我太熟了——你这是把PDO和MySQLi的API搞混啦!bindValue()是PDO语句对象的方法,但你用的是MySQLi的mysqli_stmt对象,它根本没有这个方法,所以才会抛出“调用未定义方法”的致命错误。
核心问题&修复方案
MySQLi绑定参数要用bind_param()方法,而且它的用法和PDO的bindValue()还有点不一样:
- 第一个参数必须是类型字符串,用来指定后续每个参数的数据类型;
- 后续参数必须是变量的引用,不能直接传字面量。
举个例子,假设你的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
相关产品推荐
相关产品推荐

