成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
當(dāng)前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 南昌OA系統(tǒng) > 南昌網(wǎng)站建設(shè)公司
PHP中常犯的幾個MySQL錯誤
1、運(yùn)用MyISAM而不是InnoDB
MySQL有很多數(shù)據(jù)庫引擎,但是你最可能碰到的就是MyISAM和InnoDB。
MySQL 默許運(yùn)用的是MyISAM。但是,很多狀況下這都是一個很糟糕的選擇,除非你在創(chuàng)立一個十分簡單抑或?qū)嶒炐缘臄?shù)據(jù)庫。外鍵約束或者事務(wù)處置關(guān)于數(shù)據(jù)完好性 是十分重要的,但MyISAM都不支持這些。另外,當(dāng)有一條記載在插入或者更新時,整個數(shù)據(jù)表都被鎖定了,當(dāng)運(yùn)用量增加的時分這會產(chǎn)生十分差的運(yùn)轉(zhuǎn)效率。

結(jié)論很簡單:運(yùn)用InnoDB。
2、運(yùn)用PHP的mysql函數(shù)
PHP自產(chǎn)生之日就提供了MySQL庫函數(shù)(or near as makes no difference)。很多應(yīng)用依然在運(yùn)用相似mysql_connect、mysql_query、mysql_fetch_assoc等的函數(shù),雖然PHP手冊上說:
假如你在運(yùn)用MySQL v4.1.3或者更新版本,激烈引薦運(yùn)用您運(yùn)用mysqli擴(kuò)展。
mysqli(MySQL的增強(qiáng)版擴(kuò)展)有以下幾個優(yōu)點(diǎn):
可選的面向?qū)ο蠼涌?/p>
prepared表達(dá)式,這有利于阻止SQL注入攻擊,還能進(jìn)步性能
支持更多的表達(dá)式和事務(wù)處置
另外,假如你想支持多種數(shù)據(jù)庫系統(tǒng),你還能夠思索PDO。
3、沒有處置用戶輸入
這或者能夠這樣說#1:永遠(yuǎn)不要置信用戶的輸入。用效勞器端的PHP考證每個字符串,不要寄希望與JavaScript。最簡單的SQL注入攻擊會應(yīng)用如下的代碼:
$username = $_POST["name"]; $password = $_POST["password"]; $sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';"; // run query...
只需在username字段輸入“admin';--”,這樣就會被黑到,相應(yīng)的SQL語句如下:
SELECT userid FROM usertable WHERE username='admin';
狡猾的黑客能夠以admin登錄,他們不需求曉得密碼,由于密碼段被注釋掉了。
4、沒有運(yùn)用UTF-8
美國、英國和澳大利亞的我們很少思索除英語之外的其他言語。我們很自得地完成了本人的“杰作”卻發(fā)現(xiàn)它們并不能在其他中央正常運(yùn)轉(zhuǎn)。
UTF-8處理了很多國際化問題。固然在PHP v6.0之前它還不能很好地被支持,但這并不影響你把MySQL字符集設(shè)為UTF-8。
5、相關(guān)于SQL,偏愛PHP
假如你接觸MySQL不久,那么你會傾向于運(yùn)用你曾經(jīng)控制的言語來處理問題,這樣會招致寫出一些冗余、低效率的代碼。比方,你不會運(yùn)用MySQL自帶的AVG()函數(shù),卻會先對記載集中的值求和然后用PHP循環(huán)來計算均勻值。
此外,請留意PHP循環(huán)中的SQL查詢。通常來說,執(zhí)行一個查詢比在結(jié)果中迭代更有效率。
所以,在剖析數(shù)據(jù)的時分請應(yīng)用數(shù)據(jù)庫系統(tǒng)的優(yōu)勢,懂一些SQL的學(xué)問將大有裨益。
6、沒有優(yōu)化數(shù)據(jù)庫查詢
99%的PHP性能問題都是由數(shù)據(jù)庫惹起的,僅僅一個糟糕的SQL查詢就能讓你的web應(yīng)用徹底癱瘓。MySQL的EXPLAIN statement、Query Profiler,還有很多其他的工具將會協(xié)助你找出這些萬惡的SELECT。

7、不能正確運(yùn)用數(shù)據(jù)類型
MySQL提供了諸如numeric、string和date等的數(shù)據(jù)類型。假如你想存儲一個時間,那么運(yùn)用DATE或者DATETIME類型。假如這個時分用INTEGER或者STRING類型的話,那么將會使得SQL查詢十分復(fù)雜,前提是你能運(yùn)用INTEGER或者STRING來定義那個類型。
很多人傾向于擅自自定義一些數(shù)據(jù)的格式,比方,運(yùn)用string來存儲序列化的PHP對象。這樣的話數(shù)據(jù)庫管理起來可能會變得簡單些,但會使得MySQL成為一個糟糕的數(shù)據(jù)存儲而且之后很可能會惹起毛病。
8、在查詢中運(yùn)用*
永遠(yuǎn)不要運(yùn)用*來返回一個數(shù)據(jù)表一切列的數(shù)據(jù)。這是懶散:你應(yīng)該提取你需求的數(shù)據(jù)。就算你需求一切字段,你的數(shù)據(jù)表也不可防止的會產(chǎn)生變化。
9、不運(yùn)用索引或者過度運(yùn)用索引
普通性準(zhǔn)繩是這樣的:select語句中的任何一個where子句表示的字段都應(yīng)該運(yùn)用索引。
舉 個例子,假定我們有一個user表,包括numeric ID(主鍵)和email address。登錄的時分,MySQL必需以一個email為根據(jù)查找正確的ID。假如運(yùn)用了索引的話(這里指email),那么MySQL就可以運(yùn)用 更快的搜索算法來定位email,以至能夠說是即時完成。否則,MySQL就只能次第地檢查每一條記載直到找到正確的email address。
有的人會在每個字段上都添加索引,遺憾的是,執(zhí)行了INSERT或者UPDATE之后這些索引都需求重重生成,這樣就會影響性能。所以,只在需求的時分添加索引。
10、遺忘備份!
固然比擬稀有,但是數(shù)據(jù)庫還是有解體的風(fēng)險。硬盤有可能損壞,效勞器有可能解體,web主機(jī)提供商有可能會破產(chǎn)!喪失MySQL數(shù)據(jù)將會是災(zāi)難性的,所以請確保你曾經(jīng)運(yùn)用了自動備份或者曾經(jīng)復(fù)制到位。
本站推薦
- 1《PHP項目跟蹤管理系統(tǒng)操作流程指南:高效管理項目進(jìn)度與團(tuán)隊協(xié)作的實(shí)用手冊》
- 2使用ThinkPHP框架構(gòu)建高效學(xué)生管理系統(tǒng)的獨(dú)特優(yōu)勢與實(shí)際應(yīng)用價值
- 3試用PHP軟件項目管理工具:優(yōu)化項目流程,提高團(tuán)隊協(xié)作效率的絕佳選擇
- 4php生產(chǎn)制造物料管理系統(tǒng)源碼含詳細(xì)注釋與高效功能示例
- 5php采購倉庫管理系統(tǒng)助力企業(yè)高效庫存管控與采購流程優(yōu)化
- 6PHP打造超實(shí)用商品庫存管理系統(tǒng),高效管控庫存不是夢!
- 7php庫存管理系統(tǒng)論文:實(shí)現(xiàn)高效庫存管控的技術(shù)方案剖析
- 8php庫存管理系統(tǒng)源碼含詳細(xì)注釋與功能擴(kuò)展教程
- 9php庫存管理系統(tǒng)教程:從搭建到高效應(yīng)用全

