0

有时我在这一行遇到致命错误

$result = $db->execute($query);

$primary = $result->getRows();

致命错误:在非对象上调用成员函数 getRows()

我正在寻找一种解决方案来捕获此错误并重定向到索引页面。

重写一些东西很复杂,因为系统很旧。

4

6 回答 6

1

Something like this:

$result = $db->execute($query);

if ($result===false) {
    header("Location: errorpage.php");
    exit;
}
$primary = $result->getRows();
于 2013-05-29T14:17:25.990 回答
1

首先,无论哪种方式都不应该有错误。

您必须修复代码以纠正错误,而不是编写新代码来处理它。

从 DB 中获取错误消息以查看导致此错误的特定问题并修复它。

  • 通常,您无法捕获致命错误。
  • 你不应该重定向到任何地方。如果出现错误,则必须返回“503 HTTP 标头”以及通用 503 页面。
于 2013-05-29T14:24:04.747 回答
0

通常你不能捕捉到错误......只有异常......幸运的是,你可以使用 PHP 设置一个 error_handler 来抛出异常。(来自 php ErrorException页面上的评论)

class ErrorHandler extends Exception {
    protected $severity;

    public function __construct($message, $code, $severity, $filename, $lineno) {
        $this->message = $message;
        $this->code = $code;
        $this->severity = $severity;
        $this->file = $filename;
        $this->line = $lineno;
    }

    public function getSeverity() {
        return $this->severity;
    }
}

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorHandler($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler", E_ALL);

因此,对于您的具体问题,您只需执行以下操作:

try{
    $result = $db->execute($query);
    $primary = $result->getRows();
} catch (ErrorHandler $e){
    header("Location: /index.php");
    exit;
}
于 2013-05-29T14:51:04.983 回答
0

我们需要知道 $db 是什么,您没有包含初始化 $db 的代码或告知我们此引用的内容。

假设您使用的是 PDO 库,PDO 对象本身具有 PDO::exec(),而 PDOStatement 对象具有 PDOStatement::execute()。因此,我假设 $db 是 PDOStatement 的一个实例,并且您正在调用 execute() 方法,该方法返回一个布尔值,失败时返回 false,成功时返回 true - 它不会在成功时返回对象。如果成功,您应该调用 $db->fetchAll();

if (!$db->execute($query)) {
    header("Location: error.php");
    exit;
} 

$rows = $db->fetchAll();
于 2013-05-29T14:36:39.930 回答
0

The problem here is that execute() will return FALSE under some circumstances and a boolean is not the result object.

To avoid this error you should always be checking the output of execute() if it was even executed successfully.

For example:

$result = $db->execute($query);

if ($result !=== false) {
 $primary = $result->getRows();
}
于 2013-05-29T14:17:53.167 回答
-1

如果您收到错误消息“标头已发送”,那是因为已经输出了某些内容。例如:

echo "hello world;";
header("Location: errorpage.php");

或者:

 <?php // notice the space before <?php 
header("Location: errorpage.php");
?>
于 2013-05-29T14:37:33.353 回答