亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠為您提供優(yōu)質(zhì)的服務(wù)! 誠征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會(huì)員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

五個(gè)常見 PHP數(shù)據(jù)庫問題

添加時(shí)間:2012-4-27  添加: admin 

 如果只有一種方式使用數(shù)據(jù)庫是正確的,您可以用很多的方式創(chuàng)建數(shù)據(jù)庫設(shè)計(jì)、數(shù)據(jù)庫訪問和基于數(shù)據(jù)庫的 PHP 業(yè)務(wù)邏輯代碼,但最終一般以錯(cuò)誤告終。本文說明了數(shù)據(jù)庫設(shè)計(jì)和訪問數(shù)據(jù)庫的 PHP 代碼中出現(xiàn)的五...       如果只有一種方式使用數(shù)據(jù)庫是正確的,您可以用很多的方式創(chuàng)建數(shù)據(jù)庫設(shè)計(jì)、數(shù)據(jù)庫訪問和基于數(shù)據(jù)庫的 PHP 業(yè)務(wù)邏輯代碼,但最終一般以錯(cuò)誤告終。本文說明了數(shù)據(jù)庫設(shè)計(jì)和訪問數(shù)據(jù)庫的 PHP 代碼中出現(xiàn)的五個(gè)常見問題,以及在遇到這些問題時(shí)如何修復(fù)它們。

  問題 1:直接使用 MySQL

  一個(gè)常見問題是較老的 PHP 代碼直接使用 mysql_ 函數(shù)來訪問數(shù)據(jù)庫。清單 1 展示了如何直接訪問數(shù)據(jù)庫。

  清單 1. Access/get.php注意使用了 mysql_connect 函數(shù)來訪問數(shù)據(jù)庫。還要注意查詢,其中使用字符串連接來向查詢添加 $name 參數(shù)。

  該技術(shù)有兩個(gè)很好的替代方案:PEAR DB 模塊和 PHP Data Objects (PDO) 類。兩者都從特定數(shù)據(jù)庫選擇提供抽象。因此,您的代碼無需太多調(diào)整就可以在 IBM® DB2®、MySQL、PostgreSQL 或者您想要連接到的任何其他數(shù)據(jù)庫上運(yùn)行。

  使用 PEAR DB 模塊和 PDO 抽象層的另一個(gè)價(jià)值在于您可以在 SQL 語句中使用 ? 操作符。這樣做可使 SQL 更加易于維護(hù),且可使您的應(yīng)用程序免受 SQL 注入攻擊。

  使用 PEAR DB 的替代代碼如下所示。

  清單 2. Access/get_good.php注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的數(shù)據(jù)庫連接字符串除外。此外,我們通過 ? 操作符在 SQL 中使用 $name 變量。然后,查詢的數(shù)據(jù)通過 query() 方法末尾的 array 被發(fā)送進(jìn)來。

 

  問題 2:不使用自動(dòng)增量功能

  與大多數(shù)現(xiàn)代數(shù)據(jù)庫一樣,MySQL 能夠在每記錄的基礎(chǔ)上創(chuàng)建自動(dòng)增量惟一標(biāo)識(shí)符。除此之外,我們?nèi)匀粫?huì)看到這樣的代碼,即首先運(yùn)行一個(gè) SELECT 語句來找到最大的 id,然后將該 id 增 1,并找到一個(gè)新記錄。清單 3 展示了一個(gè)示例壞模式。

  清單 3. Badid.sql這里的 id 字段被簡單地指定為整數(shù)。所以,盡管它應(yīng)該是惟一的,我們還是可以添加任何值,如 CREATE 語句后面的幾個(gè) INSERT 語句中所示。清單 4 展示了將用戶添加到這種類型的模式的 PHP 代碼。

  清單 4. Add_user.phpadd_user.php 中的代碼首先執(zhí)行一個(gè)查詢以找到 id 的最大值。然后文件以 id 值加 1 運(yùn)行一個(gè) INSERT 語句。該代碼在負(fù)載很重的服務(wù)器上會(huì)在競態(tài)條件中失敗。另外,它也效率低下。

  那么替代方案是什么呢?使用 MySQL 中的自動(dòng)增量特性來自動(dòng)地為每個(gè)插入創(chuàng)建惟一的 ID。更新后的模式如下所示。

  清單 5. Goodid.php我們添加了 NOT NULL 標(biāo)志來指示字段必須不能為空。我們還添加了 AUTO_INCREMENT 標(biāo)志來指示字段是自動(dòng)增量的,添加 PRIMARY KEY 標(biāo)志來指示那個(gè)字段是一個(gè) id。這些更改加快了速度。清單 6 展示了更新后的 PHP 代碼,即將用戶插入表中。

  清單 6. Add_user_good.php現(xiàn)在我不是獲得最大的 id 值,而是直接使用 INSERT 語句來插入數(shù)據(jù),然后使用 SELECT 語句來檢索最后插入的記錄的 id。該代碼比最初的版本及其相關(guān)模式要簡單得多,且效率更高。

 

  問題 3:使用多個(gè)數(shù)據(jù)庫

  偶爾,我們會(huì)看到一個(gè)應(yīng)用程序中,每個(gè)表都在一個(gè)單獨(dú)的數(shù)據(jù)庫中。在非常大的數(shù)據(jù)庫中這樣做是合理的,但是對于一般的應(yīng)用程序,則不需要這種級(jí)別的分割。此外,不能跨數(shù)據(jù)庫執(zhí)行關(guān)系查詢,這會(huì)影響使用關(guān)系數(shù)據(jù)庫的整體思想,更不用說跨多個(gè)數(shù)據(jù)庫管理表會(huì)更困難了。

  那么,多個(gè)數(shù)據(jù)庫應(yīng)該是什么樣的呢?首先,您需要一些數(shù)據(jù)。清單 7 展示了分成 4 個(gè)文件的這樣的數(shù)據(jù)。

  清單 7. 數(shù)據(jù)庫文件在這些文件的多數(shù)據(jù)庫版本中,您應(yīng)該將 SQL 語句加載到一個(gè)數(shù)據(jù)庫中,然后將 users SQL 語句加載到另一個(gè)數(shù)據(jù)庫中。用于在數(shù)據(jù)庫中查詢與某個(gè)特定用戶相關(guān)聯(lián)的文件的 PHP 代碼如下所示。

  清單 8. Getfiles.phpget_user 函數(shù)連接到包含用戶表的數(shù)據(jù)庫并檢索給定用戶的 ID。get_files 函數(shù)連接到文件表并檢索與給定用戶相關(guān)聯(lián)的文件行。

  做所有這些事情的一個(gè)更好辦法是將數(shù)據(jù)加載到一個(gè)數(shù)據(jù)庫中,然后執(zhí)行查詢,比如下面的查詢。

  清單 9. Getfiles_good.php該代碼不僅更短,而且也更容易理解和高效。我們不是執(zhí)行兩個(gè)查詢,而是執(zhí)行一個(gè)查詢。

  盡管該問題聽起來有些牽強(qiáng),但是在實(shí)踐中我們通常總結(jié)出所有的表應(yīng)該在同一個(gè)數(shù)據(jù)庫中,除非有非常迫不得已的理由。

 

  問題 4:不使用關(guān)系

  關(guān)系數(shù)據(jù)庫不同于編程語言,它們不具有數(shù)組類型。相反,它們使用表之間的關(guān)系來創(chuàng)建對象之間的一到多結(jié)構(gòu),這與數(shù)組具有相同的效果。我在應(yīng)用程序中看到的一個(gè)問題是,工程師試圖將數(shù)據(jù)庫當(dāng)作編程語言來使用,即通過使用具有逗號(hào)分隔的標(biāo)識(shí)符的文本字符串來創(chuàng)建數(shù)組。請看下面的模式。

  清單 10. Bad.sql[/code]  系統(tǒng)中的一個(gè)用戶可以具有多個(gè)文件。在編程語言中,應(yīng)該使用數(shù)組來表示與一個(gè)用戶相關(guān)聯(lián)的文件。在本例中,程序員選擇創(chuàng)建一個(gè) files 字段,其中包含一個(gè)由逗號(hào)分隔的文件 id 列表。要得到一個(gè)特定用戶的所有文件的列表,程序員必須首先從用戶表中讀取行,然后解析文件的文本,并為每個(gè)文件運(yùn)行一個(gè)單獨(dú)的 SELECT 語句。該代碼如下所示。

  清單 11. Get.php該技術(shù)很慢,難以維護(hù),且沒有很好地利用數(shù)據(jù)庫。惟一的解決方案是重新架構(gòu)模式,以將其轉(zhuǎn)換回到傳統(tǒng)的關(guān)系形式,如下所示。

  清單 12. Good.sql這里,每個(gè)文件都通過 user_id 函數(shù)與文件表中的用戶相關(guān)。這可能與任何將多個(gè)文件看成數(shù)組的人的思想相反。當(dāng)然,數(shù)組不引用其包含的對象 —— 事實(shí)上,反之亦然。但是在關(guān)系數(shù)據(jù)庫中,工作原理就是這樣的,并且查詢也因此要快速且簡單得多。清單 13 展示了相應(yīng)的 PHP 代碼。

  清單 13. Get_good.php這里,我們對數(shù)據(jù)庫進(jìn)行一次查詢,以獲得所有的行。代碼不復(fù)雜,并且它將數(shù)據(jù)庫作為其原有的用途使用.

 

  問題 5:n+1 模式

  我真不知有多少次看到過這樣的大型應(yīng)用程序,其中的代碼首先檢索一些實(shí)體(比如說客戶),然后來回地一個(gè)一個(gè)地檢索它們,以得到每個(gè)實(shí)體的詳細(xì)信息。我們將其稱為 n+1 模式,因?yàn)椴樵円獔?zhí)行這么多次 —— 一次查詢檢索所有實(shí)體的列表,然后對于 n 個(gè)實(shí)體中的每一個(gè)執(zhí)行一次查詢。當(dāng) n=10 時(shí)這還不成其為問題,但是當(dāng) n=100 或 n=1000 時(shí)呢?然后肯定會(huì)出現(xiàn)低效率問題。清單 14 展示了這種模式的一個(gè)例子。

  清單 14. Schema.sql該模式是可靠的,其中沒有任何錯(cuò)誤。問題在于訪問數(shù)據(jù)庫以找到一個(gè)給定作者的所有書籍的代碼中,如下所示。

  清單 15. Get.php如果您看看下面的代碼,您可能會(huì)想,“嘿,這才是真正的清楚明了。” 首先,得到作者 id,然后得到書籍列表,然后得到有關(guān)每本書的信息。的確,它很清楚明了,但是其高效嗎?回答是否定的。看看只是檢索 Jack Herrington 的書籍時(shí)要執(zhí)行多少次查詢。一次獲得 id,另一次獲得書籍列表,然后每本書執(zhí)行一次查詢。三本書要執(zhí)行五次查詢!

  解決方案是用一個(gè)函數(shù)來執(zhí)行大量的查詢,如下所示。

  清單 16. Get_good.php[/code]  現(xiàn)在檢索列表需要一個(gè)快速、單個(gè)的查詢。這意味著我將很可能必須具有幾個(gè)這些類型的具有不同參數(shù)的方法,但是實(shí)在是沒有選擇。如果您想要具有一個(gè)擴(kuò)展的 PHP 應(yīng)用程序,那么必須有效地使用數(shù)據(jù)庫,這意味著更智能的查詢。

  本例的問題是它有點(diǎn)太清晰了。通常來說,這些類型的 n+1 或 n*n 問題要微妙得多。并且它們只有在數(shù)據(jù)庫管理員在系統(tǒng)具有性能問題時(shí)在系統(tǒng)上運(yùn)行查詢剖析器時(shí)才會(huì)出現(xiàn)。

  結(jié)束語

  數(shù)據(jù)庫是強(qiáng)大的工具,就跟所有強(qiáng)大的工具一樣,如果您不知道如何正確地使用就會(huì)濫用它們。識(shí)別和解決這些問題的訣竅是更好地理解底層技術(shù)。長期以來,我老聽到業(yè)務(wù)邏輯編寫人員抱怨,他們不想要必須理解數(shù)據(jù)庫或 SQL 代碼。他們把數(shù)據(jù)庫當(dāng)成對象使用,并疑惑性能為什么如此之差。

  他們沒有認(rèn)識(shí)到,理解 SQL 對于將數(shù)據(jù)庫從一個(gè)困難的必需品轉(zhuǎn)換成強(qiáng)大的聯(lián)盟是多么重要。如果您每天使用數(shù)據(jù)庫,但是不熟悉 SQL,那么請閱讀 The Art of SQL,這本書寫得很好,實(shí)踐性也很強(qiáng),可以指導(dǎo)您基本了解數(shù)據(jù)庫。

關(guān)鍵詞:PHP數(shù)據(jù)庫問題

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證: 粵B1.B2-20030321 備案號(hào):粵B2-20030321-1
網(wǎng)站公安備案編號(hào):44060602000007 交互式欄目專項(xiàng)備案編號(hào):200303DD003  
察察 工商 網(wǎng)安 舉報(bào)有獎(jiǎng)  警警  手機(jī)打開網(wǎng)站