Diskuze: MySQL - návrat z dotazu + tabulka errorů
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 30 zpráv z 30.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Databáze ti určitě ty chyby někam loguje. Ve starém mysql ovladači byla funkce mysql_error, kde byla zapsaná chyba jako string. Jak je to třeba v PDO nevím, ale určitě tam něco podobného také bude.
Co kdyby sis to vyzkoušel? Výstupem je numerický kód, pětiznakové označení chyby a text chyby. S tím už se snad dá něco dělat. Můžeš si generovat i vlastní chybová hlášení.
Predpokladam v PHP. Pokud pouzivas mysqli tak zkontrolovat uspesnost dotazu a na zaklade toho pouzit http://www.php.net/…li.errno.php
Chybové hlášky nepatří do switch/pole, ale do databáze, protože stejné chybové hlášky databáze mohou mít rozdílné významy pro aplikaci. Navíc v databázi můžeš mít ty chybové hlášky lokalizovány do libovolného jazyka.
Mě je to v databázi na nic. Potřebuji si to poslat QueryStringem. Program pak jen QueryStringem pošle akci a návrat dostane v redirectu. Nebude muset udělat jiného, než zparsovat URL... (Oproti parsování HTML dosti rozdíl.)
@HellCoder@
Přesně to jsem potřeboval - děkuji!
"Returns the last error code for the most recent MySQLi function call that can succeed or fail."
A kód si pěkně pošlu QueryStringem...
Tak si pošli jen ten pětiznakový stavový kód. Ten se parsuje velmi dobře.
Aha. No - tak asi tak. Mohu z tohohle dostat error:
if(mysqli_num_rows(mysqli_query($connection, "SELECT ico FROM licence WHERE ico=$ico AND product='$product' AND value='{$_GET["lics"]}'")) == 1)
?
Tedy nejlepší by bylo, kdyby dotazy způsobily pád programu. To asi nepůjde - že? (Chytat to někde dolejc.) Takto musím zavírat spojení a zavolat prázdný return. A vůbec se to blbě spravuje. Každopádně z uvedené podmínky by se nedal vytřískat nějaký "Row no found" error? (Na provedení mi nezáleží - hodnoty řádku mám všechny - a všechny se musí shodovat...)
Proto se ptám, jestli to nejde nějak nastavit. Jak píši - kód je dosti prasácký - když musím všude větvit. Pročež bych uvítal pád programu...
A proč do toho dotazu dáváš SQL injection?
Dobrá připomínka - nějaký překlep...
$prep = $pdo->prepare("SELECT ico FROM licence WHERE ico=? AND product=? AND value=?");
$prep->execute(array($ico, $product, $_GET["lics"]));
if ($prep->rowCount() == 0)
throw new Exception("licence nenalezena");
... a máš to i se zhroucením
Sekundární zhroucení neřeší zprasení kódu větvením... Je to opravdu dost nepřehledné - a čeká mě ještě více tabulek - tedy ještě další vlna větvení...
Jaké větvení? Žádná větev else se tam nevyskytuje.
Jaké další tabulky? Vždyť to všechno můžeš udělat v tom jednom SQL dotazu.
Těžko. Porovnávám asi 6 možných variant. (zadal ičo - nezadal, zadal - co chce?, chce přidat - už tam je?, není - chce přidat produkt?) (ico sloupec má primární klíč - null hodnota by pěkně zazpívala error) Pročež else je tam tuny. Ano - přeháním - jen 4. Ale i tak by bylo mnohem přehlednejší, kdby nenastalo else, ale kód by dál neběžel...
Jinak - ano - dotazy budu shlukovat, ale stejně se mi tento přístup nelíbí. Tedy proč si PHP prvně error chytí a já jako blb musím vyslat žádost o získání statusu?
Však tady není else. Kód dál nepoběží.
Viz. edit. Jedno, jestli PHP nic nechytá a jen čte logy - nebo jak ty statusy sbírá - prostě proč je neposlat nejjednodušší cestou. Kdo by error nechtěl, použije obecný catch...
Jaký error? K žádnému přece nedošlo. Když k němu dojde, tak se zpracování ukončí. Když počet výsledků == 0, tak se také ukončí.
Pořád nechápu, o co se snažíš. Získal ji ICO. Budeš ho k něčemu potřebovat? Vždyť ho máš v podmínce.
Tak snad mě chápeš - ne? Prostě bych byl raději, kdyby ke mě rovnou chodily statusy z databáze. Tedy to o co si musím žádat mysqli_sqlstate(), či jinak... (dal bych si pěkně catch(co))
K IČo (U?) - a co když si ho uživatel vymyslel a já takového usera nemám?
Kromě toho je ICO v daném případě hodně nešťastně zvolený primární klíč. Co když bude firma mít víc produktů nebo víc licencí?
Chápu, že když není žádný záznam nalezen, tak chyba to není.
Proto mám více tabulek. Jedna tabulka obsahuje dvojici - ico produkt. Každý produkt lze registrovat jen pod jedinou licencí - a musí k tomu sedět ico... (produkt se přidá jen když v tabulce licencí naleznu řádek se stejným IČem, produktem a liecnčním číslem...) Identifikační číslo organizace musí být jedinečné...
Primární klíč musí být jedinečný. Pokud může mít firma víc produktů nebo víc licencí, tak ti to fungovat nebude.
Funguje mi to dokonale. Mám tabulku ico produkt. Tam není nic primárního. Je to jen odpaďák. Dostat se tam však dá jedině opravdu dost složitě - takže nehrozí žádné nebezpečí. Nemám čas - musím jít. Ale ujišťuji tě, že to funguje dokonale a šéf je z toho na větvi... (skáče do nebes)
(Ve zbylých 3 tabulkách je ico sloupec primárním klíčem omarkován...)
Uvědom si, že IČO je cizí klíč, Skutečně máš vazbu na databázi firem 1:1 ?
Funguje to. Je to otestované. Produkt se dá přidat jen při shodě
licence. Takže se nedá přidat neplatícímu uživateli. Dále ico produkt
tabulka je jak jsem psal - jen odpad. Tam se nic nevaliduje, nic neřeší. Pak
tu máme tabulku ico, produkt, max, který omezuje počet daného produktu na
IČO. Fakt již musím jít - tak za 4 hodiny se zase pohádáme...
Zobrazeno 30 zpráv z 30.