2009-02-27 19 views
0

私はmethod = postというフォームを持っています。これは、フォームハンドラファイルに投稿して、投稿をDBに書き込んだり、その結果をユーザにメールしたりしています。php mysqlクエリの問題

私はinsert文を書いていますが、フォームが処理されているときにエラーが発生していますが、DBの問題ではありません。ここでcode--

// MYSQL QUERY 
$result = mysql_query("INSERT INTO 2009_prize_results 
    (name, address, address2, email, 100, 101, 102, 103, 104, 105, 106, 107, 108) 
VALUES 
    ($_POST[name],$_POST[address],$_POST[address2],$_POST[email] 
    ,$_POST[100],$_POST[101],$_POST[102],$_POST[103],$_POST[104],$_POST[105] 
    ,$_POST[106],$_POST[107],$_POST[108])"); 
if (!$result) { 
    die ("SQL error: " . mysql_error()); 
} 

だと

SQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '100, 101, 102, 103, 104, 105, 106, 107, 108) VALUES (Marty Martin,313 Orlando Av' at line 1

is--私は取得していますエラーが提出値が

name = Marty Martin 
address = 313 Orlando Ave 
address2 = Anytown, VA 
email = [email protected] 
100 = on 
101 = off 
10* are all checkboxes so are either on or off 

だった私はここで何が問題を持っていますか?

+0

次回は適切な書式を使用してください:http://stackoverflow.com/editing-help – Gumbo

答えて

3

あなたは

EDITをVALUESの各項目の周りの単一引用符が必要になります。また、あなたの$ _POST []変数を文字列中に評価されない可能性があります。別の構文を使用するか、evil extract()を使用する必要があります。

+0

ありがとう、それは問題の一部でした! – Marty

1

値を引用符で囲む必要があります。たとえば:

... VALUES(Marty 

はする必要があります

... VALUES('Marty' 

試してみてください。

// Concatenated for readability 
$query = "INSERT INTO 2009_prize_results " . 
     "(name, address, address2, email, 100, 101, 102, " . 
     "103, 104, 105, 106, 107, 108) VALUES " . 
     "('{$_POST['name']}', 
      '{$_POST['address']'}, 
      '{$_POST['address2']}', 
      '{$_POST['email']}', 
      '{$_POST[100]'}, '{$_POST[101]}', '{$_POST[102]}', '{$_POST[103]}', 
      '{$_POST[104]}', '{$_POST[105]}', '{$_POST[106]'}, '{$_POST[107]}', 
      '{$_POST[108]'})"; 

$result = mysql_query($query); 
+0

curses!私より41秒も速い! – tkotitan

+0

これは、PHPの埋め込み文字列の置換が*悪い考えである理由の良い例です。 – staticsan

+0

確かに、sprintf(またはより良い:prepared文)を使用する方が良い方法かもしれません。単純なものについては、二重引用符で置き換えられたものは非常に便利です。 – Ross

2

これらの問題をデバッグするには、実際に送信されたクエリを見て、何が間違っているかを確認することです。何が間違っているのか分かると、どのような価値が作品を盛り上げているのかを把握し、適切な調整や妥当性チェックで修正することができます。

また、文字列は ''(一重引用符)で囲まれ、文字列に指定されていない値はNULL(引用符なし)として渡される必要があります。また、テーブルやカラムの名前が標準でないか、あるいはそれ以外に問題がある場合は、その名前の周りに ``(backticks)を忘れないようにしてください。それらも構文エラーを引き起こす可能性があります。

+0

ありがとう、あなたは正式な非標準的な名前については、列の名前を持つDBにも整数の問題を引き起こしているようだ。 – Marty

+0

$ _POST ['108'] = "'); DROP TABLE 2009_prize_results; - " –

9

参照してください:あなたは、その後のMySQLライブラリを使用する必要がある場合

Little Bobby Tables :-) How does the SQL injection from the "Bobby Tables" XKCD comic work?

あなたはmysql_real_escape_stringのを通して、あなたの入力のすべてを実行していることを確信してください、そうでないプリペアドステートメントを使用します。

次に、クエリをまとめてVALUESをすべて引用符で囲みます(シングルまたはダブルが動作します)。

+1

これは非常に重要です。 –

4

実際にそのような数値名の列を持っている場合は、バックテックで区切る必要がありますので、SQLでリテラル番号として解釈されません。そして、あなた自身の正気と私のために、あなたの質問をフォーマットしてください。

$result = mysql_query(" 
INSERT INTO 2009_prize_results(
     name 
    , address 
    , address2 
    , email 
    , `100` 
    , `101` 
    , `102` 
    , `103` 
    , `104` 
    , `105` 
    , `106` 
    , `107` 
    , `108` 
) 
VALUES (
    -- values here as others have stated 
)"); 
2

変数を単一引用符で囲むだけでなく、POST変数の特殊文字もエスケープする必要があります。説明と例についてはmysql_real_escape_string method documentationをご覧ください。

XKCDが楽しみにしている種類のSQL injection attacksを防ぐために、エスケープ処理が行われます。それはあなたに起こっても簡単に避けることができないということを除いては楽しいことではありません。

コメント者の質問に答えるために、PHPとMySQLでprepared statementsを実行することもできます。これはmysql_real_escape_stringメソッドを使用する代わりの方法です。

+0

MySQLにはまだプリペアドステートメント/バインド可能なパラメータがありませんか?私はそれを使用する必要はありませんうれしいです – finnw