php:sql查询-避免错误

php:sql查询-避免错误,php,mysql,error-handling,Php,Mysql,Error Handling,我编写了一个小数据库类,如下所示: class dbClass extends mysqli { public function execute($sq) { $res = parent::query($sq); $rs = $res->fetch_array(); return $rs; } } 到目前为止还可以工作,但问题在于运行删除查询(“从mytable中删除,其中..”) 该类在该行抛出一个错误:$rs=$res->fetch_

我编写了一个小数据库类,如下所示:

class dbClass extends mysqli
{
    public function execute($sq)
    {
    $res = parent::query($sq);
    $rs = $res->fetch_array();
    return $rs; 
    }
}
到目前为止还可以工作,但问题在于运行删除查询(“从mytable中删除,其中..”) 该类在该行抛出一个错误:$rs=$res->fetch_array();(因为我猜它不会返回任何内容)

问题是:我如何捕捉这个错误?它不应该在诸如insert、delete、update之类的查询上执行fetch_array()

谢谢

对于其他类型的SQL语句, 插入、更新、删除、删除等, mysql_query()在成功时返回TRUE 或错误为FALSE

如果结果类型为布尔类型,则必须检查其类型“不获取”

另一种解决方案是发送保存查询类型的addition参数,并在获取之前检查该类型

    public function execute($sq)
    {
      $res = parent::query($sq);
      if (is_bool($res))
      {
       //not to fetch
      }
      else
      {
        $rs = $res->fetch_array();
      }

      return $rs; 
    }

什么是父::查询代码

您只需检查阵列是否存在
fetch_array()
函数中使用
isset
,如果未设置,则返回空数组或null。

我猜在这种情况下,
$res
返回
null
,因此测试:

$res ? $rs = $res->fetch_array() : $rs = $res;

其他PHP库使用两个不同的函数。例如,PHP使用
PDO::query
查询返回结果集的查询(即
SELECT
)和
PDO::exec
查询不返回任何结果,除了受影响的行数(即
更新
删除
,等等)。

如前所述,查询函数不会在写入查询时返回结果集


编写自己的db类时,请抓住机会区分写查询和读查询。使它们具有不同的功能。通过这种方式,您可以使用简单的数据库主从复制更容易地扩展,因为您总是希望向主服务器写入数据,但从其中一个从服务器读取数据。您还可以更轻松地切换到其他数据库扩展,如PDO。

我强烈警告不要使用没有错误检查的函数。因此,我的建议是——这段代码在任何情况下都将返回一个数组。如果有错误,数组将只有一行在维度[0]中包含“error”,在维度[1]中包含错误消息

如果查询没有返回结果,代码将返回[0]=“OK”和[1]=受影响的行数

如果查询确实返回结果,则代码将构建一个包含返回行的resultset

$retarray = array();

    $result = $mysqli->query($sq);
    if (!$result) {
       $err = $mysqli->error;
       echo $err;
        $retarray = array(array("Error",$err));

        return $retarray;
    }else {
        if (is_bool($result)){
            $retarray = array(array("OK",$mysqli->affected_rows));

        return $retarray;
        }else{
             while ($row = $result->fetch_array()) {
            array_push($retarray,$row);
        }
        }

        $result->close();
        return $retarray;
    }

一个选项是将delete之类的操作转移到函数,根据该选项,不执行fetch_数组,另一个选项是将函数分离到每个操作您是否只计划获取查询返回的第一行,还是希望数组包含查询中的所有行?不,相同的代码将不起作用。当$res为“真”时会发生什么?你是对的。编辑以反映这一点。仅当$res返回null或数组时,代码才起作用。