前言
大家可能經常收到安全部門的警告郵件,SQL注入,XSS攻擊漏洞等等,偶爾還被黑客掛了小馬,郁悶不?還有數(shù)據(jù)庫執(zhí)行太慢(根據(jù)經驗基本是沒有正確使用索引導致) ,下面就跟著小編來一起看看MYSQL新手們常犯的11個錯誤吧。
1、使用MyISAM而不是InnoDB
MySQL有很多的數(shù)據(jù)庫引擎,單一般也就用MyISAM和InnoDB。
MyISAM是默認使用的。但是除非你是建立一個非常簡單的數(shù)據(jù)庫或者只是實驗性的,那么到大多數(shù)時候這個選擇是錯誤的。MyISAM不支持外鍵的 約束,這是保證數(shù)據(jù)完整性的精華所在啊。另外,MyISAM會在添加或者更新數(shù)據(jù)的時候將整個表鎖住,這在以后的擴展性能上會有很大的問題。
解決辦法很簡單:使用InnoDB。
2、使用PHP的mysql方法
PHP從一開始就提供了MySQL的函數(shù)庫。很多程序都依賴于mysql_connect、mysql_query、mysql_fetch_assoc等等,但是
PHP手冊中建議:
如果你使用的MySQL版本在4.1.3之后,那么強烈建議使用mysqli擴展。
mysqli,或者說MySQL的高級擴展,有一些優(yōu)點:
有面向對象的接口
prepared statements(預處理語句,可以有效防止SQL-注入攻擊,還能提高性能)
支持多種語句和事務
另外,如果你想支持多數(shù)據(jù)庫那么應該考慮一下PDO。
3、不過濾用戶輸入
應該是:永遠別相信用戶的輸入。用后端的PHP來校驗過濾每一條輸入的信息,不要相信JAVAscript。像下面這樣的SQL語句很容易就會被攻擊:
| $username = $_POST["name"]; $password = $_POST["password"]; $sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // run query... | 
這樣的代碼,如果用戶輸入”admin';”那么,就相當于下面這條了:
| SELECT userid FROM usertable WHERE username='admin'; | 
這樣入侵者就能不輸入密碼,就通過admin身份登錄了。
4、不使用UTF-8
那些英美國家的用戶,很少考慮語言的問題,這樣就造成很多產品就不能在其他地方通用。還有一些GBK編碼的,也會有很多的麻煩。
UTF-8解決了很多國際化的問題。雖然PHP6才能比較完美的解決這個問題,但是也不妨礙你將MySQL的字符集設置為UTF-8。
5、該用SQL的地方使用PHP
如果你剛接觸MySQL,有時候解決問題的時候可能會先考慮使用你熟悉的語言來解決。這樣就可能造成一些浪費和性能比較差的情況。比如:計算平均值的時候不適用MySQL原生的AVG()方法,而是用PHP將所有值循環(huán)一遍然后累加計算平均值。
另外還要注意SQL查詢中的PHP循環(huán)。通常,在取得所有結果之后再用PHP來循環(huán)的效率更高。
新聞熱點
疑難解答
圖片精選