第一篇:總結PHP程序員最常犯的11個MySQL錯誤
對于大多數web應用來說,數據庫都是一個十分基礎性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中舉足輕重的一份子。
對于很多新手們來說,使用PHP可以在短短幾個小時之內輕松地寫出具有特定功能的代碼。但是,構建一個穩定可靠的數據庫卻需要花上一些時日和相關技能。下面列舉了我曾經犯過的最嚴重的11個MySQL相關的錯誤(有些同樣也反映在其他語言/數據庫的使用上)。www.tmdps.cn
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也不失為一個可行的替代方案。
第二篇: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.tmdps.cn
中國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.tmdps.cn
中國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.tmdps.cn
中國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.tmdps.cn
中國IT職業教育領先品牌
精品課程 全程面授
不是唯一的選擇。PostgreSQL和Firebird是最強有力的競爭者:這個兩者都是開源的,而且都沒有被公司收購。微軟提供了sql server Express,甲骨文提供了10g Express,這兩者都是企業級數據庫的免費版本。有時候,對于一個較小的web應用或者嵌入式應用,SQLite也不失為一個可行的替代方案。
以上就是為大家介紹的php程序員最常犯的11個MySQL錯誤,希望能對大家有所幫助。
千鋒教育www.tmdps.cn
第三篇:總結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也不失為一個可行的替代方案。
第四篇: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.tmdps.cnmit
//提交,缺省自動提交 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重新載入(這步不能省)
不懂 可直接用教程中文件名直接在百度提問,肯定有人和我學一樣的東西