PHP程序员常犯的11个错误

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验证每个字符串,不要寄希望与网页特效。最简单的sql注入攻击会利用如下的代码:

 

view sourceprint?1 $username = $_post["name"];    

2 $password = $_post["password"];    

3 $sql = "select userid from usertable where username='$username' and password='$password';";    

4 // run query...

 

只要在username字段输入“admin';--”,这样就会被黑到,相应的sql语句如下:

view sourceprint?1 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也不失为一个可行的替代方案

时间: 2024-09-20 04:15:39

PHP程序员常犯的11个错误的相关文章

Java程序员常犯的五个错误_java

下面针对每一个错误用文字说明结合代码详解的方式展示给大家,具体内容如下: 1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 NullPointerException.下面代码片段会从另一个方法获得一个集合: List<String> accountIds = person.getAccountIds(); for (String accountId :

Java程序员在写SQL程序时候常犯的10个错误

  Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式",举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了.SQL是说明性语言而非面向对象或是命令式编程语言.在SQL中要写个查询语句是很简单的.但在Java里类似的语句却不

C++程序员容易犯的十个C#错误

c++|程序|程序员|错误 我们知道, C#的语法与C++非常相似,实现从C++向C#的转变,其困难不在于语言本身,而在于熟悉.NET的可管理环境和对.NET框架的理解. 尽管C#与C++在语法上的变化是很小的,几乎不会对我们有什么影响,但有些变化却足以使一些粗心的C++编程人员时刻铭记在心.在本篇文章中我们将讨论C++编程人员最容易犯的十个错误. 错误1: 析构函数上的差异 几乎可以完全肯定地说,对于大多数C++编程人员而言,C#与C++最大的不同之处就在于垃圾收集.这也意味着编程人员再也无需

机器学习入门阶段程序员易犯的5个错误

怎样进入机器学习领域没有定式.我们的学习方式都有些许不同,学习的目标也因人而异. 但一个共同的目标就是要能尽快上手.如果这也是你的目标,那么这篇文章为你列举了程序员们在通往机器学习高手道路上常见的五种错误. 1.将机器学习看得高不可攀 机器学习不过是另一堆技术的集合,你可以用它来解决复杂问题.这是一个飞速发展的领域,因此,机器学习的学术交流一般出现在学术期刊及研究生的课本里,让它看起来高不可攀又难于理解. 要想高效掌握机器学习,我们需要转变观念,从技术转到方法,由精确变为"足够好",这

Python程序员开发中常犯的10个错误_python

Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库.与其它大多数程序设计语言使用大括号不一样 ,它使用缩进来定义语句块. 在平时的工作中,Python开发者很容易犯一些小错误,这些错误都很容易避免,本文总结了Python开发者最常犯的10个错误,一起来看下,不知你中枪了没有. 1.滥用表达式作为函数参数默认值 Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参数可变时,很容易导致混乱,例如,下面这段函数定义: 复制代码 代码如下: >>

全世界所有程序员都会犯的错误

程序|程序员|错误 当年,国际巨星成龙的「龙种」曝光,众人指责他对不起娇妻林凤娇,逼得他出面召开记 者会,向世人自白他犯了「全世界所有男人都会犯的错误」.从来没犯过这种错误的我, 也因此常常认为自己不是个男人. 虽然没犯过「全世界所有男人都会犯的错误」,但是我倒是曾经犯了「全世界所有程序员 都会犯的错误」.不管使用何种语言,全世界所有程序员都一定犯过这种错误,那就是: 太依赖编译器,却不知道编译器做了哪些事. 一般来说,越高阶的程序语言,会提供越多语法上的便利,以方便程序撰写,这就俗称为 syn

新站长在网络营销中常犯的三个错误

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在互联网日渐成熟的今天,网络营销已经成为网站的一般性功能,关系到一个网站的生存和发展.每个站长既希望自己的网站办的热热闹闹,又希望产品销售的红红火火.然而,互联网如同一个大舞台,你方唱罢我登场.举目望去,在众多的网站中,有几家能够生存下来?有几家能够发展起来?又有几家能发财?据有关资料介绍,目前我国的个人网站成活率极低,在这里总结几点新站长在

关于用户体验,我们常犯的9个错误

关于用户体验,我们常犯的9个错误 Web 用户体验大师 Jacob Nielsen说过,"一个烂网站就像一个性情乖戾的推销员",这样的推销员不仅无法说服顾客,而且让人生厌,就网站而言,再也没有什么比蹩脚的用户体验更让人沮丧的了.本文讲述了Web设计与开发中常犯的9个用户体验错误以及它们的解决方法. 1.难以找到你感兴趣的内容下面这些知名站点不仅设计陈旧,而且易用性不佳 irs.govboink.comreddit.com 为什么不用更有意义的表单名字? 那几个旋转的骨牌原来是导航- r

解读社会化媒体营销常犯的10大错误

中介交易 SEO诊断 淘宝客 云主机 技术大厅 如果你在社会化媒体营销上付出了巨大的努力,但得到的结果却不令人满意,你是不是很有挫败感呢?到底怎么做,才能使自己的努力得到应有的回报呢?这时候你应该考虑一下自己在社会化媒体营销的方向和方式上有什么不妥之处,下面小编就为大家介绍一下进行社会化媒体营销常犯的10大错误. 1.没有明确的目标 如果你在社会化媒体上分享内容时没有明确的目标,那么你所付出的努力很可能就付之东流.随着社会化媒体的发展,不管你对你的业务做怎样的营销,你都需要有一个预期目标.你想增