gpt4 book ai didi

php - 扩展 mysqli_result

转载 作者:可可西里 更新时间:2023-11-01 00:36:34 24 4
gpt4 key购买 nike

我已经扩展了 PHP 的 mysqli 类,它工作正常。但是如何让它在查询时返回自定义结果对象(或用于插入/更新/删除等的 bool 值)?

namespace MyApp;
class MySQLi extends \mysqli {
public function query($query, $resultmode = null) {
// This needs to return a MySQLiResult or a boolean
}
}
class MySQLiResult extends \mysqli_result {
}

这样做我可以返回一个 MySQLiResult 对象,但我不知道如何为非基于选择的查询返回一个 bool 值:

public function query($query, $resultmode = null) {
$this->real_query($query);
return new MySQLiResult($this);
}

更新:

这是我最终使用的:

class MySQLi extends \mysqli {

public function query($query, $resultmode = null) {
$result = parent::query($query, $resultmode);
return is_bool($result) ? $result : new MySQLiResult($result);
}

}


class MySQLiResult {

private $result;

public function __construct(mysqli_result $result) {
$this->result = $result;
}

public function __call($name, $arguments) {
return call_user_func_array(array($this->result, $name), $arguments);
}

public function __set($name, $value) {
$this->result->$name = $value;
}

public function __get($name) {
return $this->result->$name;
}

}

最佳答案

Phil 的回答没问题,但可以通过检查 mysqli::field_count 来扩展 MySQLi_Result。查看documentation对于 mysqli::field_count

This function can be useful when using the mysqli_store_result() function to determine if the query should have produced a non-empty result set or not without knowing the nature of the query.

这正是我们所需要的。

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;
}

throw new MySQL_Exception($this->error, $this->errno);
}
}

现在您可以从 MySQLi_Result 扩展您的结果类并实现一些有用的接口(interface),例如 SeekableIterator,这样您就可以在您的结果集上使用 foreach:

class MySQL_Result extends MySQLi_Result implements Countable, SeekableIterator, ArrayAccess
{
...
}

关于php - 扩展 mysqli_result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195377/

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