为什么直接将mysqli_stmt::get_result()作为函数参数传递会报错?
报错根本原因
- 核心问题是你在代码中重复调用了
mysqli_stmt::get_result()方法,该方法对于同一个已执行的预处理语句仅能调用一次,第二次及后续调用都会返回false而非mysqli_result对象。 - 对应你给出的代码执行顺序逻辑:
- 预处理语句执行后,你先调用了一次
$stmt_SelCusts->get_result(),把返回的结果集对象存入了$rslt_SelCusts变量,这一步已经把MySQL返回的结果集从缓冲区全部取出,预处理语句对应的结果缓冲区会被清空。 - 后续你又直接把
$stmt_SelCusts->get_result()作为参数传入函数,这是第二次调用该方法,此时已经没有可用的结果集可以读取,方法返回false。
- 预处理语句执行后,你先调用了一次
- 函数接收到的
$rslt参数是布尔值false,不属于对象,访问$rslt->num_rows自然就触发了「尝试获取非对象的属性」的Notice报错。
验证方法
你可以在两次get_result()调用后分别打印返回值确认该特性:
$stmt_SelCusts->execute(); // 第一次调用,输出object(mysqli_result)#x (x) { ... } var_dump($stmt_SelCusts->get_result()); // 第二次调用,输出bool(false) var_dump($stmt_SelCusts->get_result());
补充说明
如果你删除第一次将结果集存入变量的代码,直接把get_result()的返回值传入函数,是不会出现报错的,本质和存入变量再传入一致,都是仅调用一次get_result()获取结果集。
内容的提问来源于stack exchange,提问作者SSteven
相关产品推荐
相关产品推荐

