4

誰かが私のsqlステートメントの間違いを見つけることができるかどうか疑問に思いました。新しいレコードがまだ存在しない場合は、テーブルに挿入したいと思います。存在する場合は、更新するだけです。日付フィールドの主キー。

これがphpに表示される私のステートメントと私が得ているエラーです:

INSERT INTO ExtraStats (date, supportStaff, startEmails, endEmails, emailsAnswered) VALUES ('$startDate', '$supportStaff', '$startEmail', '$endEmail', '$emailAnswered') ON DUPLICATE KEY UPDATE (supportStaff, startEmails, endEmails, emailsAnswered) VALUES ('$supportStaff', '$startEmail', '$endEmail', '$emailAnswered')

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 '(supportStaff, startEmails, endEmails, emailsAnswered) VALUES ('2', '3', '1', '3' at line 1 
4

2 に答える 2

7
INSERT INTO ExtraStats (
    DATE
    , supportStaff
    , startEmails
    , endEmails
    , emailsAnswered
    )
VALUES (
    '$startDate'
    , '$supportStaff'
    , '$startEmail'
    , '$endEmail'
    , '$emailAnswered'
    )
    ON DUPLICATE KEY

UPDATE 
        supportStaff = '$supportStaff'
        , startEmails = '$startEmail'
        , endEmails = '$endEmail'
        , emailsAnswered =  '$emailAnswered'

この関数を使用してVALUES()、値を2回渡さないようにすることもできます。

    ...
    ON DUPLICATE KEY    
UPDATE 
          supportStaff = VALUES(supportStaff)
        , startEmails = VALUES(startEmails)
        , endEmails = VALUES(endEmails)
        , emailsAnswered = VALUES(emailsAnswered)
于 2012-10-10T09:28:21.197 に答える
0

dateは予約語です。バッククォートで囲みます。

INSERT INTO ExtraStats (`date`, supportStaff, startEmails, etc...

さらに、ON DUPLICATE KEY UPDATE次のようにする必要があります。

ON DUPLICATE KEY UPDATE supportStaff = '$supportStaff', startEmails = '$startEmail', etc..

他の例については、マニュアルを参照してください。SQL インジェクションを避けるために、まだ行っていない場合は、変数のサニタイズも検討する必要があります。

于 2012-10-10T09:31:02.503 に答える