| 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: 9 let
|
|||
0