gpt4 book ai didi

PHP:函数脚本中的现代错误处理

转载 作者:行者123 更新时间:2023-11-29 12:44:36 25 4
gpt4 key购买 nike

在我的functions.php 中,我在网站的页面模板中使用了一组函数。我想知道处理错误的最佳方法是什么。目前,我的functions.php如下所示:

// include database
require_once 'system/db.php';

// Functions
// =========

function getUrlsPhotos($db, $resultId) {

$query = "SELECT * FROM pictures WHERE result_id=$resultID ORDER BY id ASC";
$results = $db -> query($query);

// Was there an error?
if ($db -> error) {
$output = 'error_getting_photos';
} else {

// loop for getting photos... ... ...

$output = $array_photos;

}

return $output;

}

function getActivityName($db, $activitiesId) {

$query = "SELECT * FROM activities WHERE id=$activitiesId LIMIT 1";
$results = $db -> query($query);
if ($db -> error) {
$output = 'db_error_getting_activityname';
} else {
$result = $results -> fetch_assoc();
$output = $result;
}

return $output;

}

我的目标是以某种方式查看是否发生了错误,当然用户没有看到它。处理我所有函数的错误的有效方法是什么?我需要初始化什么?

--- 编辑: ---

阅读有关错误处理的更多信息,我想出了以下脚本来在数据库中存储错误:

    <?php
function errorHandler($errno, $errstr, $errfile, $errline) {
static $db;
if (empty($db)) {
$db = new PDO(DSN, DBUSER, DBPASS);
}

$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
$stmt = $db->prepare($query);

switch ($errno) {
case E_NOTICE:
case E_USER_NOTICE:
case E_DEPRECATED:
case E_USER_DEPRECATED:
case E_STRICT:
$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
break;

case E_WARNING:
case E_USER_WARNING:
$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
break;

case E_ERROR:
case E_USER_ERROR:
$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
exit("FATAL error $errstr at $errfile:$errline");

default:
exit("Unknown error at $errfile:$errline");
}
}

set_error_handler("errorHandler");

我的问题:

  • 为了对我的所有 php 函数有效,放置此错误处理函数的最佳位置是什么?将它放在我的functions.php 的开头就足够了吗?
  • 此解决方案的一个缺点肯定是,如果数据库关闭,则无法收到通知。在这种情况下,我怎样才能收到通知电子邮件?

最佳答案

使用set_error_handler并创建一个(理想情况下,但不是必需的)类来处理错误。

set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR);

注意:这不会捕获 fatal error 。为了处理 FATAL,我会使用 register_shutdown_function() .

你的类(class)会是这样的;

<?php

class ErrorHandling {

//Methods need to be static

public static function doHandleErrors($strErrorCode, $strErrorMsg, $strErrorFile, $intErrorLine) {

//Handle errors.
//Depending on the $strErrorCode, you would either display the message, or display a http status code 500 & direct to a 500 error page.
//Depending on the severity of the error, e-mail your programmers.

//Try not to display any errors to the consumer/user
//Make the error something like "Ooops, something went wrong." and not "An error occured on file.php, line 23."
//But that may be more a question for UX.se
}
}

放置此错误处理函数的最佳位置是什么,以便对我的所有 php 函数都有效?将它放在我的functions.php的开头就足够了吗?

我会选择将 set_error_handler(array("ErrorHandling", "doHandleErrors"), E_USER_ERROR | E_NOTICE | E_USER_NOTICE | E_ERROR); 放入您的主“大脑文件”中 - 在数据库连接之前已建立,因此我们可以使用您的自定义错误处理程序来处理数据库连接问题。

此解决方案的一个缺点肯定是,如果数据库关闭,则无法收到通知。在这种情况下,我怎样才能收到通知电子邮件?

使用自定义错误处理程序,您可以捕获错误/异常并向程序员发送电子邮件,然后优雅地终止进程,显示 500 内部服务器错误503 服务不可用 页面发送给最终用户。

关于PHP:函数脚本中的现代错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25618574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com