Ošetření chyby dotazu – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření chyby dotazu – MySQL – Fórum – Programujte.comOšetření chyby dotazu – MySQL – Fórum – Programujte.com

 

Pavelv0
Stálý člen
9. 7. 2014   #1
-
0
-

Zdravím, chtěl bych se zeptat jestli je zapotřebí v php ošetřovat všechnu práci s DB. Například udělám SELECT, kde testuji chybový stav, v tom někde něco poupravím, udělám další SELECT z jiné tabulky, opět otestuji a pak udělám UPDATE a znovu testuji. Podobně dělám i 5 dotazů. Nakolik je zapotřebí každý dotaz ověřit zda se vykonal?

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #2
-
+1
-
Zajímavé

#1 Pavelv
Obecně řečeno bys to ověřovat měl. Prakticky to stejně budeš mít zapouzdřeno v nějaké metodě, takže tě to moc trápit nemusí. Dobře se přitom dají využít výjimky - selhání dotazu vůbec nemusíš testovat.

Na druhou stranu je podivné, proč děláš 5 SQL dotazů za sebou. Pro každou operaci by měl stačit jeden. Proč máš 2× SELECT a za ním UPDATE? Z databáze buď jen čtu, anebo jen do ní zapisuji. Současně to nemá význam - koleduješ si o race condition neboli souběh. Udělej to jedním SQL dotazem.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Mixxy0
Newbie
9. 7. 2014   #3
-
0
-

Na typu aplikace by taky mohlo být dobré použít transakce. Sice hrozí deadlocky, ale budeš mít jistotu, že data, která vyselektuješ, nikdo nezmění.

Nahlásit jako SPAM
IP: 2a00:1028:9940:93ba:59fd:...–
Dřív jsem býval namyšlený, ale teďka už nemám chybu!
Kit+15
Guru
9. 7. 2014   #4
-
0
-

#3 Mixxy
Transakce se udělá automaticky, pokud celý požadavek nacpeš do jednoho SQL dotazu. Domnívám se, že v uvedeném případě to nebude nic obtížného. Transakce bych nechal na složitější případy.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #5
-
0
-

#2 Kit
Mezi dotazama je většinou vyžadována interakce od uživatele, jinak kde využívám několk selectů za sebou je čtení hodnot z jedné tabulky a pak výpis počtu řádků z druhé tabulky. U toho dotazu nevím jak smíchat různé dimenze...

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #6
-
0
-

#5 Pavelv
Pokud je mezitím interakce od uživatele, tak tam transakci mít nemůžeš.

Podle popisu se ty dotazy dají sloučit do jednoho. Bude to i rychlejší.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #7
-
0
-

#6 Kit
Můžeš mi tedy poradit jak sloučit tyto dva dotazy?

SELECT COUNT(*) FROM uzivatele WHERE login = ...
SELECT Jmeno,Prijmeni FROM klienti WHERE IP = ...
Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #8
-
0
-

#7 Pavelv
A kde máš ten UPDATE? To sloučíme všechno, ne?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #9
-
0
-

#8 Kit
teď se k tomu nedostanu, ale něco ve smyslu  

if(mysql_result(mysql_query("SELECT COUNT(*) FROM uzivatele WHERE login = '$login'"),0))
	mysql_query("UPDATE uzivatele SET pass = '$heslo'");
$vysl = mysql_query("SELECT Jmeno,Prijmeni FROM klienti WHERE IP = '$ip'");
Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #10
-
0
-

#9 Pavelv
Tak to jsou dva SQL dotazy, které spolu nesouvisí. Takže se dá sloučit jen SELECT a UPDATE 

UPDATE uzivatele SET pass = '$heslo' WHERE login = '$login'
SELECT Jmeno,Prijmeni FROM klienti WHERE IP = '$ip'

Kromě toho v tom svém UPDATE máš chybu. Určitě nechceš měnit heslo všem uživatelům :)

Tyto dva SQL dotazy by se však neměly vyskytovat pohromadě, protože buď chceš někomu měnit heslo, anebo chceš vypsat klienta s určitou IP adresou. Nikdy obojí současně.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #11
-
0
-

#10 Kit
Jak to myslíš s tou změnou hesla?

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #12
-
0
-

#11 Pavelv 

mysql_query("UPDATE uzivatele SET pass = '$heslo'");

nastaví všem uživatelům jednotné heslo.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #13
-
0
-

#12 Kit
Ano, ale proměnná $login vždy obsahuje správné jméno, které na vstupu zkontroluji pomocí preg_match

$vysl =mysql_query("select id, ugroup from uzivatele where login = '$login' and heslo = '$sha1pw'")
if(mysql_num_rows($vysl == 1)) // uzivatel je prihlasen
{
...mysql_query("UPDATE uzivatele......
}
Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
9. 7. 2014   #14
-
0
-

#13 Pavelv
Tak si to zkus. Funguje to jinak. Dej si do tabulky dva uživatele a jednomu změň heslo. Změní se oběma.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
9. 7. 2014   #15
-
0
-

#14 Kit
To ano, ale není možné vytvořit dva stejné uživatele

EDIT:
Zapoměl jsem na to, že UPDATE provedu jen pokud mi sedí jak jména, tak hesla. A otisk hesla je vytvořen ze jména, hesla a soli
 

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
10. 7. 2014   #16
-
0
-

#15 Pavelv
Pokud je podmínka splněna, tohle UPDATE změní všechny záznamy v tabulce.

Tak si to konečně zkus. Vlož dva různé uživatele a jednomu změň heslo tím svým příkazem.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
10. 7. 2014   #17
-
0
-

#16 Kit
Zkoušeno, dva stejný uživatelé různá hesla, různé uživatelé a stejná hesla... 

UPDATE uzivatele
SET heslo = '".hash("sha256",$heslo_new.$login.$ocasek,false)."'  
WHERE login = '".$login."' 
AND heslo = '".hash ("sha256",heslo_old.$login.$ocasek, false)."'
Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
10. 7. 2014   #18
-
0
-

#17 Pavelv
No vida, už sis tam tu podmínku dal. Předtím jsi ji tam neměl.

Teď ještě opravit SQL injection...

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
10. 7. 2014   #19
-
0
-

#18 Kit
Však já jí tam mám celou dobu, viz #9. Testování shodnosti starého hesla s novým je spíše luxus :)

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
10. 7. 2014   #20
-
0
-

#19 Pavelv
V #9 tu podmínku nemáš. Podívej se pořádně.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
z_moravec
~ Redaktor
+3
Posthunter
10. 7. 2014   #21
-
0
-

#20 Kit
Má ji tam, akorát blbě schovanou v if. Takže místo jednoho dotazu má dva, navíc to ani není moc shodné s kontrolou loginu přímo v sql dotazu.

Nahlásit jako SPAM
IP: 216.96.231.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Kit+15
Guru
10. 7. 2014   #22
-
0
-

#21 z_moravec
Na druhém řádku přece žádnou podmínku nemá. Ty tam nějakou vidíš?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
z_moravec
~ Redaktor
+3
Posthunter
10. 7. 2014   #23
-
0
-

   

if(mysql_result(mysql_query("SELECT COUNT(*) FROM uzivatele WHERE login = '$login'"),0))
	mysql_query("UPDATE uzivatele SET pass = '$heslo'");

Je to strašně nešťastné řešení, ale je tam :-)

Nahlásit jako SPAM
IP: 216.96.231.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Kit+15
Guru
10. 7. 2014   #24
-
+1
-
Zajímavé

#23 z_moravec
Tak já to přečtu česky: Pokud se $login nachází v tabulce `uzivatele`, změň hesla všech uživatelů na $heslo.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
z_moravec
~ Redaktor
+3
Posthunter
10. 7. 2014   #25
-
0
-

#24 Kit
Máš pravdu, blbě vidím :-)

Nahlásit jako SPAM
IP: 216.96.231.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Pavelv0
Stálý člen
10. 7. 2014   #26
-
0
-

#24 Kit
Jsem se překoukl. V #10 ta podmínka již je. Post #9 jsem psal jen z hlavy...

Nahlásit jako SPAM
IP: 109.235.7.–
Kit+15
Guru
10. 7. 2014   #27
-
0
-

#26 Pavelv
#10 jsem psal já.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
10. 7. 2014   #28
-
0
-

#27 Kit
špatně koukám . Celou dobu jsem si myslal že to je můj post. No hlavní je, že to funguje a že ošetření budu raději dělat u všeho

Nahlásit jako SPAM
IP: 109.235.7.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Chyby.. — založil Koudy

Chyby ve Visual c++ — založil VSc

Odhalení chyby — založil MiCizek

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý