background image

PHP 程序员容易犯错的 11 个 Mysql 错误

对于大多数 web 应用来说,数据库都是一个十分基础性的部分。如果你在使用 PHP,那么
你很可能也在使用 MySQL—LAMP 系列中举足轻重的一份子。
对于很多新手们来说,使用 PHP 可以在短短几个小时之内轻松地写出具有特定功能的代
码。但是,构建一个稳定可靠的数据库却需要花上一些时日和相关技能。下面列举了我曾
经犯过的最严重的 11 个 MySQL 相关的错误(有些同样也反映在其他语言/数据库的使用
上)。。。
1、使用 MyISAM 而不是 InnoDB
MySQL 有很多数据库引擎,但是你最可能碰到的就是 MyISAM 和 InnoDB。
MySQL 默认使用的是 MyISAM。但是,很多情况下这都是一个很糟糕的选择,除非你在

 

创建一个非常简单抑或实验性的数据库。外键约束或者事务处理对于数据完整性 是非常
重要的,但 MyISAM 都不支持这些。另外,当有一条记录在插入或者更新时,整个数据
表都被锁定了,当使用量增加的时候这会产生非常差的运行效率。
结论很简单:使用 InnoDB。
2、使用 PHP 的 mysql 函数
PHP 自产生之日就提供了 MySQL 库函数(or near as makes no difference)。很多应用仍然在
使用类似 mysql_connect、mysql_query、mysql_fetch_assoc 等的函数,尽管 PHP 手册上说:
如果你在使用 MySQL v4.1.3 或者更新版本,强烈推荐使用您使用 mysqli 扩展。
mysqli(MySQL 的加强版扩展)有以下几个优点:
可选的面向对象接口
prepared 表达式,这有利于阻止 SQL 注入攻击,还能提高性能
支持更多的表达式和事务处理
另外,如果你想支持多种数据库系统,你还可以考虑 PDO。
3、没有处理用户输入
这或者可以这样说#1:永远不要相信用户的输入。用服务器端的 PHP 验证每个字符串,
不要寄希望与 JavaScript。最简单的 SQL 注入攻击会利用如下的代码:
$username   =   $_POST["name"];   $password   =   $_POST["password"];   $sql   =   “SELECT   userid 
FROM usertable WHERE username=’$username’ AND password=’$password’;”; // run query…
只要在 username

字段输入 admin’;–”,这样就会被黑到,相应的 SQL 语句如下:

SELECT userid FROM usertable WHERE username=’admin’;
狡猾的黑客可以以 admin 登录,他们不需要知道密码,因为密码段被注释掉了。
4、没有使用 UTF-8
美国、英国和澳大利亚的我们很少考虑除英语之外的其他语言。我们很得意地完成了自己

的 杰作 却发现它们并不能在其他地方正常运行。
UTF-8 解决了很多国际化问题。虽然在 PHP v6.0 之前它还不能很好地被支持,但这并不影
响你把 MySQL 字符集设为 UTF-8。
5、相对于 SQL,偏爱 PHP
如果你接触 MySQL 不久,那么你会偏向于使用你已经掌握的语言来解决问题,这样会导
致写出一些冗余、低效率的代码。比如,你不会使用 MySQL 自带的 AVG()函数,却会先对
记录集中的值求和然后用 PHP 循环来计算平均值。