gpt4 book ai didi

php - 扩展 mysqli_result - 它使用 store_result() 还是 use_result()

转载 作者:可可西里 更新时间:2023-10-31 23:45:28 26 4
gpt4 key购买 nike

我用返回 mysqli_result 的子项的查询方法编写了一个 mysqli 的子项。此结果子项将具有我的应用独有的其他方法。

public MySQL extends mysqli
{
public function query($query)
{
if ($this->real_query($query)) {
if ($this->field_count > 0) {
return new MySQL_Result($this);
}
return true;
}
return false;
}

}

class MySQL_Result extends mysqli_result
{
public function fetch_objects() {
$rows = array();
while($row = $this->fetch_object())
$rows[$row->id] = $row;
return $rows;
}
}

我无法弄清楚的是 fetch_object() 使用缓冲的还是非缓冲的 SQL 数据。

mysqli_result 的构造函数在 mysqli.php 中不可见,所以我看不到它是否调用了 $mysqli->store_result()$mysqli->use_result()

我尝试将这些方法添加到 MySQL 但两个函数都没有回显。

    public function store_result($option='a') {
echo "STORE RESULT<br/>";
}

public function use_result($option='a') {
echo "USE RESULT<br/>";
}

这是否意味着 mysqli_result 构造函数也不调用?如果是这样,它如何在调用 fetch_object 时访问 SQL 数据?

我想要缓冲的 SQL 数据。如果我无法弄清楚子构造函数在做什么,我可能必须用调用 $mysqli->store_result() 的装饰器替换结果子类。

最佳答案

答案都不是。 mysqli_result 的构造函数不调用任何这些方法。但是,mysqli_query() 在内部调用 mysql_store_result()mysql_use_result(),它们是 C 级 API 函数。即使你扩展了 mysqli 类,你也不会看到你的新方法被调用。您必须了解 mysqli 扩展是用 C 语言而不是 PHP 语言编写的。代码的编写方式不能很容易地用 PHP 表达。

如果您使用 mysqli::real_query() 来执行 SQL,那么您需要注意调用 mysqli_store_result()mysqli_use_result() 自己运行。当然,这些函数将返回 mysqli_result 对象而不是你的 MySQL_Result 对象。从此类继承将是不可能的。

您可以使用组合而不是继承。您将从这两个函数中的任何一个获取的 mysqli_result 对象传递给 MySQL_Result 类的构造函数。

例如:

class MySQL
{
private mysqli $mysqli;

public function __construct(string $host, string $username, string $passwd, string $dbname)
{
$this->mysqli = new mysqli($host, $username, $passwd, $dbname);
}

public function query(string $query): MySQL_Result | bool
{
if ($this->mysqli->real_query($query)) {
if ($this->mysqli->field_count > 0) {
return new MySQL_Result($this->mysqli->store_result());
}
return true;
}
return false;
}
}

class MySQL_Result
{
public function __construct(private mysqli_result $result)
{
}

public function fetch_objects()
{
$rows = array();
while ($row = $this->result->fetch_object()) {
$rows[$row->id] = $row;
}
return $rows;
}
}

重要提示:您需要的功能已通过 PDO 提供。如果您没有充分的理由使用 mysqli,请尝试使用 PDO。

关于php - 扩展 mysqli_result - 它使用 store_result() 还是 use_result(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com