12

1 つのスクリプトでデータベースに対して複数の呼び出しを行うため、準備済みステートメントが必要であることはわかっています。

次の文について具体例を挙げてほしい

型キャスト、変数の検証とサニタイズ、準備済みステートメントでの PDO の使用を見てください。

変数を検証してサニタイズするという彼の意味を私は知っています。ただし、準備されたステートメントについては完全にはわかりません。ステートメントをどのように準備しますか?フィルターによって、つまりサニタイズによって?それとも、PDO 層によってですか? 層の定義は何ですか?

準備されたステートメントはステートメントで何を意味しますか? 具体的な例を使用してください。

4

4 に答える 4

8

準備されたステートメントはステートメントで何を意味しますか?

ドキュメントから:

この機能により、繰り返し使用されるコマンドを実行するたびにではなく、一度だけ解析して計画することができます。

pg_prepareを参照してください

上記のリンク先のページの例:

<?php
// Connect to a database named "mary"
$dbconn = pg_connect("dbname=mary");

// Prepare a query for execution
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Execute the prepared query.  Note that it is not necessary to escape
// the string "Joe's Widgets" in any way
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Execute the same prepared query, this time with a different parameter
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));
?>

プリペアド ステートメントのMySQL ドキュメントは、次の質問にうまく答えています。

  • 準備済みステートメントを使用する理由
  • いつプリペアド ステートメントを使用する必要がありますか?
于 2009-08-07T23:19:56.717 に答える
6

これは、パラメーターを手動で引用する必要をなくすことで、SQL インジェクション攻撃を防ぐのに役立つことを意味します。

変数を sql に配置する代わりに、ステートメントの実行時に実際の値に置き換えられる名前付きまたは疑問符マーカーを使用します。

PHP マニュアルのPDOの定義:
「PHP Data Objects (PDO) 拡張機能は、PHP でデータベースにアクセスするための軽量で一貫したインターフェイスを定義します。」

PDOおよびPDO::prepareの php マニュアルを参照してください。

名前付きマーカーを使用した準備済みステートメントの例:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = :username
AND password = :pass";

$sth = $pdo->prepare($sql);
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password']));
$result = $sth->fetchAll();

疑問符マーカーを含む準備済みステートメントの例:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = ?
AND password = ?";

$sth = $pdo->prepare($sql);
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetchAll();
于 2009-08-08T00:02:54.400 に答える
0

Karim79の回答に返信する

これ

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1');

これと同じようです

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?');

結論:サニタイズを考慮する必要がないため、PHPを使用するpg_preparepg_executePHPがはるかに効率的になります。また、PDOの使用にも役立ちます。

于 2009-08-08T02:09:26.347 に答える
0

ステートメントの準備方法:

クエリを 1 回定義すると、さまざまな値で何度でも呼び出すことができます。(例:ループ内)

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));
$result = pg_execute($dbconn, "my_query", array("row two"));
$result = pg_execute($dbconn, "my_query", array("row three"));

参照: http://us2.php.net/manual/en/function.pg-execute.php

于 2009-08-07T23:11:36.593 に答える