我写了一个小数据库类,如下所示:
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()。
谢谢!
答案 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
用于不返回任何结果的查询,除了受影响的数量行(即UPDATE
,DELETE
等等。
答案 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;
}