第一篇:总结PHP程序员最常犯的11个MySQL错误
总结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循环来计算平均值。
此外,请注意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也不失为一个可行的替代方案。
第二篇:php程序员最常犯的11个MySQL错误
中国IT职业教育领先品牌
精品课程 全程面授
php程序员最常犯的11个MySQL错误
千锋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手册上说:
千锋教育www.xiexiebang.com
中国IT职业教育领先品牌
精品课程 全程面授
如果你在使用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
千锋教育www.xiexiebang.com
中国IT职业教育领先品牌
精品课程 全程面授
美国、英国和澳大利亚的我们很少考虑除英语之外的其他语言。我们很得意地完成了自己的”杰作”却发现它们并不能在其他地方正常运行。
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来存储序列
千锋教育www.xiexiebang.com
中国IT职业教育领先品牌
精品课程 全程面授
化的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 可能是使用最广泛的数据库系统,但并
千锋教育www.xiexiebang.com
中国IT职业教育领先品牌
精品课程 全程面授
不是唯一的选择。PostgreSQL和Firebird是最强有力的竞争者:这个两者都是开源的,而且都没有被公司收购。微软提供了sql server Express,甲骨文提供了10g Express,这两者都是企业级数据库的免费版本。有时候,对于一个较小的web应用或者嵌入式应用,SQLite也不失为一个可行的替代方案。
以上就是为大家介绍的php程序员最常犯的11个MySQL错误,希望能对大家有所帮助。
千锋教育www.xiexiebang.com
第三篇:总结PHP程序员最常犯的11个MySQL错误
对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一份子。
对于很多新手们来说,使用PHP可以在短短几个小时之内轻松地写出具有特定功能的代码。但是,构建一个稳定可靠的数据库却需要花上一些时日和相关技能。下面列举了我曾经犯过的最严重的11个MySQL相关的错误(有些同样也反映在其他语言/数据库的使用上)。www.xiexiebang.com
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。
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也不失为一个可行的替代方案。
第四篇:Java程序员常犯的错误
Java程序员常犯的十大错误
无论你是一名熟练的java程序员,熟悉java的程度就像熟悉自己的手背一样;或者你是一名java新手,你都会犯错误。这是很自然的,更是人之常情。你所想象不到的确实,你犯的错误很可能是其他人也在犯的错误,这些错误犯了一次又一次。在这里我给出来了经常犯的十大错误列表,通过它我们可以发现它们并解决它们。
10.在静态方法中访问非静态的成员变量(例如在main方法中)。
许多程序员,特别是那些刚刚接触JAVA的,都有一个问题,就是在main方法中访问成员变量。Main方法一般都被标示为“静态的”,意思就是我们不需要实例化这个类来调用main方法。例如,java虚拟机能够以这样的形式来调用MyApplication类:
MyApplication.main(命令行参数);
这里并没有实例化MyApplication类,或者这里没有访问任何的成员变量。例如下面的程序就会产生一个编译器的错误。
public class StaticDemo {
public String my_member_variable = “somedata”;public static void main(String args[]){
// Access a non-static member from static method
System.out.println(“This generates a compiler error” + my_member_variable);} }
如果你要访问一个静态方法中的成员变量(比如main方法),你就需要实例化一个对象。下面这段代码示例了如何正确的访问一个非静态的成员变量,其方法就是首先实例化一个对象。
public class NonStaticDemo {
public String my_member_variable = “somedata”;
public static void main(String args[]){
NonStaticDemo demo = new NonStaticDemo();
// Access member variable of demo
System.out.println(“This WON'T generate an error” + demo.my_member_variable);} }
9.在重载的时候错误的键入方法名
重载允许程序员用新的代码去覆盖方法的实现。重载是一个便利的特性,很多面对对象的程序员都在大量的使用它。如果你使用AWT1.1的事件处理模型,你通常会覆盖listener方法去实现定制的功能。一个在重载方法的时候很容易犯的错误就是错误的键入要重载的方法名。如果你错误的输入了方法名,你就不是在重载这个方法了。相反的,你是在重新定义一个方法,只不过这个方法的参数和返回类型和你要重载的方法相同罢了。
public class MyWindowListener extends WindowAdapter { // This should be WindowClosed
public void WindowClose(WindowEvent e){ // Exit when user closes window System.exit(0);} };
这 个方法不会通过编译,很容易就能捕捉找它。在过去我曾经注意过一个方法,并且相信它是被调用的,花了很多时间找这个错误。这个错误的表现就是你的方法不会 被调用,你会以为你的方法已经被跳过了。一种可行的解决方法就是增加一条打印输出语句。在日志文件中记录下信息。或者是使用跟踪调试程序(例如VJ++或者是Borland JBuilder)来一行一行的调试。如果你的方法还不能被调用,那很可能就是你的方法名键入错误了。
8.比较和分配(“=”强于“==”)
这是一个很容易犯的错误。如果你以前使用过别的语言,比如Pascal,你就会知道计算机语言的设计们选择这样的方式是何等的乏味。举个例子,在Pascal中,我们使用:=运算符来表示分配,而使用=来表示比较。这样好像是退回了C/C++,也就是java的起源。
幸运的是,即使你没有发现在屏幕上发现这个错误,你的编译器会帮助你发现它。通常情况下,编译器会报出这样一个错误信息:“不能转换xxx到布尔类型”,这里的XXX是你用来代替比较的java类型。
7.比较两个对象(用==来代替instead of)当我们使用==运算符的时候,我们实际上是在比较两个对象的引用,来看看他们是不是指向的同一个对象。举个例子,我们不能使用==运算符来比较两个字符串是否相等。我们应该使用.equals方法来比较两个对象,这个方法是所有类共有的,它继承自java.lang.Object。
下面是比较两个字符串相等的正确的方法。
// Bad way
if((abc + def)== “abcdef”){
......}
// Good way
if((abc + def).equals(“abcdef”)){
.....}
6.混淆值传递和引用传递。
这是一个不太容易发现的错误。因为,当你看代码的时候,你会十分确定这是一个引用传递,而它实际上却是一个值传递。Java这两者都会使用,所以你要理解你什么时候需要值传递,什么时候需要引用传递。当你要传递一个简单的数据类型到一个函数中,比如,char、int、float或者double,你是在传递一个值。这个意味着这种数据类型的被复制了一个拷贝,是这个拷贝被传递到了函数中。如果这个函数去修改这个值,仅仅是这个值的拷贝被修改了。这个函数结束以后,将会返回到控制调用函数去,这时候那个“真正的”值没有受到影响,没有任何改变被存储。
如果你想修改一个简单的数据类型,可以将这个数据类型定位一个返回值或者将它封装到一个对象中。
当你要传递一个java对 象到一个函数中,比如,数组、向量或者是一个字符串,此时你传递的就是一个对象的引用。这里的字符串也是一个对象,而不是一个简单数据类型。这就意味这你 要传递一个对象到一个函数,你就要传递这个对象的引用,而不能去复制它。任何对这个对象的成员变量的改变都会持久化,这种改变的好坏要取决于你是否是刻意 而为之。
有一点要注意,如果字符串没有包含任何方法改变它的值的时候,你最好将它作为值来传递。
5.写一个空的异常处理。
我知道一个空的异常处理就像忽略错误一样很诱人。但是如果真的发生了错误,你不会得到一个错误信息的输出,它使得不太可能发现错误的原因。甚至是最简单的异常处理都是很有用处的。举个例子,在你的代码加上try{}catch{},去试着捕捉任何的异常抛出,并打印出错误信息。你不用为每个异常都写出定制的处理(虽然这是一个很好的编程习惯)。但是不要将这个异常处理空着,否则你就不会知道有什么错误发生了。
举例:
public static void main(String args[]){
try {
// Your code goes here..}
catch(Exception e){
System.out.println(“Err-” + e);} }
4.忘记java中索引是从0开始的。
如果你有C/C++的编程背景的话,你在使用其他编程语言的时候就不会发现同样的问题了。
在java中数组的索引是从0开始的,这就是说第一个元素的索引必须是0.困惑了?让我们看看例子吧。
// Create an array of three strings String[] strArray = new String[3];
// First element's index is actually 0 strArray[0] = “First string”;
// Second element's index is actually 1 strArray[1] = “Second string”;
// Final element's index is actually 2 strArray[2] = “Third and final string”;
在这个例子中,我们定义了一个有着三个字符串的数组,当我们访问它的元素时候减去了一个。现在,当我们试着去访问strArray[3],也就是第四个元素的时候,就会有一个ArrayOutOfBoundsException异常被抛出。这个就是最明显的例子-忘记了0索引规则。
在其他地方0索引规则也能使你陷入麻烦。例如字符串中。假设你要从一个字符串确定的偏移位置处得到一个字符,使用String.charAt(int)函数,你就能看到这个信息。但是在java中,字符串类的索引也是从0开始的,这就是说第一个字符的偏移位置为0,第二个为1.你可能会陷入一些麻烦,如果你不注意这个问题的话,特别是你的应用程序中使用了大量的字符串处理程序,那样的话你就很可能使用错误的字符,同时在运行是抛出一个StringIndexOutOfBoundsException异常,就像ArrayOutOfBoundsException异常一样。下面的例子证明了这些:
public class StrDemo {
public static void main(String args[]){
String abc = “abc”;
System.out.println(“Char at offset 0 : ” + abc.charAt(0));System.out.println(“Char at offset 1 : ” + abc.charAt(1));System.out.println(“Char at offset 2 : ” + abc.charAt(2));
// This line should throw a StringIndexOutOfBoundsException System.out.println(“Char at offset 3 : ” + abc.charAt(3));} }
同时应该注意的是,0索引规则不应该只应用在数组或是字符串中,java的其他部分也会用到。但是并不是全部都会用到。Java.util.Date和java.util.Calendar,这两个类的月份都是从0开始的,但是日期却通常是从1开始的,下面的程序证明了这一点。
import java.util.Date;import java.util.Calendar;
public class ZeroIndexedDate {
public static void main(String args[]){
// Get today's date Date today = new Date();
// Print return value of getMonth
System.out.println(“Date.getMonth()returns : ” + today.getMonth());
// Get today's date using a Calendar
Calendar rightNow = Calendar.getInstance();
// Print return value of get(Calendar.MONTH)
System.out.println(“Calendar.get(month)returns : ” + rightNow.get(Calendar.MONTH));} }
0索引规则在你不注意它的时候就会发生,如果你不想在运行时遇到这个错误的话,请注意查阅你的API文档。
3.防止线程在共享变量中并行存取。
在写一个多线程的应用程序的时候,许多程序员都喜欢抄近路。而这样会是他们的应用程序或者是小应用程序发生线程冲突。当两个或者两个以上的线程访问同一个数据的时候,就存在一定的概率(概率大小取决与墨菲法则)使得两个线程同时的访问或者修改同一个数据。不要愚蠢的认为这样的情况不会发生在单线程的应用程序中。当访问同一个数据的时候,你的线程就很可能被挂起,而第二个线程进入是就会覆盖第一个线程修改的地方。
这样的问题不是仅仅出现在多线程应用程序或者是小应用程序中的。如果你写了java api或者是java bean,你的代码就很可能不是线程安全的。即使你从来没有写过一个使用线程的单独的应用程序,人们也有可能使用你的程序。为了其他人,不仅仅是你,你就应该采取措施防止线程在共享变量中并行存取。
怎样来解决这个问题呢,最简单的就是让你的变量私有化。同时使用同步存取方法。存取方法允许访问似有的成员变量,但是仅仅是在一种控制方式中。下面的存取方法就能够以安全的方式修改计数器的值。
public class MyCounter {
private int count = 0;// count starts at zero
public synchronized void setCount(int amount){
count = amount;}
public synchronized int getCount(){
return count;} } 2.大写错误。
这是一个我们最经常犯的错误。它是很简单的,但是有时我们看着一个没有大写的变量或者方法却并不能发现这个错误。我自己也常常感到困惑,因为我认为这些方法和变量都是存在的,但是却发现不了他们没有大写。
这里你不能用银子弹来检查它,你只能自己训练着来减少这种错误。这里有一个窍门:
Java api中所用的方法和变量名都应该以小写字母来开头。所有的变量名和方法名的新词的开头都要用大写字母。如果你以这样的形式来定义你的变量名和类名,你就是在有意识的使它们走向正确,你就能逐渐的减少这样错误的数量。这可能需要一段时间,但是在以后有可能会避免更为严重的错误。
下来就是java程序员最常犯的错误了!!1.空指针!
空指针是java程序员最经常犯的错误了。编译器不会为你检查出这个错误它仅仅在运行时在表现出来,如果你发现不了它,你的用户将很可能发现它。
当试着访问一个对象的时候,这个对象的引用就是空的,一个NullPointerException异常就会被抛出。空指针错误的原因是多种多样的,但是一般情况下发生这种错误意味着你没有对一个对象初始化,或者是你没有检查一个函数的返回值。
许多函数返回一个空是用来指示一个错误的条件被执行。如果你不检查返回值的话,你由于不可能知道发生了什么。既然原因是一个错误的条件,一般的测试就不会发现它,这就意味着你的用户可能在最后的时候替你发现它。如果API函数指明一个空的对象很可能被返回,那在使用对象的引用之前一定要进行检查。
另外的原因可能是你在初始化对象的时候不规范,或者是它的初始化是有条件的。举例,检查下面的代码,看看你是否能发现这个错误。
public static void main(String args[]){
// Accept up to 3 parameters String[] list = new String[3];
int index = 0;
while((index < args.length)&&(index < 3)){
list[index++] = args[index];}
// Check all the parameters
for(int i = 0;i < list.length;i++){
if(list[i].equals “-help”){ //.........} else
if(list[i].equals “-cp”){
//.........}
// else.....} }
上面的代码(作为人为的例子),显示了通常的错误。在某些情况下,用户输入了三个或者更多的参数,上述代码将会正常运行。但是如果没有参数被输入,那么在运行的时候就会得到一个空指针异 常。某些时候你的变量将会被初始化,但是其他时候它们却不会。一个简单的解决办法就是在你访问数组元素的时候先检查它十分为空。
总结:
这些错误是我们常犯的错误的一些代表。虽然在编码的时候不可能完全的避免错误,但是你应该去避免犯一些重复的错误。很明显的是,所有的java程序员都会犯这样的错误。唯一能让人感到安慰的就是,当你在夜深人静的时候去跟踪一个错误,在某时某地某个人也在犯着同样的错误。
第五篇:php mysql学习总结剖析
php 字符串
反引号里面的字符必须是命令 如`pwd` 是查看当前目录
转移字符:
符号
含义
”
双引号
反斜线
n
换行
t
跳位(Tab)
常量和变量 _FILE_ 这个默认常量是php程序文件名 _LINE_ 这个默认常量是php程序行数 E_ERROR 这个常量指到最近的错误处 E_WARNING 这个常量指到最近的警告处 E_PARSE 本常量为解析语法有何潜在问题处 自定义常量define(“
“,”
“);第一空格为常量,第二个为定义 或
define(‘
‘,);同上
有$为变量,无为常量 object为类变量,如 class foo{ function do-foo(){ echo”Doing foo”;} } $bar=new foo;
//建立变量,其他语言有(),php语言没有。// $bar->do-foo();
//调用变量的方式。//->为调用类函数用的符号
变量区分大小写
Php变量可以不用定义直接使用。局部变量和全局变量的区别见第二章,第21分钟处图。
全局变量必须用$GLOBALS数组和global声明。配置文件的globals函数须打开
是什么????
$PHP_SELF
//php文件名,全局变量 echo $GLOBALS[“PHP_SELF”];或 globals $PHP_SELF;不能echo $PHP_SELF;
函数不区分大小写
静态变量static variable
老语法$foo直接用
新语法$_GET[‘foo’]
$_POST[‘foo’]
$_SESSION[‘foo’]
位运算符:
&与
|或
~非
^异或
<< 向左移位乘法
>> 向右移位除法 逻辑运算:
&& 而且AND
||或者OR
Xor异或
!不Not
符号
意义 $
变量
&
变量的地址(加在变量前)->
类的方法或属性 =>
数组的元素值
? :
三元运算符
数组
数组的下标可以是整数,也可以是字符串
如$user[0]=”张三”;
$user[‘zs’]=”张三”;
$user[“zs”]=”张三”;或$user=array(“张三”,//下标0
echo $user[0];‘is’=>”李四”,//下标is
echo $user[is];或echo $user[‘is’];“ww”=>”王五”
//下标ww);
echo sizeof($user);
//记录数
多维数组 $user=array(array(‘张三’,88), array(‘李四’,95), array(‘王五’,99));函数
函数不区分大小写 函数原型:
返回类型 函数名称(类型 参数1, 类型 参数2…..);
数学函数
number abs(number)取绝对值|x| float sin(float)
正弦计算sin(x)float cos(float)
余弦计算cos(x)float sqrt(float)
开平方根计算 float log(float)
自然对数计算lnx float log10(float)
lgx float exp(float)
e的x次方
float pow(float x,float y)
x的y次方
double pi()
圆周率
void srand(int)
配置随机种子
int rand([int min],[int max])
取得随机数
string strtolower(string str)
字符串全转为小写 string strtoupper(string str)
字符串全转换为大写 string trim(string str)
截去字符串首尾的空格 string substr(stringstring,int start,int[length])
取子串
下标从0开始。从第start位取出length个字符,start为负数,从尾端算起,length为负数表示取倒数length个字符。第三章第七分钟 int strlen(string str)取得字符串长度
int strpos(string母串,string待查字符,int[offset])
寻找字符串中的某个字符最先出处 int strcmp(string str1,string str2)字符串比较
string md5(string str)计算字符串的MD5哈希值 fopen(“C: mpa.txt”,”r”);fopen(http://www.xiexiebang.commit
//提交,缺省自动提交 set autocommit=0
//取消自动提交 rollback
//回滚
事物可以用start transaction定义
有些语句自动提交,无法回滚,如DDL语句 save point //回滚点 锁
lock tables 表名[read][write], 表名[read][write],… 解锁
unlock tables
fulltext(title,body)
//在标题和主体上建立全文索引
select * from articles where match(title,match)against(‘database’);
select * from articles where match(title,match)
against(‘+mysql-yoursql’ in boolean mode);
包含mysql不包含yoursql 逻辑全文索引 against:匹配串:
apple banana
//找至少包含上面词中的一个的记录行 +apple+juice
//两个词均被包含在内
+apple macintosh
//包含词”apple”,但是如果同时包含”macintosh”,它的排列将更高一点 + apple-macintosh
//包含”apple”但不包含” macintosh”
“some words”
//可以包含”some words of wisdom”但不是”some noice words”
grant
//授权
grant select,insert,update,delete on *.* to ‘test_user’@’%’ identified by ‘123’;%
//任何主机
*.*
//任何数据库上的任何对象,*表示任何 123
//密码
test_user
//用户名
grant all privileges on *.* to admin@localhost identified by ‘123’ with grant option;
//创建本地的完全超级用户”admin,口令’123’” all privileges //完全的权限
with grant option
//授权给其他用户
删除用户
revoke all on *.* from ‘test_user’@ localhost;revoke all
//收回所有权限 flush privileges
//刷新内存授权表
delete from user where user=’test_user’;
// 删除用户
delete from user where host=’localhost’ and user=’’;
//删除匿名用户
mysqladmin-uroot password 123
//添加密码123 mysqladmin –uroot-p123 password 456
或
set password for root=password(“456”);
或
update user set password=password(‘456’)where user=’root’;
//再改密码为456 mysqladmin –uroot –p456 password’’
optimize table 表1,表2…;
//mysql优化
load data infile ‘路径’ into table teacher;
或 mysqlimport school 路径(如C:/a/b.txt)
//导入
mysqldump –opt school > school_2004_9.sql
//将数据库school中的表全备份到school_2004_9.sql文本文件
mysqldump –opt school teacher student > school_2004_9.sql //仅备份表teacher和student mysqldump –databases school test > school_2004_9.sql
//备份多个数据库
source school_2004_9.sql;
//从备份文件恢复数据
select * from emp limit(2,5);
//查第3到第7号员工的信息
select * from emp order by sal limit 0,5;= select * from emp order by sal limit 5;
mysql_data_seek(resource,int row_number)将指定的结果标识所关联的mysql结果内部的行指针移动到指定的行号。接着用 mysql_fetch_row()将返回那一行,row_num从0开始
if(!($supername==$supervisor)||!($superpass==$superpsw))//如果用户名和密码有一个错
action='$php_self’
//自身执行
相对路径是:../(表示当前文件的上一级目录);../../(表示当前文件的上一级目录的再上一级目录);./(表是当前目录);/(表示根目录)
$result=mysql_query(“update vote set $select_result='{$number}',total='{$total}' where id=$id”,$db);//当用$select_result表示某个字段(如result1到result9)传递$number,值等可用此表示法(当字段为变量)
路径:
$tempdir = str_replace(“",”/“,substr(dirname(__FILE__),0,-6));//这样做可以避免在虚拟空间站找不到路径的问题,require $tempdir.”/include/config.inc.php";
解决乱码
1选定代码片段
2选定修改----页面属性----标题/编码 3选择编码类型
4重新载入(这步不能省)
不懂 可直接用教程中文件名直接在百度提问,肯定有人和我学一样的东西