Autor | Zpráva | ||
---|---|---|---|
bestik_63 Profil |
Ahoj měl bych dotaz.
Vytvořil jsem si pomocí PDO knihovny modul, pomocí kterého se připojuji do databáze a vkládám SQL příkazy. Problém je v tom, že pokud použiju INSERT a snažím se do tabulky vložit údaj, který obsahuje stejné ID jako údaj který je v databázi již uložen tak mi vznikne chyba 1062 Duplicate entry. Pokud použiju metodu PDO::errorInfo() tak se mi tato chyba nezobrazí echo vardump($this->connection->errorInfo()) // array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL }) echo vardump($this->connection->errorInfo()) //array(3) { [0]=> string(5) "42000" [1]=> int(1064) [2]=> string(226) "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 'IINSERT INTO tabulka VALUES () .....,' at line 1" } Pokud zkusím výpis exception tak se mi chyby zobrazí ve výpise exception. Pomocí errorInfo() se mi zobrazí asi (zkoušel jsem jich jen pár) všechny krom 1062 //část výpisu exception catch (Exception $e) { echo vardump($e) } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "23000" [1]=> int(1062) [2]=> string(40) "Duplicate entry '43' for key 'FKosobaID'" modul mám nastaven takto: $this->connection = @new PDO("mysql:host=$ip;dbname=$database;charset=utf8",$user,$password); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); try{ $result = $this->connection->prepare($dotaz); $result->execute($parametry); } catch (Exception $e) { echo var_dump($this->connection->errorInfo(); echo var_dump($e); } Nevíte někdo co dělám blbě? Proč se tímto vlastně zabývám. Chtěl bych pomocí čísla chyby zjistit, že se pokouším o duplicitní záznam a podle toho upravit výpis. A na tomto jsem se zasekl. Mohl bych to vyřešit pomocí SQL příkazu na zjištění jestli zadané ID už není v tabulce zapsané a pak podle toho použít nebo nepoužít INSERT. Jenže mě to připadá jako se škrábat na hlavě nohou. |
||
TomášK Profil |
#2 · Zasláno: 29. 7. 2016, 01:48:59
S výjimkou nevim, ale můžeš použít
INSERT ... ON DUPLICATE KEY UPDATE ... , viz dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html.
|
||
nightfish Profil |
#3 · Zasláno: 29. 7. 2016, 09:19:20
Takhle by to nefungovalo?
$this->connection = new \PDO("mysql:host=$ip;dbname=$database;charset=utf8",$user,$password); $this->connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $this->connection->setAttribute(\PDO::ATTR_EMULATE_PREPARES, FALSE); try{ $result = $this->connection->prepare($dotaz); $result->execute($parametry); } catch (\PDOException $e) { if ($e->getCode() == 1062) { // pokus o vlozeni duplicitniho zaznamu } else { // ostatni chyby } } |
||
quatzael Profil |
#4 · Zasláno: 30. 7. 2016, 13:25:15
bestik_63:
var_dump se píše bez _? |
||
bestik_63 Profil |
#5 · Zasláno: 1. 8. 2016, 18:40:38
TomášK:
ahoj díky za pomoc. Tohle mi bohužel nepomůže. Při zakládání nového záznamu, potřebuju pouze zjistit, že nelze další se stejným ID založit a vypsat hlášku. nightfish: Právě že $e->getCode() ["code":protected]=> string(5) "23000" //var_dump Nicméně jsem se tím trochu zabýval a zjistil jsem toto. V té mojí knihovně to z nějakého mě neznámého důvodu hodí do exception pole $e->errorInfo, takže místo abych to zjišťoval klasicky pomocí try{ $data = null; $result = $this->connection->prepare($dotaz); $result->execute($parametry); } catch (Exception $e) { $this->error = $this->connection->errorInfo(); //pokud je chyba 1062 array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL throw new Exception($e); } try{ $data = null; $result = $this->connection->prepare($dotaz); $result->execute($parametry); } catch (Exception $e) { $this->error = $e->errorInfo; //array(3) { [0]=> string(5) "23000" [1]=> int(1062) [2]=> string(40) "Duplicate entry '43' for key 'FKosobaID'" } throw new Exception($e); } |
||
Časová prodleva: 8 let
|
0