提问人:Agustin Menendez 提问时间:8/19/2023 最后编辑:halferAgustin Menendez 更新时间:8/22/2023 访问量:188
调用未定义的方法 mysqli::execute_query()
Call to undefined method mysqli::execute_query()
问:
这是我正在使用的文件:
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 8 >= 8.2.0)”。execute_query
这是 PHP 8.2 中的一个新功能,在撰写本文时,它是 PHP 的最新版本。
要使用该功能,您需要升级 PHP 安装。(请注意,很容易安装不同版本的 PHP 以供命令行和 Web 服务器使用,因此请确保升级与 Web 服务器关联的版本)。
或者,您可以使用较旧的方法(在上面链接的博客文章中进行了详细介绍)并依次调用 、 和。prepare
bind_param
execute
get_result
通过检查当前的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 连接并终止您的数据库服务器。数据库连接应改为作为构造函数参数传递。
因此,必须报废当前的形式,而类应该像这样:modeloBd
modeloLogin
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;
}
}
评论