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

本站资源均为站长亲测,真实有效,本站不发表未经验证的资源,请放心参与体验

对于很多新手们来说,使用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循环来计算平均值。

此外,请注意PHP循环中的SQL查询。通常来说,执行一个查询比在结果中迭代更有效率。

所以,在分析数据的时候请利用数据库系统的优势,懂一些SQL的知识将大有裨益。

6.没有优化数据库查询

99%的PHP性能问题都是由数据库引起的,仅仅一个糟糕的SQL查询就能让你的web应用彻底瘫痪。MySQL的EXPLAIN statement、Query Profiler,还有很多其他的工具将会帮助你找出这些万恶的SELECT。

7.不能正确使用数据类型

MySQL 提供了诸如numeric、string和date等的数据类型。如果你想存储一个时间,那么使用DATE或者DATETIME类型。如果这个时候用INTEGER或者STRING类型的话,那么将会使得SQL查询非常复杂,前提是你能使用INTEGER或者STRING来定义那个类型。

很多人倾向于擅自自定义一些数据的格式,比如,使用string来存储序列化的PHP对象。这样的话数据库管理起来可能会变得简单些,但会使得MySQL成为一个糟糕的数据存储而且之后很可能会引起故障。

8.在查询中使用*

永远不要使用*来返回一个数据表所有列的数据。这是懒惰:你应该提取你需要的数据。就算你需要所有字段,你的数据表也不可避免的会产生变化。

9.不使用索引或者过度使用索引

一般性原则是这样的:select语句中的任何一个where子句表示的字段都应该使用索引。

举个例子,假设我们有一个user表,包括numeric ID(主键)和email address。登录的时候,MySQL 必须以一个email为依据查找正确的ID。如果使用了索引的话(这里指email),那么MySQL就能够使用更快的搜索算法来定位email,甚至可以说是即时实现。否则,MySQL就只能顺序地检查每一条记录直到找到正确的email address。

有的人会在每个字段上都添加索引,遗憾的是,执行了INSERT或者UPDATE之后这些索引都需要重新生成,这样就会影响性能。所以,只在需要的时候添加索引。

10.忘记备份

虽然比较罕见,但是数据库还是有崩溃的危险。硬盘有可能损坏,服务器有可能崩溃,web主机提供商有可能会破产!丢失MySQL数据将会是灾难性的,所以请确保你已经使用了自动备份或者已经复制到位。

11.Bonus mistake-不考虑使用其他数据库

对于PHP开发人员来说,MySQL 可能是使用最广泛的数据库系统,但并不是唯一的选择。PostgreSQL和Firebird是最强有力的竞争者:这个两者都是开源的,而且都没有被公司收购。微软提供了sql server Express,甲骨文提供了10g Express,这两者都是企业级数据库的免费版本。有时候,对于一个较小的web应用或者嵌入式应用,SQLite也不失为一个可行的替代方案。

这篇文章如果帮到了你 打赏
分享到: 更多 (0)
0
如果文章内容或图片资源失效或者您对文章有异议,请留言反馈或点击右下角邮件图标发送邮件说明情况,我们会及时处理,谢谢!
  • php怎样保留一位小数,包括0
    PHP提供了诸多的函数,有了PHP函数之后,许多功能都可以简化处理了,不需要写更多的自定义函数了,不过最近写的一个功能在PHP手册中找了N久,都没找到相应的函数可以解决需求,就是有怎么一组两位或更多位数的小数,但只需要保留其一位就可以了。 ...
  • 城通网盘 (CTfile.com) 下载教程
    PortableSoft 分享的很多软件或文件都使用了城通网盘。 城通网盘是一个赚钱网盘,每下载一次我上传的文件,我有些微的提成,但它的页面广告较多,速度可能慢些,但胜在比较稳定,提供的容量也大,小文件永久存储,更关键是不容易删除文件,而百...
  • Linux宝塔面板免费版开启waf防火墙的方法教程
    宝塔面板在 6.x 之前的版本中自带了 Nginx 防火墙功能(Nginx管理 > 过滤器 如下图),到了 6.x 之后,,,为了推行收费版的防火墙插件,宝塔官方把这个免费的防火墙入口给隐藏了。今天,就来说说如何开启这个隐藏的 Ngi...
  • 阿里云ECS无法正常使用SMTP发信的解决方法
    最近购置了一台阿里云ECS云服务器,但是在测试的过程中发现之前给网站配置的SMTP发信失效了,这是怎么回事?回忆了下自己并没有对发信配置进行操作,后来发现是阿里云自己的锅。 出于安全考虑,阿里云默认封禁TCP 25端口出方向的访问流量,也就...
  • js判断访问设备是电脑还是手机
    用户访问网页的设备基本分为桌面设备(电脑)和移动设备(手机、pad等),为了更好的用户体验,很多站点都做了PC和mobile两种页面。那么除了通过后端程序判断访问设备外,可以通过js来判断访问设备是电脑还是手机吗?可以的!! 有朋友该问了,...
  • http如何301到https呢?
    HTTPS协议的站点信息更加安全,同时可降低网站被劫持的风险,Firefox和chrome浏览器对访问一些非https站点会提示风险,BD等搜索引擎也明确表态了对https站点的友好。那么我们如何部署https呢? 1.申请ssl证书。有很...
  • 网站标题和描述如何修改不会被降权?
    经常会有朋友向我咨询关于网站的title和description修改会不会导致网站被降权,以及如何修改网站的标题和描述才能避免网站被降权的一系列问题,那么今天我们就这些问题做一下分享吧! 一、频繁修改网站标题和描述会被降权么 1、很多人都喜...
  • web前端开发工程师, 你应该了解的几点SEO知识!
    一名优秀的web前端开发工程师,对于公司而言是非常难得的珍宝,他往往在很大角度上影响公司的销售业绩,他们的薪资也相对很高,一般来讲web前端开发工程师,需要了解CSS、HTML、SEO、DOM、BOM、Ajax、JavaScript等相关知...
  • 你知道国外十大域名注册商都有哪些吗?
    现在很多站长在注册域名的时候会选择国外的域名注册商,究其原因,主要是国内没有很完善的域名管理制度,在域名注册的时候有很多的限制。国外的域名注册管理体系比较完善,而且经验比较丰富。但是在选择国外域名注册商的时候,很多人不知道都有哪些国外域名注...
  • 配置本地的虚拟主机的方法过程
    我新建了一个项目,名Hello,位于:I:\wamp\www目录下。 想访问这个项目,需要在地址栏上输入localhost/hello,但是我不想这样,我想要在地址栏输入local.hello.com就可以访问到我这个项目。具体步骤,如下:...
  • 百度云主机两种web服务器的伪静态配置
    如果不配置静态,会出现只能访问首页,其他页面都会404错误 Lighttpd 需要新建app.conf文件,粘贴以下代码,然后保存,放到网站根目录 handlers: - url : / script : /index.php script...
  • 百度谷歌雅虎搜狗提交链接入口大全
    只要有别的网站有你的网站地址和相关文字,就是没有链接,也可算作是一个反链接.网站优化的方向是你的网站文章数量要足够多,而且有便于蜘蛛出来的链接,蜘蛛也不喜欢抓取没有主题乱七八糟的网站 与优秀的网站首页交换链接。采用在百度中搜索某个关键词,排...

评论 抢沙发



觉得文章有用就赞赏支持一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏