1

3 つのオプションはすべて同じですか (Y/N)、またはどちらかが優れていますか (A/B/C)?

オプション A - (1) 変数で SQL 文字列を定義し、(2) 変数の$sql「メソッド」を使用してステートメント ハンドルを定義し、ステートメントを構成し、(3) 手順 2 で実行関数を使用してステートメントの構成をアクティブにします。prepare$sql

    $sql = "SELECT * FROM table1";
    $sth = $dbh->prepare($sql);
    $sth->execute();


オプション B->query -メソッドが db オブジェクトで直接使用されるため、オプション Cと同様であり、SQL ステートメントが分離されているという点でオプション A と同様です。

    $sql = "SELECT * FROM table1";
    $sth = $dbh->query($sql);


オプション C - ステートメント ハンドルは SQL クエリそのものです (別の変数への参照はなく、1 つのメソッドのみを使用します。

    $sth = $dbh->query("SELECT * FROM table1");


質問:

  • 両方のオプションで同じ結果が得られますか?
  • 同じ結果が得られる場合、1 つのアプローチが推奨されますか (つまり、ベスト プラクティス)?
  • 「変数」、「メソッド」、「関数」などの用語は正しく理解できましたか?
  • メソッドを明示的に使用していないにもかかわらず、オプション A は引き続きデータベースにクエリを実行します->query()か?
  • SQL stmnt を個別の変数と PDO ステートメントに含めることの長所と短所は何ですか?

  • 4

    2 に答える 2

    3

    文字列変数または直接テキスト文字列の使用については、どちらの方法も同じだと思います。

    PDO を使用していると仮定すると、準備ステートメントとクエリ ステートメントの呼び出しには違いがあります。

    A の場合、prepare ステートメントはデータベースにプランを作成させ、クエリ文字列を再解析せずにステートメントを再実行できるようにします。

    ケース B では、クエリはすぐに実行されます。

    あなたの例では、Bは少し速く実行されます。ただし、ステートメントで引数を使用する場合、ケース A は、プレースホルダーがドライバーによって置き換えられるため、セキュリティが強化されます。

    于 2012-12-28T01:48:11.373 に答える
    2

    両方のオプションで同じ結果が得られますか?

    はい。

    同じ結果が得られる場合、1 つのアプローチが推奨されますか (つまり、ベスト プラクティス)?

    どちらも問題ありません。あなたの特定の例では、オプション B はより少ないコードで同じ仕事を成し遂げます。

    ただし、クエリでパラメーターや制約を使用する必要がある場合 (例: ...WHERE id = :id)、オプション A を選択して、 $dbh->bindParam(':id', $ を使用してパラメーターをバインドする必要があります。 id, PDO::PARAM_INT) ステートメントを準備した後のメソッド。

    $dbh->prepare('UPDATE table SET column = :value WHERE id = :id');
    $dbh->bindParam(':value', $someNewValue, PDO::PARAM_STR);
    $dbh->bindParam(':id', $targetId, PDO::PARAM_INT);
    $dbh->execute();
    

    このようにすることで、SQL インジェクションなどの厄介なことからも保護されます。

    クエリを別の変数に格納する必要があるのは、後でそのクエリをコードで再利用する予定がある場合のみです。それ以外の場合は、準備/クエリ メソッド内に直接入力することもできます。

    「変数」、「メソッド」、「関数」などの用語は正しく理解できましたか?

    ほぼ正しいように見えます! ただし、「実行関数」はメソッドです。関数とメソッドは、メソッドと呼ばれるオブジェクトに属する場合を除いて、基本的に同じものです。あなたの例では、 execute は $sth オブジェクトに属しているため、メソッドと呼ばれます。

    ->query() メソッドを明示的に使用していなくても、オプション A はデータベースにクエリを実行しますか?

    はい。execute メソッドは、$dbh->prepare(...) で準備されたクエリを実行します。パラメータを使用したい場合は、準備メソッドと実行メソッドの間で ->bindParam() を呼び出すことができます。パラメータが必要ない場合は、 ->query() を直接呼び出す方が実際にはより便利な方法です。

    于 2012-12-28T01:55:47.320 に答える