Get_result() 在 php7.4 中工作,但在 php8 中出现错误“调用未定义方法 mysqli_stmt::get_result()”

嗨,
我有以下代码:

 

$stmt=$dbc->prepare("SELECT user_id, first_name, last_name, pass FROM users WHERE email=? ") ; $stmt->bind_param('s', $e); $stmt->execute(); if ($stmt->error){echo "something has gone wrong";} $r=$stmt->get_result(); $row = mysqli_fetch_array ( $r, MYSQLI_ASSOC ) ;

作为登录脚本的一部分。在 PHP7.4 中运行它没有问题。但是,如果我将 PHP 版本更改为 8,则脚本会停止并出现错误

 

Call to undefined method mysqli_stmt::get_result()

指线

 

$r=$stmt->get_result();

我已经通过 PHP 语法检查器运行了代码,它没有显示任何错误。https://www.php.net/manual/en/mysqli-stmt.get-result 14显示该方法同时在 PHP7 和 PHP8 中。

那么我在这里错过了什么?感激地收到任何帮助/想法/指针 - 谢谢。如果您需要我发布更多代码,请告诉我。

尝试在页面开头添加以下内容,希望会显示更多错误信息:

 

<?php declare(strict_types=1); error_reporting(-1); ini_set(‘display_errors’, ‘true’);

编辑:

同样来自在线 PHP 手册,函数名称似乎已更改:

$result = mysqli_stmt_get_result($stmt);

https://www.php.net/manual/en/mysqli-stmt.get-result.php 18

get_result 仅在 php 实际使用 msyqlnd 驱动程序连接数据库服务器时可用。这需要构建 php 以将 msyqlnd 驱动程序与 MySql 数据库扩展一起使用,并且 mysqlnd 驱动程序已启用并正常工作。如果不满足这些条件,mysqli 的 get_result、fetch_all 之类的东西就不存在,也不会起作用。

这将是切换更简单、更一致的 PDO 扩展的好时机。它没有像这样的gotya。您还希望切换到使用异常处理错误,并在建立数据库连接时将默认获取模式设置为 assoc。

使用 PDO,发布的代码将简单地变为 -

 
 
// note: building your sql query in a php variable aids debugging and reduces typing errors by separating the sql syntax from the php syntax as much as possible $sql = "SELECT user_id, first_name, last_name, pass FROM users WHERE email=?"; $stmt=$pdo->prepare($sql); $stmt->execute([$e]); $row = $stmt->fetch();

PHP8 也支持它,如果它是使用 mysqlnd 编译的。看来你的主人没有这样做。没有什么可做的。

您的选择:

  • 要求您的主机使用 mysqlnd 重新编译 PHP8
  • 切换到不同的主机
  • 切换到 PDO 而不是 MySQLi

没有太多要学的。

使用 PDO 建立连接后 -

  1. 使用 ? 准备好的查询占位符是相同的。
  2. 调用 ->prepare() 方法是一样的。
  3. 您无需显式使用 mysqli 的 bind_param() 方法,而是将输入值数组提供给 ->execute([…]) 调用。
  4. 如果您使用最后一个插入 ID 或受影响的行数,则有等效的 PDO 调用。
  5. 对于准备好的和未准备好的 SELECT 查询,您可以使用 ->fetch() 方法(一行)、->fetchAll() 方法(所有行)或偶尔使用 ->fetchColumn() 方法直接获取数据(一行中的特定列。)
  6. 将数据提取到 php 变量后,使用该数据的其余代码应保持不变。如果您还没有使用这种设计模式,它将您的数据库特定代码与您的演示代码分开,这将是进行此更改的好时机,因此如果您需要再次更改数据库特定代码,您将不会需要触摸您的演示代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值