2

3つまたは4つを超えるパラメーターを処理する場合、位置パラメーターは悪夢になります。名前付きパラメーターは冗長です。私はこれを行うことを考えています:

query("SELECT * FROM users WHERE username = ", $username, " AND password = ", $password)

動的パラメーター(を使用func_get_args())を使用すると、1つおきに位置パラメーターに変換されます。

私はこれまでこれを見たことがなく、誰かがこれを以前に行ったことがあるかどうか、そしてその理由/理由を知りたいと思いました。

4

3 に答える 3

4

名前付きパラメーターは、少なくとも位置パラメーターと比較して、冗長である必要はありません。まだ明らかな短縮バージョンを使用できます。

$st = $dbh->prepare('SELECT * FROM users WHERE username = :u AND password = :p');
$st->bindValue(':u', $username);
$st->bindValue(':p', $password);
$st->execute();
于 2009-12-07T00:59:29.283 に答える
2

それは賢い考えです。私が見る唯一の問題は、SQLと渡された変数をどのように区別するかです。1つおきの引数が変数であると仮定しない限り。私はただ、仮定は壊れやすく、物事を明確にする以上に曖昧にしていると思います。

より良い方法は、おそらく補間を使用することです。

query("SELECT foo FROM bar WHERE id = #{id}",  array("id" => "23"));

次に、これらを補間するロジックを記述します。

于 2009-12-06T22:50:51.623 に答える
1

位置パラメータはそれほど悪いとは思いません...これは私のお気に入りの方法です:

function mysql_safe_string($value) {
    if(is_numeric($value))      return $value;
    elseif(empty($value))       return 'NULL';
    elseif(is_string($value))   return "'".mysql_real_escape_string($value)."'";
    elseif(is_array($value))    return implode(',',array_map('mysql_safe_string',$value));
}

function mysql_safe_query($format) {
    $args = array_slice(func_get_args(),1);
    $args = array_map('mysql_safe_string',$args);
    $query = vsprintf($format,$args);
    $result = mysql_query($query);
    if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>';
    return $result;
}

// example
$result = mysql_safe_query('SELECT * FROM users WHERE username=%s', $username);
于 2009-12-07T01:05:40.733 に答える