NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Ověření, zda je již hodnota v databázi

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
youtubak777
Člen
Avatar
youtubak777:13.5.2016 20:28

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.5.2016 20:28
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na youtubak777
TomasGlawaty:13.5.2016 21:23

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.5.2016 21:23
Avatar
Odpovídá na youtubak777
Dominik Klapuch:13.5.2016 21:41

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
13.5.2016 21:41
Kód a data patří k sobě.
Avatar
Odpovídá na youtubak777
Uživatel sítě :13.5.2016 21:41

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.5.2016 21:41
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Dominik Klapuch:13.5.2016 21:42

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

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

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
13.5.2016 21:51
Avatar
Odpovídá na TomasGlawaty
Dominik Klapuch:13.5.2016 22:00

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.5.2016 22:00
Kód a data patří k sobě.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Dominik Klapuch
TomasGlawaty:13.5.2016 22:09

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.5.2016 22:09
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.