嗨,
我有以下代码:
$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 建立连接后 -
- 使用 ? 准备好的查询占位符是相同的。
- 调用 ->prepare() 方法是一样的。
- 您无需显式使用 mysqli 的 bind_param() 方法,而是将输入值数组提供给 ->execute([…]) 调用。
- 如果您使用最后一个插入 ID 或受影响的行数,则有等效的 PDO 调用。
- 对于准备好的和未准备好的 SELECT 查询,您可以使用 ->fetch() 方法(一行)、->fetchAll() 方法(所有行)或偶尔使用 ->fetchColumn() 方法直接获取数据(一行中的特定列。)
- 将数据提取到 php 变量后,使用该数据的其余代码应保持不变。如果您还没有使用这种设计模式,它将您的数据库特定代码与您的演示代码分开,这将是进行此更改的好时机,因此如果您需要再次更改数据库特定代码,您将不会需要触摸您的演示代码。