2009-03-05 14 views
1

あなたのSQL構文でエラーが発生しています。 'username'、 'password'、 'key'、 'email'、 'rank'、 'ip'、 'active'の近くで使用する正しい構文についてはMySQLサーバのバージョンに対応するマニュアルをチェックしてください)VALUES( 'wxライン1SQL構文エラー

答えて

4

で」、'79' を列名の前後に引用符を失う

2

単一引用符で列名を入れないでください:。

$query = "INSERT INTO users(username, password, key, email, rank, ip, active) 
      VALUES ('$username','$password','$random','$email','1','$ip','0')"; 

私たちは、SQLインジェクションの問題を無視します今のところ:-)

2

"近くの" user ... "を使用する正しい構文は良いヒントです。カラム名の前後に ''を置いてください。

0

フィールド名の前後の一重引用符を削除します。 エラーメッセージは、問題のヒントを示しています。

check the manual that corresponds to your MySQL server version for the right syntax to use near ''username', 'password', 'key', ...

16

のMySQLでは
(`username`, `password`, `key`, `email`, `rank`, `ip`, `active`) 

('username', 'password', 'key', 'email', 'rank', 'ip', 'active') 

を変換し、フィールド名は非引用しまたはのいずれかである必要があり(バックティックまたはバック引用符で囲む)をbackticked 。

MS SQL Serverでは、フィールド名は引用符で囲まれていないか、[角括弧]で囲む必要があります。

ほとんどのSQL DBMSはSQL標準に準拠しており、フィールド名は引用符で囲まれていないか、"二重引用符"で囲まれていて、「区切り識別子」と呼ばれます。場合によっては、区切られた識別子の処理(それ自体が非標準的な動作です)を有効にする必要があります。

+0

または[括弧で括られた] ...「バックティッキー」とは何か質問できますか? –

+0

バッククォートは、区切られた識別子を処理するMySQLの非標準的な方法です。角括弧は、区切られた識別子を処理するMS SQL Serverの非標準的な方法です。二重引用符は、区切られた識別子を処理するSQLの標準的な方法です。一重引用符は常に文字列リテラルの周りにあります。 –

+0

「this_word」が取り消されました。 – thomasrutter

0

名前の前後にあるアポストロフィを削除するだけでなく、データベースプロバイダで予約されているキーワードの場合は、識別子の一部を識別子として指定する必要があります。

SQL Serverの場合、角括弧を使用して識別子を指定します([password])。ただし、エラーメッセージからは、ブラケットの代わりにバッククォート( `)を使用するMySQLを使用しているようです。 (このフォーラムではコードブロックのバッククォートを使用しているので、例を書くことはできませんでしたが、とにかくそれを得ると思います)。

テーブルのデータタイプによっては、アポストロフィいくつかの値。たとえば、rankが数値フィールドの場合は、数値の1の前後にアポストロフィがないはずです。

0

エラーが発生した場所から判断すると、データをデータベースに送信する前にエスケープしておらず、パスワードの3文字目がアポストロフィ( ')でした。

たMySQLの使用しているAPIに応じて、次の関数のいずれかをお勧めします: mysql_real_escape_stringmysqli_real_escape_string、またはpdo_quoteは、データベースに渡す前に各変数をエスケープします。

また、MySQLiまたはPDOを使用している場合は、これを行うためのバインドパラメータとともにprepared statementを使用してください。

0

INSERT INTO users('username', ...

イタチが指摘したように、ここでは一重引用符は必要ありません。あなたは/名前として予約語を使用する必要がある場合は、あなたが何か他のものでそれらを区切るために持って、次のいずれか

  • `バッククォート`、デフォルトのMySQLの方法、または
  • 「二重引用符」、標準のANSI SQL他のデータベースによってサポートされています。

あなたは、クロスDBMSと互換性のあるコードを使用したい場合は、(つまり、他のアプリケーションと干渉しない場合、またはサーバのデフォルト)ANSI_QUOTESを許可するように、接続のsql_modeのを設定することは悪い考えではありませんここに。

('$username', ...

これまでに$ usernameを処理してそれをエスケープしない限り、あなたのアプリケーションに素敵なSQL injectionセキュリティホールを招待しました。 mysql_real_escape_stringを参照するか、パラメータ化されたクエリを使用してこれを回避することをお勧めします。