IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:20.8.2013 11:45

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 Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:20.8.2013 11:52

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
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 12:01

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
Tvůrce
Avatar
matesax:20.8.2013 12:11

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:20.8.2013 13:29

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 13:38

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 13:42

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 13:44

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 13:47

Pošlu si:

mysqli_errno

Nebo co máš na mysli ty?

 
Nahoru Odpovědět
20.8.2013 13:47
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 13:55

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
Tvůrce
Avatar
matesax:20.8.2013 14:12

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:14

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:16

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

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

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:19

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:25
$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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:28

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:30

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:40

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:42

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:43

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:45

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:48

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
Tvůrce
Avatar
Odpovídá na Kit
Kit:20.8.2013 14:49

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:50

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:53

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:53

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 14:56

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
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.8.2013 14:57

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
Tvůrce
Avatar
Odpovídá na Kit
matesax:20.8.2013 15:00

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.