0

この簡単な質問があります。フォームからユーザー名変数を取得しましたが、それをクエリに挿入する必要があります。どこが間違っているのか教えてください。「フィールド リストの不明な列 '$username'」 '

コードは次のとおりです。

echo $HTTP_POST_VARS['username'];

   echo $username;
   $query = sprintf( 'SELECT $username FROM hostess' );
4

4 に答える 4

1
  1. 提供されたコードでは、決して設定しません$username
  2. あなたはSql インジェクションに対して広く開かれています。
  3. 何らかの理由でsprintfを使用しています-文字列をフォーマットしますが、フォーマットを提供していません。以下の例では
  4. しようとしています'SELECT $username FROM hostess'が、それは有効な SQL ステートメントではありません。

あなたはもっと次のようなものが欲しいでしょう:

$query = sprintf( "SELECT * FROM hostess WHERE username='%s'", $username);

$usernameを確実に消去した後。

于 2012-06-19T22:48:41.623 に答える
0

PHP では、文字列に一重引用符を使用すると、変数の文字列が解析されません。連結または二重引用符を使用します。

$query = sprintf( 'SELECT ' . $username . ' FROM hostess' );
$query = sprintf( "SELECT $username FROM hostess");

もちろん、これは POST var をこのように使用することの恐ろしいリスクについては何も言うことはありません。

于 2012-06-19T22:42:06.177 に答える
0

うーん、すべてが間違っているようです..

まず、変数 $username を定義していません。あなたがしていることは、まだサブグローバルをサポートしているバージョンの PHP でのみ有効です。

次に、なぜクエリに sprintf を使用しているのですか?

ちなみに、HTTP_POST_VARS は非推奨です。ポストを使用

正しいコードは次のようになります。

    $username = $_POST['username'];
echo $username;

$query = mysql_query("SELECT ".$username." FROM hostess");
于 2012-06-19T22:43:31.890 に答える
0
$query = sprintf( 'SELECT %s FROM hostess', $username);

-または、それが文字列値である場合は、クエリ テキストで一重引用符で囲みます -

$query = sprintf( "SELECT '%s' FROM hostess", $username);

注: 生成された SQL ステートメントは、ホステス テーブルのすべての行に対して同じリテラル値を返すという点で、少し奇妙に見えます。ホステス テーブルに 100 行ある場合、同じリテラル値を持つ 100 行が返されます。これはあなたが望むものかもしれませんが、私には非常に奇妙に思えます。

注: sprintf 関数は、最初の引数で %s、%d などのプレースホルダーを探し、それらを残りの引数の値に置き換えます)。

注:$usernameフォームからの値が含まれていて、検証されていない場合、SQL インジェクション攻撃を阻止するために、(確かに古い学校の) mysql_real_escape_string関数を使用します。(他の人は、同じ結果を達成するための、より優れた、より現代的な手法の提案を提供します。)

$query = sprintf("SELECT '%s' FROM hostess",mysql_real_escape_string($username));
于 2012-06-19T22:40:41.263 に答える