获取mysqli结果时如何在while循环内抛出异常?
Posted
技术标签:
【中文标题】获取mysqli结果时如何在while循环内抛出异常?【英文标题】:How to throw an exception inside a while loop when fetching mysqli result? 【发布时间】:2012-07-27 08:50:02 【问题描述】:我以 OOP 方式使用 mysqli 准备好的语句。一切都按预期工作,但我似乎找不到任何关于如何检测然后在 while 循环期间抛出异常的文档。这就是我的代码目前的状态,并且运行良好。
$rslt=array();
$data=array();
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']);
while($stmt->fetch())
$data[]=$rslt;
但是它不包含抛出异常的方法。这就是我在类似脚本中抛出异常的方式,该脚本限制为 1 个结果(因此我不需要在此示例中循环它们)。
$rslt=array();
$data=array();
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']);
if(!$stmt->fetch())
throw new Exception('Failed to fetch results', 1);
$data[]=$rslt;
我几乎正在尝试执行以下代码中的操作,但它会引发以下错误:-
"解析错误:语法错误,第 95 行的 xxx/xxx/includes/_xxxClass.php 中出现意外的 T_THROW
while($stmt->fetch())
$data[]=$rslt or throw new Exception('Failed to fetch results', 1);
我正在寻找一种方法来查看获取结果是否有错误,然后在我的 while 循环中抛出异常。
提前致谢!
【问题讨论】:
不起作用到底是什么意思? 你指的是代码块#3吗?我收到一个 PHP 错误,告诉我我所做的包含无效的语法。这应该是正确的吗? 好的,等一下,我再运行一次。谢谢。 这就是我得到的“解析错误:语法错误,第 95 行 xxx/xxx/includes/_xxxClass.php 中的意外 T_THROW”。第 95 行包含此代码“$data[]=$rslt or throw new Exception('Failed to fetch results', 1);”。 【参考方案1】:您正在执行的测试有缺陷。 mysqli::fetch()
在失败时返回 false,因此您的 while 循环将在看到 false 时立即退出。如果没有返回结果,则循环不会执行,$data 将为空。
您需要做的是测试在 while 循环之后是否填充了 $data,然后如果它为空则抛出异常:-
while($stmt->fetch())
$data[]=$rslt;
if(empty($data)) throw new Exception('Failed to fetch results', 1);
经过反思,您不应该仅仅因为没有返回结果就抛出异常,只需返回空数组:-
Exceptions 用于处理异常情况,空结果集并不例外。
【讨论】:
我使用的是 Mysqli 准备好的语句,而不是 PDO。但是根据文档php.net/manual/en/mysqli-stmt.fetch.php,方法 fetch() 也会在失败时返回 FALSE。所以理论上我可以应用你上面提到的同样的逻辑? 对不起,我的错误,但是是的,同样的逻辑也适用。 太棒了,谢谢。如果发生错误,这是在我的 while() 语句的每个循环期间检查的更好选择。当然这在资源上也一定更好吗? 对不起,我会支持你,但它需要 15 的声誉 :( 将你标记为已接受的答案【参考方案2】:考虑到$mysqli
您可以尝试使用 mysqli 处理程序:
if ($mysqli->errno) // an error occurred, throw exception
【讨论】:
我会在我的 while 循环中还是在它之前使用它?一个例子是理想的,谢谢。 感谢您的帮助,所以这将是 if 语句的正确用法吗? pastebin.com/1nRqTGSq 刚刚注意到我在第 3 行遗漏了一个分号,假设这将被修复以进行部署!以上是关于获取mysqli结果时如何在while循环内抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章