2012-02-20 9 views
2


私のテーブル(複数可)構造MySQLのINSERT INTO ... ON DUPLICATE KEY UPDATEの正しい構文は何ですか? PHP 5.0 <br> 中 -

+-------+--------------+------+------+-------------------+ 
| Field | Type   | Null | Key | Default   | 
+-------+--------------+------+------+-------------------+ 
| id | int(11)  | NO | PRI | AUTO INCREMENT | 
| lesson| varchar(255) | NO |  | LESSON_NAME  | 
| exam | char(50)  | NO |UNIQUE| NO DEFAULT  | 
| quest | text   | NO |  | NO DEFAULT  | 
| answer| text   | NO |  | NO DEFAULT  | 
| note | text   | NO |  | NO DEFAULT  | 
+-------+--------------+------+------+-------------------+ 

とi'am AJAX($ポスト)を介して、このテーブルを追加するためにいくつかの値を掲示する(MySQLは/各1は、以下のものと同じです) database.phpでポストされたデータを取得し、テーブルを修正するために、このレコードを追加する

function update_table ($proper_table, $name, $question, $answer, $note) { 
$sql = "INSERT INTO $proper_table (id, lesson, exam, quest, answer, note) VALUES ('', '', $name, $question,$answer,$note) ON DUPLICATE KEY UPDATE exam = $name, quest = $question, answer = $answer, note = $note"; 
$result= mysql_query($sql)or die(mysql_error()); 
} 

$ proper_table変数が別の変数によって取得され、テーブルに追加する機能があります。
(注:元のテーブルのフィールドと変数は違っています(トルコ語)わかりやすいように、私は英語に翻訳しましたが、構文は同じです)
質問:検査フィールドが同じであれば、これらの変数はすべてこのレコードを更新するために使用されます。それ以外の場合は、このレコードを新しいレコードとして適切なテーブルに挿入します。
しかし


以下
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 

のようなエラーを取得しi'amいかなる障害のあるコーディングはありますか?何が解決策になりますか?
おかげで今...

+0

ようにそれを確認する必要があります。代わりにprepared statementを使用してください(mysqli拡張のドキュメントを参照) – Vitamin

+0

または少なくとも値を引用符( ')で囲みます。関係する変数の値または最終的なクエリ文字列(変数なし)を指定してください。 – Basti

答えて

6
function update_table ($proper_table, $name, $question, $answer, $note) { 
    $sql = "INSERT INTO $proper_table (lesson, exam, quest, answer, note) VALUES ('', '$name', '$question','$answer','$note') ON DUPLICATE KEY UPDATE quest = VALUES(quest), answer = VALUES(answer), note = VALUES(note)"; 
    $result= mysql_query($sql)or die(mysql_error()); 
} 

はちょうど私がよ細部あなたが例えば、あなたのSQL '$name'に単一引用符であなたの文字列変数をラップするために必要な変更

$sql = "INSERT INTO $proper_table 

// Removed the PK AI field - don't need to specify this 
(lesson, exam, quest, answer, note)  

// Likewise removed PK field, and added quotes around the text fields 
VALUES ('', '$name', '$question','$answer','$note')  
ON DUPLICATE KEY UPDATE 

// If you specify VALUES(fieldName) it will update with the value you specified for the field in the conflicting row 
// Also removed the exam update, as exam is the UNIQUE key which could cause conflicts so updating that would have no effect 
quest = VALUES(quest), answer = VALUES(answer), note = VALUES(note)"; 
+0

あなたの命を救ってくれてありがとう... – Alper

0

をこれを破ります。それ以外の場合、mysqlはカラム名を参照していると考えます。

0

このクエリでは、ON DUPLICATE KEY UPDATE ...を追加すると、送信しているIDよりもIDが同じ場合に更新されます。この場合、パラメータとしてIDを送信しないため、自動インクリメントのIDを持っているため、更新されます。それがnullの場合、それはあなたがNULLでない場合は、挿入を実行

SELECT id FROM $proper_table; 

ソリューションは、あなたが、このような何かを試験は、あなたが送信しているパラメータに等しいテーブルを読み込むことが考えられます

+1

試験はユニークなキーなので、競合が発生する可能性があります –

0

id自動増分をパラメータとして取得するので、おそらく空の文字列をidとして設定する必要はありません。

試してみてください。

$sql = "INSERT INTO $proper_table (lesson, exam, quest, answer, note) VALUES ('', $name, $question,$answer,$note) ON DUPLICATE KEY UPDATE exam = $name, quest = $question, answer = $answer, note = $note"; 
0

あなたは私が全体のエラーメッセージ厥と思ういけないこの

<?php 
function update_table($proper_table, $name, $question, $answer, $note, $id) { 

    $sqlQuery = "INSERT INTO '".$proper_table."' SET 
        name  =  '".$name."', 
        question  = '".$question."', 
        answer  =  '".$answer."', 
        note  =  '".$note."' WHERE id = '".$id."'"; 

    $result= mysql_query($sqlQuery)or die(mysql_error()); 

} 
?> 
+0

あなたはそうする必要はありません。 –

関連する問題