この簡単な質問があります。フォームからユーザー名変数を取得しましたが、それをクエリに挿入する必要があります。どこが間違っているのか教えてください。「フィールド リストの不明な列 '$username'」 '
コードは次のとおりです。
echo $HTTP_POST_VARS['username'];
echo $username;
$query = sprintf( 'SELECT $username FROM hostess' );
$username
。 'SELECT $username FROM hostess'
が、それは有効な SQL ステートメントではありません。あなたはもっと次のようなものが欲しいでしょう:
$query = sprintf( "SELECT * FROM hostess WHERE username='%s'", $username);
$usernameを確実に消去した後。
PHP では、文字列に一重引用符を使用すると、変数の文字列が解析されません。連結または二重引用符を使用します。
$query = sprintf( 'SELECT ' . $username . ' FROM hostess' );
$query = sprintf( "SELECT $username FROM hostess");
もちろん、これは POST var をこのように使用することの恐ろしいリスクについては何も言うことはありません。
うーん、すべてが間違っているようです..
まず、変数 $username を定義していません。あなたがしていることは、まだサブグローバルをサポートしているバージョンの PHP でのみ有効です。
次に、なぜクエリに sprintf を使用しているのですか?
ちなみに、HTTP_POST_VARS は非推奨です。ポストを使用
正しいコードは次のようになります。
$username = $_POST['username'];
echo $username;
$query = mysql_query("SELECT ".$username." FROM hostess");
$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));