专业编程基础技术教程

网站首页 > 基础教程 正文

项目的10大PHP错误以及如何避免这些错误

ccvgpt 2024-10-12 14:17:44 基础教程 10 ℃

在这篇文章中,我们深入研究了10个常见错误以及如何在PHP代码中避免它们。继续阅读以了解更多信息,并希望减轻您的发展挫败感。

最近,我们查看了数千个项目的数据库,发现了PHP应用程序中的前10个错误。我们将向您展示导致它们的原因以及如何预防它们。避免这些“陷阱”将使您成为更好的开发人员。

项目的10大PHP错误以及如何避免这些错误

由于数据为王,我们收集,分析并排名前十大PHP错误。Rollbar收集每个项目的所有错误,并总结每个项目发生的次数。我们通过根据指纹对错误进行分组来实现此目的。如果第二个错误只是第一个错误的重复,我们将两个错误分组。这为用户提供了一个很好的概述,而不是像在日志文件中看到的那样压倒性的大转储。

我们关注的是遇到错误的项目数量,因为我们希望看到影响不同公司中大多数开发人员的错误。如果我们只查看每个错误发生的次数,那么大批量客户可能会因为与大多数读者无关的错误而压倒数据集。以下错误最有可能影响您和您的公司。

我们将从最常见的开始更详细地描述每个错误。最后,我们将分享最佳实践,以避免将其投入生产。

1. PHP解析错误:语法错误,意外的文件结束

执行包含语法错误的代码时,会发生解析错误。语法错误不需要很大,也不要复杂,如下例所示。

$ test = “test”

代码将抛出,"PHP Parse error: syntax error, unexpected end of file因为它在语句末尾缺少分号。以下示例将成功执行。

$ test = “test” ;

2. E_WARNING:为foreach()提供的参数无效

PHP foreach构造在PHP 4中引入,提供了一种迭代数组和可迭代对象的简单方法,例如实现\Traversable接口的对象。尝试在具有不同数据类型或未初始化变量的变量上使用它。它将发出错误,例如下面的示例。

$ y_exceptions = null ;

foreach($ y_exceptions as $ thisException){

}

上面的代码抛出与消息“()提供的foreach无效参数”警告,因为$y_exceptions不是数组也不实现ArrayAccess,\Traversable或任何其它可迭代接口。

3. QueryException:SQLSTATE [23000]:完整性约束违例

当我们的代码尝试执行基于数据库架构违反完整性约束的SQL操作时,会发生异常。出于多种原因可能会导致此错误,包括尝试将重复的主键值插入表中,或者不为一个或多个必需列提供值。

CREATE TABLE testtable(

user_name varchar(255)NOT NULL PRIMARY KEY,

password varchar(255)

);

$ user_name = “test” ;

$ data = array('user_name' => $ user_name);

DB :: table('testtable')- > insert($ data);

$ data = array('user_name' => $ user_name);

DB :: table('testtable')- > insert($ data);

在上面的示例中testtable有一个user_name具有主键约束的列。我们正在尝试在user_name列中插入重复值。

4. QueryException:SQLSTATE [42S22]:找不到列

当您的代码尝试在未定义的列上操作时,可能会发生另一个异常。以下示例演示了这一点。

$ user_name = “test” ;

$ data = array('user_name' => $ user_name,'password' => $ password);

DB :: table('testtable')- > insert($ data);

在这种情况下,它抛出一个“未找到列”异常,因为我们试图将一个值插入到testtable不存在的密码列中。

5. GuzzleHttp \ Exception \ ClientException:客户端错误

Guzzle是一个PHP库,它使创建HTTP客户端以发送HTTP请求和与Web服务集成变得微不足道。如果在传输尝试期间发生错误,则会抛出异常。具体来说,如果请求选项设置为true ,它将抛出一个GuzzleHttp ClientException来处理HTTP 400错误http_errors。

此异常的扩展BadResponseException和GuzzleHttp\Exception\BadResponseException从延伸RequestException。以下示例有助于我们了解错误。

$ client = new \ GuzzleHttp \ Client();

$ res = $ client - > request('GET','https://httpbin.org/status/404');

该示例抛出客户端异常“客户端错误:GET https://httpbin.org/status/404导致404 NOT FOUND响应”。

此类错误的根本原因可能如下:

  • 请求语法错误。
  • 错误的API版本。
  • 不支持的媒体类型。

可以使用try catch块处理它们。以下示例显示了如何执行此操作。

try{

$ client - > request('GET','https://httpbin.org/status/404');

} catch(ClientException $ e){

echo Psr7 \ str($ e - > getRequest());

echo Psr7 \ str($ e - > getResponse());

}

您可以看到代码包含在try / catch块中,它将捕获任何ClientException抛出的代码。您可以扩展此示例以捕获其他更具体的扩展,例如上面提到的扩展。

6. GuzzleHttp \ Exception \ ServerException:服务器错误

这是Guzzle可以抛出的另一种异常。一个ServerException当被抛出HTTP 500错误如果http_errors请求选项设置为true遇到。

$ client = new \ GuzzleHttp \ Client();

$ res = $ client - > request('GET','https://httpbin.org/status/503');

上面的示例抛出客户端异常“服务器错误:

GET https://httpbin.org/status/503导致503 SERVICE UNAVAILABL响应”,因为该服务不可用。

此类错误的根本原因可能是以下任何一种:

  • 您请求的格式或服务暂时不可用。
  • 您的服务器收到了您尝试访问的服务器的错误。这被称为“错误网关”错误。
  • 不支持您要求的HTTP协议。

ServerException,也可以通过使用try / catch块,如在下面的例子中进行处理。

try {

$ client - > request('GET','https://httpbin.org/status/503');

} catch(ServerException $ e){

echo Psr7 \ str($ e - > getRequest());

echo Psr7 \ str($ e - > getResponse());

}

正如前面的示例中捕获的一样ClientException,此示例将捕获ServerExceptions由于调用$client请求方法而导致的任何抛出。

7. QueryException:SQLSTATE [42S02]:基表或未找到视图

当您的代码尝试在不存在的数据库表上运行或(由于某种原因)无法找到时,可能会抛出查询异常“基表或未查找的视图”。看看下面的例子。

$ user_name = “test” ;

$ data = array('user_name' => $ user_name);

DB :: table('testtable')- > insert($ data);

在我的情况下,它抛出,“SQLSTATE [42S02]:未找到基表或视图:1146表”因为我们试图将数据插入到数据库中不存在的表中。确保表首先出现,以避免这些异常。或者,与前两个示例一样,将调用包装在try / catch块中,该块将捕获QueryException,如下例所示。

$ user_name = “test” ;

$ data = array('user_name' => $ user_name);

try {

DB :: table('testtable')- > insert($ data);

} catch(QueryException $ e){

printf(“发生错误:%s \ n”,$ e-> getMessage());

}

8. PDOException:拒绝SQLSTATEHY000连接

PDOExceptions代表PDO(PHP数据对象)引发的错误,正如PHP手册所描述的那样,它是“ 用于访问PHP数据库的轻量级,一致的接口 ”。

“PDOException:Connection refused”的可能根本原因可能是以下之一:

  • 您没有足够的权限来访问数据库或以该用户身份执行该操作。
  • 您的数据库参数(服务器名称?主机名和/或端口号,用户名,密码,数据库名称)不正确。
  • 您拥有数据库的服务器无法访问 - 它可能处于脱机状态。

9. BadMethodCallException:调用Undefined Method

在PHP中,当您尝试调用类的未定义方法时,会发生“BadMethodCallException:调用未定义方法”错误。看看下面的例子。

class Card {

}

var_dump(Card :: all());

上面的代码将抛出“BadMethodCallException:调用未定义的方法”,因为我们正在尝试调用类all中尚不存在的方法Card。要避免这种异常,请确保在类中定义了被调用的方法。或者,您可以实现__call magic方法来处理对未定义方法的调用。但是,这种方法可能会变得混乱。

10. QueryException:SQLSTATE [42000]:语法错误或访问冲突

当您尝试执行的SQL查询在语法上不正确时,会发生此类错误。下面的示例将抛出错误“语法错误或访问冲突”,因为select查询语句在语法上是不正确的。在这种情况下,from缺少关键字。

$ cards = DB :: select(“SELECT * testtable”);

如果用户没有权限对数据库执行操作,也会发生此异常。如果用户没有插入权限,下面的示例将引发错误。

$ user_name = “test” ;

$ data = array('user_name' => $ user_name);

DB :: table('testtable')- > insert($ data);

结论

有几种开发最佳实践可以帮助您避免在生产中遇到这些错误。首先是使用像PhpStorm这样的好IDE ,它可以帮助您在开发过程中使用和纠正语法。这将帮助您避免解析错误进入生产。

另一个最佳实践是使用单元和集成测试工具,例如PHPUnit,Codeception,Behat和Selenium。这些可以帮助您防止生产代码(假设您正确部署),其中包含错误。

HTTP服务器错误等一些错误并不是完全可以避免的。但是,编写良好的应用程序将优雅地处理它们,例如捕获它们并向用户显示错误消息。

我们希望您学到了新的东西,并且可以更好地避免将来出现错误。我们也希望本指南可以帮助您解决您一直在努力解决的问题。

了解影响用户的错误并获得快速解决问题的好工具非常重要。Rollbar使您可以查看生产PHP错误,并为您提供更多上下文以快速解决它们。例如,它提供了其他调试功能,如遥测和局部变量值,这使得它更容易调试。

Tags:

最近发表
标签列表