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 })
Sice mě to pomocí Try-Catch vyhodí chybu, ale nemůžu ji zobrazit. Pokud zkusím vyvolat jinou chybu, tak se pomocí errorInfo() dá zobrazit.

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" }
Jakmile použiju chybu 1062 tak, to na mě házi bobek :-(

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
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
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
bestik_63:
var_dump se píše bez _?
bestik_63
Profil
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()
hodí
 ["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);        
}
tak použiju
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);        
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: