2011-01-12 9 views
0

私はこのコード(ちょうどいくつかのコードを削減するためにエスケープ削除のparam)持っている:私は自分のコードを整理する時に本当に悪いんだと私はあなたのコードのDRYを保つことの重要性について読んでいる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; 
} 

それはいくつかの同様の機能を減少させるが、それはまた読みクエリははるかに困難になります最初は。これを行った後のもう1つの問題は、フィールドでクエリが若干異なる場合があります。フィールドがタグであれば、私はそれ以上の追加の列を必要としない、多分クエリが今まで変わってしまうとしましょう:

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

今「余分な厄介取得し始めていますが、私は人々がドン感を持っています実際にそれを行う。

私が読んだもう1つのことは、関数は1つのことを行うだけであるということです。だから私はこのようなこの機能を切り詰めるだろうか?

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) "重複キー"は、INSERTの非標準の拡張機能であり、今後SQLデータベースを使用せずに移動する必要がある場合、将来問題が発生します。 (私はそれがMySQLだけだと思う​​)。

どちらが優れているかについては、まず第1または第3を理解しようとします。

+0

ご質問ありがとうございます。私の質問は主にクエリコードを複製する必要があるかどうかを質問することでしたが、機能を細かく分割する必要がある場合もあります。あなたの提案では、私はMySQLから離れていくとは思わないので、それが問題になるとは思わない。私は数字1を使って考えてみましょう。 – Joker