当前位置: 首页 > 后端技术 > PHP

PHP程序员最常犯的11个MySQL错误

时间:2023-03-29 17:45:08 PHP

数据库是大多数Web应用程序中非常基础的部分。如果您正在使用PHP,那么您很可能也在使用MySQL——LAMP家族的一个关键部分。对于很多新手来说,使用PHP只需几个小时就可以轻松写出一个特定的功能。数据库是大多数Web应用程序的一个非常基本的部分。如果您正在使用PHP,那么您很可能也在使用MySQL——LAMP家族的一个关键部分。对于很多新手来说,使用PHP可以在短短几个小时内轻松编写出具有特定功能的代码。然而,建立一个稳定可靠的数据库需要时间和技巧。下面是我犯过的11个最严重的MySQL相关错误的列表(有些错误也反映在其他语言/数据库的使用中)。1.使用MyISAM而不是InnoDBMySQL有许多数据库引擎,但您最有可能遇到的是MyISAM和InnoDB。MySQL默认使用MyISAM。然而,在许多情况下,这是一个糟糕的选择,除非您正在创建一个非常简单或实验性的数据库。外键约束或事务对于数据完整性非常重要,但MyISAM不支持这些。另外,当插入或更新一条记录时,整个数据表都被锁定,当使用量增加时,会产生很差的运行效率。结论很简单:使用InnoDB。2、使用PHP的mysql函数PHP从一开始就提供了MySQL库函数(或者说几乎没有区别)。许多应用程序仍然使用像mysql_connect、mysql_query、mysql_fetch_assoc等函数,尽管PHP手册上说:如果您使用的是MySQLv4.1.3或更新版本,强烈建议您使用mysqli扩展。mysqli(MySQL的增强扩展)有以下优点:可选的面向对象接口准备表达式,有利于防止SQL注入攻击,也可以提高性能,支持更多的表达式和事务处理。另外,如果要支持多种数据库系统,也可以考虑PDO。3.不处理用户输入这个或者更确切地说#1:永远不要相信用户输入。使用服务器端PHP验证每个字符串,不要寄希望于JavaScript。最简单的SQL注入攻击将使用以下代码:$username=$_POST["name"];$password=$_POST["密码"];$sql="SELECTuseridFROMusertableWHEREusername='$username'ANDpassword='$password';";//运行查询...只需在用户名字段中输入“admin';–”,它就会被破解。对应的SQL语句如下:SELECTuseridFROMusertableWHEREusername='admin';狡猾的黑客可以以admin身份登录,他们不需要知道密码,因为密码字段被注释掉了。4.美英澳不使用UTF-8的我们很少考虑英语以外的语言。我们自豪地制作了我们的“杰作”,却发现它们在其他地方效果不佳。UTF-8解决了许多国际化问题。虽然在PHPv6.0之前支持得不好,但这并不影响你将MySQL字符集设置为UTF-8。5.PreferPHPoverSQL而不是使用你已经掌握的语言来解决问题,这将导致编写一些冗余和低效的代码。例如,不使用MySQL自带的AVG()函数,而是先对记录集中的值求和,然后使用PHP循环计算平均值。另外,请注意PHP循环中的SQL查询。通常,执行查询比遍历结果更有效。因此,在分析数据时请充分利用数据库系统的优势,掌握一些SQL知识将大有裨益。6.没有优化数据库查询99%的PHP性能问题都是由数据库引起的,一个糟糕的SQL查询就可以让你的Web应用程序完全瘫痪。MySQL的EXPLAIN语句、QueryProfiler和许多其他工具将帮助您找到这些讨厌的SELECT。7、不能正确使用数据类型MySQL提供了numeric、string、date等数据类型。如果要存储时间,请使用DATE或DATETIME类型。如果此时使用INTEGER或STRING类型,会使SQL查询变得非常复杂,前提是可以使用INTEGER或STRING来定义该类型。许多人倾向于在未经授权的情况下自定义一些数据的格式,例如使用字符串来存储序列化的PHP对象。这可能会使数据库管理更容易,但会使MySQL成为一个糟糕的数据存储,并可能在以后导致故障。8、使用*永远不要在查询中使用*来返回数据表所有列的数据。那是懒惰:你应该提取你需要的数据。即使你需要所有的字段,你的数据表也不可避免地会发生变化。9.不要使用索引或过度使用索引。总的原则是:select语句中where子句所代表的任何字段都应该使用索引。例如,假设我们有一个用户表,包括数字ID(主键)和电子邮件地址。登录时,MySQL必须根据电子邮件查找正确的ID。如果使用索引(这里是email),那么MySQL可以使用更快的搜索算法来定位email,甚至可以说是即时的。否则,MySQL只能依次检查每条记录,直到找到正确的电子邮件地址。有些人会在每个字段上添加索引。不幸的是,这些索引需要在执行INSERT或UPDATE后重新生成,这会影响性能。因此,仅在需要时添加索引。10.虽然忘记备份的情况很少见,但是数据库还是有崩溃的危险。硬盘驱动器可能会发生故障,服务器可能会崩溃,网络托管服务提供商可能会倒闭!丢失MySQL数据将是灾难性的,因此请确保您已使用自动备份或有副本。11.红利错误——不考虑使用其他数据库对于PHP开发人员来说,MySQL可能是使用最广泛的数据库系统,但它并不是唯一的选择。PostgreSQL和Firebird是最有力的竞争者:它们都是开源的,而且都没有被公司收购。微软提供sqlserverexpress,oracle提供10gexpress,都是免费版的企业数据库。有时,对于较小的Web应用程序或嵌入式应用程序,SQLite可能是一个可行的替代方案。