我使用MySQL prepare语句在localhost中构建我的应用程序,如下所示:
include('db.php');
$stmt = $mysqli->prepare("SELECT * FROM `hero` WHERE name=? LIMIT 1") or die($mysqli->error);
$stmt->bind_param('s', $name);
$name = 'superman';
$stmt->execute();
$check = $stmt->get_result();
$rows = $check->fetch_object();
$num = $check->num_rows;
if($num == 0){
echo 'Failed!';
}else{
echo 'Found!';
}
查询在localhost中工作正常,当我在Web托管中测试时显示错误:
致命错误:调用未定义的方法mysqli_stmt :: get_result()......
经过一些网络研究,问题是它是由mysqld
驱动程序没有安装在托管中引起的(PHP版本5.4 ++,我认为5.3以后已经可用了吗?)。
使用替代方式而不是mysqli_stmt::get_result
是否有任何解决方法?
答案 0 :(得分:0)
我遇到了同样的问题。您可以联系您的托管服务提供商或找到解决此问题的方法..
mysqlnd是PHP 5.3的源代码,但没有使用所有发行版进行编译,它是5.4 +的默认值
建议的解决方法: 你可以试试mysqli_stmt_bind_result或完全取代用PDO准备的mysqli
答案 1 :(得分:0)
(注意:我使用的是PHP 7.x,所以这可能对您不起作用!)
我知道一直在谈论“ mysqli_stmt_get_result”不起作用。 我遇到了这个问题!请参考以下链接:PHP Fatal error: Call to undefined function mysqli_stmt_get_result()
(请参阅Jeff的回答)。 我的主机有mysqlnd驱动程序,但没有nd_mysqli驱动程序。 那可能是相关的。我不确定。
我想我找到了一种替代方法
// assumes execution of a prepared statement
// for example: "SELECT * FROM table WHERE important_field LIKE ?"
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_array($result,MYSQLI_NUM);
我对数组和引用做了一些奇怪的事情。
$row = array();
$references_array2 = array();
for($i=0; $i<$stmt->field_count; $i++){
$row[] = "";
$references_array2[] = &$row[$i];
}
array_unshift($references_array2,$stmt);
$status = call_user_func_array("mysqli_stmt_bind_result",$references_array2);
每当我要填充行数组时,我都会调用:
$fetch_status = mysqli_stmt_fetch($stmt);
我根据文档中的规则在while循环或if语句中检查fetch_status变量: https://www.php.net/manual/en/mysqli-stmt.fetch.php
我建议在与NULL或FALSE进行比较时使用三元等于运算符(“ ===”),以避免两个值(和类型)之间的混淆。
if ($fetch_status === NULL){
// No more rows/data exists or data truncation occurred
} elseif ($fetch_status === FALSE) {
// Error occurred
} // more code, etc.