【发布时间】:2019-04-02 21:10:20
【问题描述】:
我正在寻找构建处理程序或编辑 php 对象的方法,以下是 mysqli 的示例
我有一个包含许多文件的系统,在变量中使用 mysqli 对象
$my_var=new mysqli($host, $user, $pass, $base);
文件调用它来执行查询并获得如下结果:
$q=$my_var->query("SELECT * FROM table");
$q->fetch_assoc();
如果查询出现错误,$my_var->error 将在第一行填充,并在第二行抛出错误 500。
我正在寻找一种方法来为$my_var->error 构建处理程序并在调用任何 fetch_* 方法之前抛出错误,所以,
有没有办法为$my_var->error 构建处理程序/侦听器?
如果这不可能,有没有办法覆盖mysqli fetch_assoc()、fetch_row() 和fetch_array() 方法来检查$my_var->error 是否为真并在继续之前显示错误?
我知道try{}catch()、throw new Exception和or die()方法,但这些方法意味着编辑系统中的每个fetch_*,我只想编辑连接文件。
谢谢!
---编辑---
我认为准备好的陈述不是我想要的。
---编辑2---
不,我不是在寻找如何获取 mysqli 错误。
感谢您的帮助!
---回答最终代码---
class mysqli2{
private $c;
function __construct(...$args){ // open connection
$this->c=new mysqli(...$args);
if(!empty($this->c->error)){ // check for errors
echo("<script>console.error(\"MySQL: ".$this->c->error."\");</script>");
}
}
function query($query, $resultmode = MYSQLI_STORE_RESULT){
$r=$this->c->query($query, $resultmode); // make query
if(!empty($this->c->error)){ // check for errors
echo("<script>console.error(\"MySQL: ".$this->c->error."\");</script>");
}
return $r; // returns query results
}
function __call($method, $args){ // calls others mysqli methods
return $this->c->$method(...$args);
}
function __get($name){ // get all the properties
return $this->c->$name;
}
function __set($name, $value){ // set all the properties
if (property_exists($this->c, $name))$this->c->$name = $value;
}
}
【问题讨论】:
-
您需要为您的 mysqli 对象创建一个包装器或数据库抽象层 (DBAL),它可以处理
mysqli所做的所有方法。我建议在编写自己的库之前查看其他预先存在和维护的库,例如 Doctrine 或 Eloquent。 -
你想要一个 posabbol;ity 来在一个循环内累积一个异常吗?
-
@fyrye 如果你对此有强烈的感觉,你应该使用
@Machavityping Machavity,就像我在这里为你做的那样。他们会收到 ping,如果他们同意,他们会重新打开。 -
感谢@FunkFortyNiner - @Machavity 这个问题与标记为重复的任何一个问题都无关。 OP 正在询问如何覆盖
mysqli::query的默认功能,以便在不显式处理异常的情况下提前强制抛出异常。认为代码块内的 ping 不起作用。