调用未定义的方法 mysqli::execute_query()

Call to undefined method mysqli::execute_query()

提问人:Agustin Menendez 提问时间:8/19/2023 最后编辑:halferAgustin Menendez 更新时间:8/22/2023 访问量:188

问:

这是我正在使用的文件:

modeloBd.php

<?php
class modeloBd
{
    private static $server = "127.0.0.1";
    private static $user = "root";
    private static $password = "";
    private static $dbname = "bd";

    protected $conn;

    protected function __construct()
    {
        $conexion = new mysqli(self::$server, self::$user, self::$password, self::$dbname);
        if ($conexion->connect_error) {
            die("Error en la conexión a la base de datos: " . $conexion->connect_error);
        } else {
            $this->conn = $conexion;
        }
    }
}

modeloLogin.php

<?php
require_once "modeloBd.php";

class modeloLogin extends modeloBd
{
    public function __construct()
    {
        parent::__construct();
    }

    public function existe($ci)
    {
        $query = "SELECT * FROM `Usuarios` WHERE ci = ? LIMIT 1";
        $result = $this->conn->execute_query($query, [$ci]);
        $num = mysqli_num_rows($result);
        return $num;
    }

controladorLogin.php

<?php
require '../Modelo/modeloLogin.php';
require '../Modelo/modeloToken.php';

class controladorLogin
{
    public static function chequear($content)
    {
        $ci = $content['post']['ci'];
        $contrasenia = $content['post']['contrasenia'];
        $l = new modeloLogin();
        if ($l->existe($ci)) {
        //code
        }
    }
}

我只需要让我的查询在这里工作:

public function existe($ci)
    {
        $query = "SELECT * FROM `Usuarios` WHERE ci = ? LIMIT 1";
        **$result = $this->conn->execute_query($query, [$ci]);**
        $num = mysqli_num_rows($result);
        return $num;
    }

但相反,系统给了我这个错误:

致命错误:未捕获的错误:调用 C:\xampp\htdocs\main\Modelo\modeloLogin.php:13 中的未定义方法 mysqli::execute_query() 堆栈跟踪:#0 C:\xampp\htdocs\main\Control\controladorLogin.php(12):modeloLogin->existe('1') #1 C:\xampp\htdocs\main\Control\superControlador.php(11):controladorLogin::chequear(Array) #2 {main} 在第 13 行的 C:\xampp\htdocs\main\Modelo\modeloLogin.php 中抛出

PHP MySQLI

评论

1赞 ADyson 8/19/2023
php.net/manual/en/mysqli.execute-query.php - 记下最低版本号。
0赞 Your Common Sense 8/19/2023
感谢您提出一个非常好的问题,提供所有必需的信息,包括您尝试的确切代码和完整的错误消息。

答:

2赞 Quentin 8/19/2023 #1

文档显示“(PHP 8 >= 8.2.0)”。execute_query

这是 PHP 8.2 中的一个新功能,在撰写本文时,它是 PHP 的最新版本

要使用该功能,您需要升级 PHP 安装。(请注意,很容易安装不同版本的 PHP 以供命令行和 Web 服务器使用,因此请确保升级与 Web 服务器关联的版本)。


或者,您可以使用较旧的方法(在上面链接的博客文章中进行了详细介绍)并依次调用 、 和。preparebind_paramexecuteget_result

2赞 Your Common Sense 8/19/2023 #2

通过检查当前的PHP版本并在需要时扩展类,可以很容易地减轻这种不便。mysqli

您可以将这样的代码添加到创建数据库连接的位置

$mysqli_class_name = 'mysqli';
if (version_compare(PHP_VERSION, '8.2', '<')) {

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    function mysqli_execute_query(mysqli $mysqli, string $query, ?array $params = null)
    {
        $stmt = $mysqli->prepare($query);
        if ($params) {
            $types = str_repeat("s", count($params));
            $stmt->bind_param($types, ...$params);
        }
        $stmt->execute();
        return $stmt->get_result();
    }    
    
    class my_mysqli extends mysqli {
        public function execute_query(string $query, ?array $params = null)
        {
            return mysqli_execute_query($this, $query, $params);
        }
    }
    $mysqli_class_name = 'my_mysqli';
}
$mysqli = new $mysqli_class_name($hostname, $username, $password, $dbname);

此代码将普遍适用于任何 PHP 版本 >= 7.0。如果当前 PHP 版本低于 8.2,它将使用 mysqli 类的扩展版本,否则使用原始类。


请注意,切勿在模型中创建数据库连接。这样,您的代码将创建数百个 mysql 连接并终止您的数据库服务器。数据库连接应改为作为构造函数参数传递。

因此,必须报废当前的形式,而类应该像这样:modeloBdmodeloLogin

class modeloLogin
{
    protected $conn;
    public function __construct(mysqli $mysqli)
    {
        $this->$conn = $mysqli;
    }

    public function existe($ci)
    {
        $query = "SELECT * FROM `Usuarios` WHERE ci = ? LIMIT 1";
        $result = $this->conn->execute_query($query, [$ci]);
        $num = mysqli_num_rows($result);
        return $num;
    }
}