Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
databáze se díky primárním klíčům a dalším pomůckám umí postarat o většinu problémů. Jen bych o všech potřeboval vědět. Například když se někdo pokusí přidat existující primární klíč. Jak tedy dostat nějaký status z "mysqli_query"? A s tím související subdotaz - kde bych našel nějakou tabulku errorů/statusů? Potřebuji totiž kódové označení chyby do QueryStringu, ale současně také "lidský" výpis pro uživatele.
Děkuji.

 
Odpovědět 20.8.2013 11:45
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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.

Nahoru Odpovědět 20.8.2013 11:52
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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í.

http://dev.mysql.com/…-server.html

Nahoru Odpovědět 20.8.2013 12:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

Myslíš tím, že "mysqli_query" má návrat? Jako to je přesně to, co potřebuji - dostat kód. Podle tabulky kódů si na serveru postavím switch/pole a vygeneruji "lidskou" hlášku. (Error použiji v jednom programu - nebudu muset parsovat HTML...)

 
Nahoru Odpovědět 20.8.2013 12:11
Avatar
HelllCoder
Člen
Avatar
HelllCoder:

Predpokladam v PHP. Pokud pouzivas mysqli tak zkontrolovat uspesnost dotazu a na zaklade toho pouzit http://www.php.net/…li.errno.php

 
Nahoru Odpovědět 20.8.2013 13:29
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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.

Nahoru Odpovědět 20.8.2013 13:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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...

Editováno 20.8.2013 13:44
 
Nahoru Odpovědět 20.8.2013 13:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Tak si pošli jen ten pětiznakový stavový kód. Ten se parsuje velmi dobře.

Nahoru Odpovědět 20.8.2013 13:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Pošlu si:

mysqli_errno

Nebo co máš na mysli ty?

 
Nahoru Odpovědět 20.8.2013 13:47
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

mysqli_sqlstate()

Nahoru Odpovědět 20.8.2013 13:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

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...)

Editováno 20.8.2013 14:15
 
Nahoru Odpovědět 20.8.2013 14:12
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Když záznam není nalezen, tak to přece v SQL není chyba.

Nahoru Odpovědět 20.8.2013 14:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A proč do toho dotazu dáváš SQL injection?

Nahoru Odpovědět  +1 20.8.2013 14:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

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... :)

Editováno 20.8.2013 14:17
 
Nahoru Odpovědět 20.8.2013 14:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Zkusil sis už PDO? V něm ten SQL dotaz vypadá mnohem lépe.

Nahoru Odpovědět 20.8.2013 14:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:
$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

Editováno 20.8.2013 14:28
Nahoru Odpovědět 20.8.2013 14:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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í...

 
Nahoru Odpovědět 20.8.2013 14:28
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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.

Editováno 20.8.2013 14:31
Nahoru Odpovědět 20.8.2013 14:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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?

Editováno 20.8.2013 14:42
 
Nahoru Odpovědět 20.8.2013 14:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Však tady není else. Kód dál nepoběží.

Editováno 20.8.2013 14:42
Nahoru Odpovědět 20.8.2013 14:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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...

Editováno 20.8.2013 14:46
 
Nahoru Odpovědět 20.8.2013 14:43
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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.

Editováno 20.8.2013 14:47
Nahoru Odpovědět 20.8.2013 14:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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?

Editováno 20.8.2013 14:50
 
Nahoru Odpovědět 20.8.2013 14:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kit
Kit:

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í?

Nahoru Odpovědět 20.8.2013 14:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Chápu, že když není žádný záznam nalezen, tak chyba to není.

Nahoru Odpovědět 20.8.2013 14:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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é...

 
Nahoru Odpovědět 20.8.2013 14:53
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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.

Nahoru Odpovědět 20.8.2013 14:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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...)

Editováno 20.8.2013 14:57
 
Nahoru Odpovědět 20.8.2013 14:56
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Uvědom si, že IČO je cizí klíč, Skutečně máš vazbu na databázi firem 1:1 ?

Nahoru Odpovědět 20.8.2013 14:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

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... :)

 
Nahoru Odpovědět 20.8.2013 15:00
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 30 zpráv z 30.