2011-01-12 92 views
0

我有這樣的代碼(刪除PARAM逃逸只是削減了一些代碼):PHP MySQL如何組織這段代碼?

private function _get_tag_id($value) 
{ 
    $sql = "INSERT INTO tags (tag, added) VALUES ('$value', ".time().") " 
     . "ON DUPLICATE KEY UPDATE tag_id = tag_id"; 
    $id = execute($sql); 

    if (empty($id)) 
    { 
     $sql = "SELECT tag_id FROM tags WHERE tag = '$value'"; 
     $id = execute($sql); 
    } 

    return $id; 
} 

我在整理我的代碼真的不好,我一直在閱讀關於保持你的代碼乾的重要性。這是否包括您可能有的任何疑問?例如,我需要執行這些相同的查詢了幾場,和我做了什麼是它改成這樣:

private function _get_field_id($field, $value) 
{ 
    $sql = "INSERT INTO {$field}s ({$field}, added) VALUES ('$value', ".time().") " 
     . "ON DUPLICATE KEY UPDATE {$field}_id = {$field}_id"; 
    $id = execute($sql); 

    if (empty($id)) 
    { 
     $sql = "SELECT {$field}_id FROM {$field}s WHERE {$field} = '$value'"; 
     $id = execute($sql); 
    } 

    return $id; 
} 

雖然減少了一些類似的功能,這也使得查詢更難閱讀首先。這樣做後的另一個問題是,如果有時查詢可能會略微不同的字段?比方說,如果該字段是標籤,我不需要添加的列更多的,也許現在的查詢將變爲:

$sql = "INSERT INTO {$field}s ({$field}".($field == 'tag' ? '' : ", added").") " 
    . "VALUES ('$value', ".($field == 'tag' ? '' : time()).") " 
    . "ON DUPLICATE KEY UPDATE {$field}_id = {$field}_id"; 

現在它開始獲得額外的亂,但我有一種感覺,人不」實際上是這樣做的。

我讀過的另一件事是功能應該只做一件事。那麼我會如何切斷這個功能?

private function _get_tag_id($value) 
{ 
    $id = $this->_add_tag_id($value); 

    if (empty($id)) 
    { 
     $id = $this->_get_tag_id($value); 
    } 

    return $id; 
} 

還是會更好地保持原來的樣子?

如果你不認爲要麼。我試圖組織代碼是正確的,也覺得免費建議你去做,或者換句話說方式會是什麼組織這些簡單的最佳方式方法代碼位?

回答

0

我會把它顛倒 - 選擇第一個,如果找不到,插入。

兩個原因:

1)你會選擇和發現更多的往往是選擇與思念,所以選擇第一平均爲快。 「對重複鍵」

2)是一個非標準擴展可以插入能導致未來的問題,如果你曾經遷移到SQL數據庫沒有它。 (我認爲它只是MySQL)。

至於哪個更好,我寧願試圖瞭解第一或第三。

+0

謝謝您的回答,雖然我的問題主要是問我是不是應該被重複的查詢代碼,以及我是否應該掰開我的功能,更小的功能。對於你的建議,我不認爲我會離開MySQL,所以我不認爲這會是一個問題。我會考慮使用1號。 – Joker 2011-01-12 22:37:55