0

(前のページの複数のチェック ボックスから) POST フォームを介して渡された複数の値があり、それらを配列 $vals に格納しました。ここで、ループのどこまで進んだかに応じて、わずかに異なるクエリを生成するクエリ文字列を (while ループで) 記述したいと考えています。

<?php
$vals=($_POST['selectedIDs']);
$i=0;
while($vals[$i] != NULL){
$query = "SELECT * FROM List foo WHERE foo.fooID = echo $vals[$i]";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";                   
$i += 1;
}?>

しかし、それはこのように動作しないようですか?クエリに二重引用符を付けることで、

echo $vals[$i]

リテラル文字列ではなく、現在のインデックスの実際の値を $vals[$i] に生成しますか? これは何が起こっているのですか?mysql サーバーが受け入れるクエリ文字列内に php を含めることはできませんか?

サーバーテーブルに「12345」のfooIDがあるとしましょう。$vals='12345' を設定して次のように書いても:

$query = "SELECT * FROM List foo WHERE foo.fooID = $vals";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";

それはまだ機能しません。私の一般的な質問は次のようになると思います:クエリ文字列で変数の値を書き込み/取得することは可能ですか?そうでない場合、私の状況を回避する別の方法はありますか? どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

1

まず第一に、ループでクエリを実行しないでください。

第二に、SQL インジェクションによって被害を受ける可能性があるため、直接の $_POST や $_GET、またはクエリでクライアントが渡すものは一切使用しないでください。wikiおよびphp での mysql のデータのクリア

わかりましたので、それをどのように行うべきですか(私は最初のものについてのみ言っています.2番目のものは oop なしでそれを作る方法がわかりません)。

<?php
$vals=($_POST['selectedIDs']);
$vals = implode(',',$vals);
$query = "SELECT * FROM List foo WHERE foo.fooID IN ($vals)";
$result = mysqli_query($link, $query);

while ($row = mysqli_fetch_row($result)) {
     echo "YES IT WORKS!";  
     var_dump($row); //you will see all the data in one row
}
}?>
于 2013-06-02T23:22:16.477 に答える
1

サニタイズされていない$_POSTed 値を SQL クエリに配置しないでください。パラメータ化された引数と mysqli の使用 を検討してください。

次の構文を使用して変数を出力できます。

$myVar = 'toast';
$combined = "I like $myVar";

ただし、これは配列に対して期待どおりには機能しません。

implode()配列の場合、最初に配列を文字列に変換するためにphpのようなものを使用することを検討する必要があります.

于 2013-06-02T23:05:16.437 に答える
0

アドバイスをありがとうございますが、構文エラー (および余分な echo ステートメント) が原因で、コードが正しく実行されませんでした。元のコードでは、$vals[$i] の周りに引用符がありませんでした。foo.fooID=12345 を受け入れず、foo.fooID='12345' を受け入れたため、これは mysql 構文の誤りです。これがそれを解決した最終的なコードです

<?php
$vals=($_POST['selectedIDs']);
$i=0;
while($vals[$i] != NULL){
$query = "SELECT * FROM List foo WHERE foo.fooID = '$vals[$i]'";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";                   
$i += 1;
}?>
于 2013-06-03T07:58:26.890 に答える
0

SQL 文字列に追加のエコーがあります。

$query = "SELECT * FROM List foo WHERE foo.fooID = echo $vals[$i]";

そのはず:

$query = "SELECT * FROM List foo WHERE foo.fooID = $vals[$i]";

一般に、ユーザー入力から SQL 文字列を作成するのは悪い考えです。代わりに準備済みステートメントを使用してください。準備済みステートメントの詳細については、こちらをご覧ください。

http://php.net/manual/en/pdo.prepared-statements.php

于 2013-06-02T23:03:24.883 に答える