2013-01-20 77 views
0

更新:感謝所有幫助人員,我決定嘗試編寫自己的PHP類來處理MySQL請求。寫我自己的MySQL庫?這是個好主意嗎?

現在我面臨着一個問題,當我試圖從mysql_mysqli_功能進行切換,在我有字面上數以萬計的PHP/MySQL的代碼行和查詢的分散在數百個文件,他們都使用的功能,如mysql_query,mysql_num_rows,mysql_fetch_assoc等。通過並改變這些行(甚至與查找/替換),以mysqli_函數與準備好的語句和所有是痛苦的,但如果在未來的PHP.net會決定發佈一些其他的東西,而這些東西會使mysqli_函數不被使用?

所以現在我正在考慮編寫我自己的MySQL庫(是你稱之爲?),它調用mysqli_函數並將其包含在我的所有文件中。這樣,如果我將來需要改變其他的東西,理論上我可以改變我的「圖書館」中的功能一次,改變會反映在所有頁面上,而不是手動進行手動修改。

這是個好主意嗎?我在網上找到了一個名爲MeekroDB的東西,但首先我不確定它是否是我正在尋找的東西,其次他們要收取50美元來商業使用(我想這樣做)。是否有其他免費解決方案,還是我只是在浪費我的時間?

任何意見/反饋是讚賞:)

編輯:在這種情況下尚不清楚,它並不是因爲如果我做的,我正在做的查詢所有文件到我的數據庫的連接到數據庫。我有一個functions.php文件,用於連接到MySQL數據庫,並在我的所有其他文件中使用我的include文件。我的問題更多地涉及到功能,如mysql_query,mysql_num_rowsmysql_fetch_assoc

+5

這裏的問題是,你有你的數據庫代碼「分散在數百個文件」。你需要重構以避免這種情況。 –

+0

我該怎麼做?我的意思是,我有一個functions.php文件,包括我自己編寫的所有函數和該文件中的數據庫連接,但是如何防止在單獨的文件中創建'mysql_query',或者在文件中使用'mysql_fetch_assoc'我需要它嗎? – Charles

+0

您可以通過從模塊中抽象出數據庫邏輯並在「更高級別」上使用它們來避免這種情況。我強烈建議尋找像Zend,Laravel或CodeIgniter這樣的PHP框架!他們幫助你避免這種情況。 – mpaepper

回答

4

從查看你參考的鏈接到MeekroDB,我不認爲你正在寫的是一個MySQL API,如mysql_*//mysqli_*方法。

你實際上想寫的是一個數據庫抽象層,儘管它特定於MySQL。事實上,除非你要編寫自己的底層模塊來與MySQL進行通信(當然,你也可以在PHP中使用,難度爲),你可能最終會使用無論如何,作爲後盾的方法都是mysqli_

這些圖層中有許多可用,但我會誠實地考慮使用PDO來編寫自己的圖層,或者如果您擔心函數被棄用,請使用mysqli_*。 PDO使用它自己的MySQL驅動程序,所以如果需要更新的話。它還支持所有你需要的功能,包括易於使用的事務處理,準備好的語句和什麼。

如果您想創建自己的易訪問方法,例如DB::Query(..),您可以通過簡單地包裝PDO來實現。

總體而言,雖然我不明白這將如何幫助組織您的代碼。你可能會想要像你的數據庫一樣的ORM(對象關係映射器),你可以定義你自己的類直接映射到表,這應該減少幾乎完全運行查詢的需要,除了邊緣情況。可用的最全面的ORM可能是Doctrine,儘管你可以很容易地通過再次包裝PDO來編寫自己的ORM。

就像什麼,你可以通過使用ORM實現的例子,這裏的代碼片段演示:

$blogPost = BlogPosts::Load(123); 
$blogPost->title = 'New Title'; 
$blogPost->save(); 
1

您正在尋找類似「數據庫包裝類」的東西。

PHP自5.1以來有一個內置的抽象層,稱爲PDO。

3

圍繞基本的PHP數據庫函數包裝代碼是一個好主意,否則已經有幾個很好的解決方案,您不應該爲自己的庫構建自己的庫。也許ORM(Object-relational_mapping)會對你很有趣,流行的庫有doctrinepropel

2

這是個好主意嗎?

事實上,這是只有理智的方式來處理SQL查詢。

讓我建議你我的library, designed to protect your queries against SQL injections。它是完全免費的,比任何花費50美元或5000美元的方式都更好。

開始使用前唯一需要學習的是類型暗示的佔位符,但這個概念非常簡單,我相信您一秒鐘就能得到它。不過,隨時提出任何問題。

順便說一句,PDO顯然不是要走的路 - 醜陋,辛苦地使用和不安全的查詢,略超出幾個基本案例。
例如:

// SafeMySQL: only 2 lines and not a sign of injection 
$sql = "SELECT * FROM goods WHERE category IN(?a) ORDER BY ?n"; 
$data = $db->getAll($sql, $_GET['categories'], $_GET['orderby']); 

// PDO 
// errr... (massive headscratching resulting with something like 
// 2 screens of code with manual escaping and all that stuff 
// but most likely still unsdafe as only few PHP developers 
// actually have an idea how to properly handle such cases) 
+1

如果您的應用程序需要與各種數據庫兼容,則PDO肯定是最好的選擇。這取決於你的需求。 – Brad

+0

您能舉出PDO如何「不安全」的例子嗎? –

相關問題