我一直在寻找这方面的答案已经有一段时间了,但似乎以前没有人能解决这个问题。也许你们中的一些人能够并且愿意帮我解决这个问题......那太好了!
我目前正在开发一个mysqli包装器并尝试为已准备好的语句实现自定义结果类,就像我对标准查询一样!似乎结果是在stmt的“执行”方法中生成的,但我仍然无法理解幕后发生的事情!
有没有办法(或者黑客)将生成的结果指向我的结果类而不是简单的mysqli_result,就像使用常规查询一样?
为了让您了解一下,这里有一些代码粘贴:
class extended_mysqli extends mysqli
{
public function __construct()
{
call_user_func_array(array(get_parent_class($this), 'mysqli'), func_get_args());
if ( $this->connect_errno )
{
throw new extended_mysqli_exception('database connection failure');
}
}
public function query ($query, $binds = array())
{
if ( empty( $binds ) )
{
if ( $this->real_query($query) )
{
if ( $this->field_count )
{
return new extended_mysqli_result($this, $query); // select, show, describe
}
else return true; // insert, update, delete
}
else return false; // fix
}
else
{
$stmt = $this->prepare($query);
if ( $stmt->bind_array($binds) )
{
return $stmt->execute() ? $stmt->get_result() : false;
}
else return false;
}
}
public function prepare($query)
{
return new extended_mysqli_stmt($this, $query);
}
// ...
}
class extended_mysqli_stmt extends mysqli_stmt
{
public function __construct($link, $query)
{
parent::__construct($link);
$this->prepare($query);
}
public function execute()
{
// what do i do here ???
}
}
class extended_mysqli_result extends mysqli_result implements countable, iterator, arrayaccess
{
public function __construct($link, $mode = MYSQLI_STORE_RESULT)
{
parent::__construct($this->link = $link, $mode);
}
// ...
}
答案 0 :(得分:0)
这些类是按原样使用的,所以如果你想要自己的mysqli实现,你应该使用mysqli_ *函数编写自己的包装。
mysqli可以扩展对象,但如果您希望对其结构或层次结构进行任何更改,这种方法最终会失败。
此外,大多数此类方法都信任您的输入数据,因此,如果您尝试维护安全连接,为什么不尝试其中一个999数据库抽象层并扩展该代码以满足您的需求呢?