0

postgresを使用してPHPでプリペアドステートメントを作成しようとしています。

説明するのは少し難しいので、ここで紹介します。

$stmt = "SELECT * FROM customer WHERE zip = '$1'";

if(isset($_POST["CITY"])){ 
   $stmt .= "AND city = '$2'";
}

if(isset($_POST["COUNTRY"])){ 
   $stmt .= "AND country = '$3'";
}

$result = pg_prepare("myconnection", "my query", $stmt);

$result1 = pg_execute("myconnection","my query", array("0000","someCity","someCountry"));

コードの一部が間違っている場合は申し訳ありませんが、それはフリーハンドの例です。私が必要としているのは、いくつかの変数が設定されているかどうかに応じて、プリペアドステートメントを動的にできるようにすることです。ステートメントが1つだけを期待している場合、または$1と$3を追加するだけで、$ 2を追加する必要がない場合、配列に3つの変数を投稿するときは機能しないようです。ご理解頂けるとありがたいです。

今週末は使う必要があるので、誰か知ってもらいたいです!

前もって感謝します!

4

4 に答える 4

1

3 つの異なるステートメント (ケースごとに 1 つ) を用意し、渡されたパラメーターの数に応じて適用されるステートメントを実行しても問題はありません。例:

編集:すべてのケースに一致するようにコードを変更しました:

  • 指定された zip のみ
  • 郵便番号 + 都市
  • 郵便番号 + 国
  • 郵便番号 + 市区町村 + 国

(他にもいくつかのケースがあっても、その考えは理解できます)

$stmt = "SELECT * FROM customer WHERE zip = '$1'";

if(isset($_POST["CITY"]) && isset($_POST["COUNTRY"])) { 
   $stmt3 = $stmt . " AND city = '$2'" . " AND country = '$3'";
} elseif(isset($_POST["CITY"])) { 
   $stmt1 = $stmt . " AND city = '$2'";
} elseif(isset($_POST["COUNTRY"])) {
   $stmt2 = $stmt . " AND country = '$2'";
}

if(isset($stmt3)) {
   $result = pg_prepare("myconnection", "my query", $stmt3);
   $result1 = pg_execute("myconnection","my query", array("0000","someCity","someCountry"));
} elseif(isset($stmt2)) {
   $result = pg_prepare("myconnection", "my query", $stmt2);
   $result1 = pg_execute("myconnection","my query", array("0000","someCountry"));
} elseif(isset($stmt1)) {
   $result = pg_prepare("myconnection", "my query", $stmt1);
   $result1 = pg_execute("myconnection","my query", array("0000","someCity"));
} else {
   $result = pg_prepare("myconnection", "my query", $stmt);
   $result1 = pg_execute("myconnection","my query", array("0000"));
}

簡潔にするために、すべてのエラーチェックを(あなたがしたように)省略しました。

于 2012-08-17T19:19:51.277 に答える
1

準備済みステートメントでは、SQL は意図的に静的です。ステートメントが準備されると、パラメーターの数を変えることはできません。

ただし、ステートメントに応じて、コードが適切な数のパラメーターを送信するのは簡単です。パラメータのカウンター用の変数と、ハードコーディングされたリテラルの代わりに pg_execute に渡す動的 php 配列を追加できます。そして、それらはif (isset(...))ブランチ内でインクリメント/入力されます。

于 2012-08-17T18:11:46.540 に答える