Tervehdys!
Olen tässä jo jonkin aikaa yrittänyt pähkäillä miksi jäljempänä oleva SQL-koodi antaan syntaksivirheen. Omat silmäni on jo sokeat tuolle, eikä virheilmoituskaan ole kovin informatiivinen.
SQL-koodi:
IF EXISTS(SELECT * FROM CustomerSettings WHERE CustomerID = :CID AND Name = :Name) THEN UPDATE CustomerSettings SET Value = :Value WHERE CustomerID = :CID AND Name = :Name; ELSE INSERT INTO CustomerSettings(Value, CustomerID, Name) VALUES(:Value, :CID, :Name); END IF;
Virheilmoitus:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 'IF EXISTS(SELECT * FROM CustomerSettings WHERE CustomerID = '149' AND Name = 'Ac' at line 1' in /home/***/SaveSettings.php:13
PHP-koodi:
$SaveSettings = $PDO->prepare("^^"); foreach($_POST["Settings"] as $Key => $Value){ $SaveSettings->bindValue(":Value", $Value); $SaveSettings->bindValue(":CID", $_POST["CID"]); $SaveSettings->bindValue(":Name", $Key); $SaveSettings->execute(); }
Osaisko joku kertoa missä moka?
EDIT
Väärä virheilmoitus, nyt oikea.
Dokumentaation perusteella vaikuttaisi siltä, että MySQL:ssä IF:iä voi käyttää esittämälläsi tavalla vain stored procedureissa...
https://dev.mysql.com/doc/refman/5.7/en/if.html
Toisekseen Name ja Value voi olla varattuja sanoja.
Jos CustomerId on uniikki indeksi, niin seuraava voisi toimia (tai ainakin toimii jos se on (primary) key)
INSERT INTO CustomerSettings(`Value`, CustomerID, `Name`) VALUES(:Value, :CID, :Name) ON DUPLICATE KEY UPDATE `Value` = :Value;
Okei. Hmm.. CustomerID ei ole uniikki, mutta CustomerID ja Name yhdessä ovat uniikkeja, ehkä niitä vois hyödyntää.
Tein nuista kahdesta(Name ja CustomerID) yhdessä unique indexin. Tämän jälkeen muutin kyselyn Grez:n kyselyn mukaiseksi, kaikki toimii hyvin.
Kiitos Grez! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.