替换mysqli_stmt :: get_result的替代函数

时间:2015-05-19 20:41:44

标签: php mysqli prepared-statement

我使用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是否有任何解决方法?

2 个答案:

答案 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.