Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL: if-else-lauseessa syntaksivirhe

dartvaneri [25.01.2017 13:27:26]

#

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.

Grez [25.01.2017 14:13:01]

#

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;

dartvaneri [25.01.2017 15:17:56]

#

Okei. Hmm.. CustomerID ei ole uniikki, mutta CustomerID ja Name yhdessä ovat uniikkeja, ehkä niitä vois hyödyntää.

dartvaneri [02.02.2017 06:56:05]

#

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! :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta