2013-02-26 29 views
2

這是一個隨機問題,我認爲它與風格和組織有關。 我有一個Web應用程序,我使用PDO連接到MySQL數據庫,並且在一些腳本中有很多查詢,它們不一定涉及相同的表。即我將在一個執行一個SELECT語句,然後根據一些值我會更新另一個,最後去從另一個DELETE。關於在php腳本中爲多個mysql查詢組織代碼的想法

事情是我最近才學會了PHP和MySQL,並且因爲我不確定,並且想要小心並容易地找到任何問題(並且稍微有點因爲我對一些愚蠢的事情如統一性和在每個查詢編碼風格)我用下面的格式

try { 
    $statement = " 
     UPDATE/SELECT ... 
     FROM/SET ... 
     WHERE ..."; 
    $query = $dbcnx->prepare($statement); 
    $flag = $query->execute(); 
} 
catch (PDOException $e) { 
    $errorMsg = "..."; 
    error_log($errorMsg,3,'../../xxx.log'); 
    $response = ...; 
    $dbcnx->null; 
    return $response; 
} 
$result = $query->fetch/fetchAll/fetcColumn... 

所以我能找到的地方會出現的任何問題(try/catch語句),並要對注射和無效字符(準備)安全(我有一些個人支票但我非常確定這個功能會更好)。

當我有一個或兩個查詢,這是好的,但代碼後長大成爲對小的動作/物質有點太代碼(如16行一個查詢...)

所以我想一些建議。 如何讓我的代碼更易於管理? 在我的邏輯結構(我寫它的方式)有一些基本的錯誤? 使用try/catch有一些規則嗎?是更多的開發和調試,然後你可以刪除它的一些塊?

我在想這個代碼塊的功能,並用語句作爲參數調用它。因此,我只需在主體中鍵入查詢,然後調用函數進行準備,執行並返回結果。當然,我會一直使用fetchAll,並且會返回一個關聯數組,但我認爲只要數據集很小,內存使用情況就會好(在任何情況下,在現在的系統中,我認爲它應該使用LOT來注意差異)。 ..

任何想法都歡迎。

我意識到這實際上並不是代碼和設置,s/w和其他問題的程序問題,但我希望它仍然遵循這一精神。

+3

您的問題可能更適合codereview.stackexchange.com – j08691 2013-02-26 18:24:21

+2

此問題不適用於codereview。沒有什麼可以審查。該代碼是一個草圖,以顯示OP目前正在使用的練習。這對於Stackoverflow來說是個完美的問題。比99%的「找到一個錯字」的問題要好得多。 **爲什麼大家都急於從Stackoverflow中趕走好的編程問題?**如果你唯一的原因是你不知道該怎麼回答,請不要closevote。 – 2013-02-26 18:55:14

回答

3

首先,感謝您的出色問題。
令我驚訝的是,這裏有很少的問題要求更好的代碼實踐。
沒有人關心他們的代碼質量,但每個人都要求代碼複製/粘貼,而不必介意他們有什麼。

下,有2件你需要知道的偉大的事情:

  1. 在try..catch是一個特殊的(雙關語不打算)運算符。必須很少使用它,因爲可以從要處理的代碼中恢復的錯誤。用它來記錄錯誤是一個致命的罪過,也是浪費寶貴和強大的機制。
  2. 你真正需要的是一個數據庫抽象層做所有的髒作業和處理複雜的情況。

您需要閱讀例外。
這是編程語言自語法突出顯示以來最大的改進。
他們不打算立即捕捉。這一點完全相反 - 以集中方式捕捉異常,並擁有一個異常處理程序。

但即使沒有處理程序執行功能已經足夠好了。一個錯誤的查詢會停止腳本,會顯示503錯誤,並會記錄錯誤信息或根據PHP設置在屏幕上顯示它 - 沒有什麼需要更多!

所以,剛剛擺脫的所有處理代碼,只是告訴PHP使用記錄錯誤

ini_set('log_errors',1); 
ini_set('error_log','/path/to/log'); 

的文件,你會得到相同的結果具有顯着更少的代碼。

對於抽象庫,就看你的代碼:

$statement = "UPDATE/SELECT FROM/SET ...   WHERE ..."; 
$query = $dbcnx->prepare($statement); 
$flag = $query->execute(); 
$result = $query->fetch/fetchAll/fetcColumn... 

線,其中只有一個有意義。

爲什麼不讓它已經一行 -

$result = $db->getRes($statement); //okay, leaving query separate for readability 

只是給你怎麼可能會想法 - 我自己database abstraction class
它是基於mysqli的頂部,但可以很容易的被改寫無論其他驅動程序包括PDO

+0

謝謝。我知道我的try/catch使用很浪費......很明顯,在某種感覺上..我會檢查你的代碼,希望我能理解 – 2013-02-26 19:31:04

+0

好吧......我想我明白了......我會不得不在課堂上多讀一些,但我想我明白了。我有點困惑,因爲我正在考慮更經典的程序中的類的實例,它們在創建後始終可用。在腳本的每一個新的調用中,你都會重新創建一個實例,並且執行你將要做的事情,並在它結束時被銷燬。我在前面做了很多工作......我幾乎完成了我的小網站......噢,生活和學習 – 2013-02-26 19:44:52