网站首页 > 基础教程 正文
在这篇文章中,我们深入研究了10个常见错误以及如何在PHP代码中避免它们。继续阅读以了解更多信息,并希望减轻您的发展挫败感。
最近,我们查看了数千个项目的数据库,发现了PHP应用程序中的前10个错误。我们将向您展示导致它们的原因以及如何预防它们。避免这些“陷阱”将使您成为更好的开发人员。
由于数据为王,我们收集,分析并排名前十大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错误,并为您提供更多上下文以快速解决它们。例如,它提供了其他调试功能,如遥测和局部变量值,这使得它更容易调试。
- 上一篇: php生成器的创建和使用 php生成php文件
- 下一篇: php各版本区别 php的版本发展历史
猜你喜欢
- 2024-10-12 六种流行语言(C、C++、Python、JavaScript、PHP、Java)对比
- 2024-10-12 「讨论」php与Python之间有何区别?Python和php之间的简单比较
- 2024-10-12 PHP获取目录中的全部内容 php获取目录列表
- 2024-10-12 重蔚自留地php学习第三十天——php数组
- 2024-10-12 脚把脚教你消息队列,典型的应用场景到底有哪些?
- 2024-10-12 php-生成器(yield) php生成html
- 2024-10-12 PHP——数组根据某一键值合并 php 数组 合并
- 2024-10-12 php 一步步实现mvc架构——view篇
- 2024-10-12 PHP函数shuffle()取数组若干个随机元素的方法及实例分析
- 2024-10-12 WordPress 主循环和全局变量 wordpress主题
- 05-03【Docker】部署 Elasticsearch(docker运行elasticsearch)
- 05-03若依框架改造,阿里docker部署(若依框架开发教程)
- 05-03软件测试/测试开发丨必知必会的Docker 命令
- 05-03如何从主机复制文件到Docker容器(如何从主机复制文件到docker容器里)
- 05-03Windows搭建Agent开发平台-WSL2+Dify本地部署及开发指南
- 05-03docker安装prometheus和grafana(docker如何安装)
- 05-03从Docker容器复制文件到主机的方法
- 05-03在Debian Docker环境一键部署Dify:手把手教你搭建本地AI应用平台
- 最近发表
-
- 【Docker】部署 Elasticsearch(docker运行elasticsearch)
- 若依框架改造,阿里docker部署(若依框架开发教程)
- 软件测试/测试开发丨必知必会的Docker 命令
- 如何从主机复制文件到Docker容器(如何从主机复制文件到docker容器里)
- Windows搭建Agent开发平台-WSL2+Dify本地部署及开发指南
- docker安装prometheus和grafana(docker如何安装)
- 从Docker容器复制文件到主机的方法
- 在Debian Docker环境一键部署Dify:手把手教你搭建本地AI应用平台
- 【Docker】部署Jira&Confluence
- 精辟!阿里大牛泪解:docker镜像制作——构建企业镜像LAMP+BBS
- 标签列表
-
- 菜鸟教程 (58)
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- pythonif (68)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)