PHP开发者使用MySQL的10大常见错误
PHP开发者使用MySQL的10大常见错误
数据库是大部分Web程序的基础,对于PHP开发者来说,MySQL是最常用的数据库之一。
PHP是相对简单的编程语言,新手能在几个小时内写出可执行的代码。但是,要构建一个稳固的、可靠的数据库需要时间和技术。这里列出10大最严重的MySQL错误。
1. 使用MyISAM数据库引擎而不是InnoDB
MySQL提供很多数据库引擎,但是最常用的是MyISAM和InnoDB.
MyISAM是MySQL的默认数据库引擎。但MyISAM并不是适当的选择,除非你只是用来构建很简单的、试验性的数据库。MyISAM不支持外键约束、事务等其它高级的数据库特性。另外,在insert或update数据的时候,整个数据表将会被锁定,随着使用的增长这会对性能产生不利影响。
这问题的解决方案很简单:使用InnoDB。
2. 使用PHP的MysQL函数
很多程序依赖于PHP提供的函数库,如mysql_connect, mysql_query, mysql_fetch_assoc, 等, 但是PHP用户手册中写道:
如果你使用的MySQL是4.1.3及以上版本,则强烈建议你使用mysqli扩展来替代.
mysqli是PHP中增强的MySQL扩展,具有不少优点:
- 一个(可选的)面向对象的接口
- 提供prepared statement(有助于防止SQL注入攻击和提高性能)
- 多语句支持
- 事务支持
除此之外,如果你希望提供多数据库支持,最好考虑PDO.
3. 不过滤用户输入
这点非常重要:永远不要信任用户的输入. 在服务器的PHP中验证用户输入的每一个字条串,而不要依赖于JavaScript。简单的SQL注入依赖于这样的代码:
$username = $_POST['name']; $password = $_POST['password']; $sql = "SELECT user_id FROM users WHERE user_name='$username' AND password='$password'";
这样的代码可以用”admin’;–“这样的用户名进行攻击,其SQL相当于:
SELECT user_id FROM users WHERE user_name='admin';
恶意攻击者将以admin登录, 而password被注释掉了。
4. 不使用UTF-8
UTF-8可以解决许多国际化问题。
5. 更喜欢PHP而不是SQL
对于MySQL初学者来说,总是倾向于在程序中解决问题,从而导致不必要或者低效的代码。例如,使用PHP的循环去计算平均值而不是使用MySQL内置的AVG()函数。
一般情况下最好利用数据库的功能来进行数据分析。掌握适当的SQL知识会让你进一大步。
6. 不优化SQL查询
很多的PHP性能问题是由数据库的使用不当造成的,一条糟糕的SQL查询可能造成极大的坏影响。可以利用MySQL的EXPLAIN statement, SQL Profiler及其它工具来分析SQL查询的瓶颈所在。
7. 使用错误的数据类型
MySQL提供多种数据类型:numeric, string, time等,如果你要存储日期就使用DATE或DATETIME类型,而如果使用INTEGER或STRING可能让SQL变得复杂化,除非由于某些原因不得不这样做。
有时候开发试图创造自己的数据结构,如用STRING存储序列化的PHP对象。数据库管理或许会变得简单,但是MySQL就变成了笨拙的数据存储并可能导致潜在的问题。
8. 在SELECT查询中使用*
永远不要使用*来返回所有字段的数据,这是懒惰的表现。你最好只提取所需的数据。
9. 缺少或过渡索引
适当地建立索引能快速地查询数据,提高查询性能,但在不必要的字段上建立索引对性能是有害的。
10. 忘记备份数据库
硬盘停止工作,服务器出问题等意外对数据库来说是灾难,尽管这样的情况不多,但还是得保证有自动备份机制。
11. 额外的错误:考虑其它数据库系统
MySQL也许是PHP程序中最常用的数据库管理系统,但并不是唯一的选择。PostgreSQL, Firebird是MySQL的竞争者,并且都是开源的。Microsoft SQL Server, Oracle也提供免费的Express版本, 它们是企业级的数据库。甚至SQLite也可以用于小型或嵌入式程序。
原文:http://blogs.sitepoint.com/2010/11/19/mysql-mistakes-php-developers/