php:sql-query - 避免错误

时间:2011-04-27 06:48:10

标签: 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_array(); (因为它不会返回任何我猜的东西)

问题是:我如何捕获此错误?它应该很简单,不要对插入,删除,更新等查询执行fetch_array()。

谢谢!

6 个答案:

答案 0 :(得分:3)

  

对于其他类型的SQL语句,   INSERT,UPDATE,DELETE,DROP等,   mysql_query()成功返回TRUE   错误时为FALSE。

如果是布尔类型,则必须检查结果的类型。

另一个解决方案可以是发送附加参数,该参数保存查询类型并在获取之前检查该类型。

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

      return $rs; 
    }

答案 1 :(得分:1)

什么是parent ::查询代码?

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

答案 2 :(得分:0)

我猜测$res在这种情况下会返回null,所以请测试一下:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我强烈警告一个没有错误检查的函数。所以这是我的建议 - 这个代码将在每种情况下返回一个数组。如果出现错误,则数组中只有一行在维[0]中包含“错误”,而错误消息在维[1]中。

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

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

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