Avatar
youtubak777
Člen
Avatar
youtubak777:

Ahoj, chci aby se při editaci článku ověřilo, zda již není url použitá, ale problém je, že pokud url nezměním, databáze hlásí, že url použitá již je (což je vlastně pravda). Vyřešil jsem to takto:

//Ověření URL adresy
if(!$_POST['url']) {
  $url = str_replace(" ", "-" , $_POST['nazev']);
} else {
  $url = str_replace(" ", "-" , $_POST['url']);
}
//Ověření, zda-li URL již neexistuje
$dbExistuje = Db::queryOne('
  SELECT clanky_id
  FROM clanky
  WHERE url=?
  LIMIT 1',
  $url);
$existuje = $dbExistuje['clanky_id'];
if ($_GET['upravit'] != $existuje) {
  $zprava[] = 'Zvolená adresa URL již existuje.';
} else {
  //Pokračování...

Neustále to ale píše chybu:

Warning: PDO::prepare(): SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1 in C:\xampp\htdocs\Db.php on line 25

Fatal error: Call to a member function execute() on boolean in C:\xampp\htdocs\Db.php on line 26

Kde je chyba? Díky.

 
Odpovědět 13. května 20:28
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na youtubak777
TomasGlawaty:

Osobně oštření duplicit řeším jinak.
Sloupci v databázi nastavím UNIQUE a při insertu/updatu zachycuji v catch() bloku vyjímku
Může to vypadat takhle nějak:

try {

        // insert nebo update do databáze

} catch (PDOException $e) {

        if ($e->getCode() == 2300)
                $zprava[] = 'Zvolená adresa URL již existuje.';

}
Nahoru Odpovědět 13. května 21:23
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Odpovídá na youtubak777
Dominik Klapuch:

Jak píše Tomáš, jeho řešení je super, jen by kód v bloku catch měl vypadat spíš takto:

try {
    // kód, kde se provádí insert, update
} catch(\PDOException $ex) {
    if($ex->getCode() === '23000') {
        throw new Exception\DuplicateException('Nastala duplicita');
    }
    throw $ex;
}
Nahoru Odpovědět  +1 13. května 21:41
Kód a data patří k sobě.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na youtubak777
Marek Z.:

Nemá být 2 parametr u queryOne náhodou v poli?

$dbExistuje = Db::queryOne('
  SELECT clanky_id
  FROM clanky
  WHERE url=?
  LIMIT 1',
  array($url));
Nahoru Odpovědět 13. května 21:41
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Marek Z.
Dominik Klapuch:

Třeba to má upravené na func_get_args();

Nahoru Odpovědět 13. května 21:42
Kód a data patří k sobě.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Dominik Klapuch
TomasGlawaty:

Souhlasím, také vyhazuji vlastní výjimky v catch bloku.
Teď ale musí počítat s tím, že mu ta vyjímka probublá výše, takže musí někte nad touto vrstvou odchtávat DupliciteException a nastavovat message pro užitatele až tam.

Nahoru Odpovědět  +1 13. května 21:51
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Odpovídá na TomasGlawaty
Dominik Klapuch:

Tak s tím by měl i tak počítat, protože když nenastane integrity constraint, tak může nastat vyjímka jiná a tu i tak musí někde ošetřit (viz. throw $ex). A ještě co se týče kódu, je to 23000 a ne 2300, ale to jsi udělal asi jen překlep :)

Nahoru Odpovědět 13. května 22:00
Kód a data patří k sobě.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Dominik Klapuch
TomasGlawaty:

Ano, za chyby se omlouvám, psal jsem to narychlo a nekontroloval to po sobě. Každopádně je toto prakticky nejlepší možné řešení. :)

Nahoru Odpovědět 13. května 22:09
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.