Autor | Zpráva | ||
---|---|---|---|
Antonín Profil * |
Ahoj, v manuálu se píše, že: mysql_query() vrací false or true, mysql_num_rows() vrací 0 or 1.
Sesmolím tedy script pro zjištění existence a hle všechno nefunguje... ale jen pokud se dotaz do mysql provede v pořádku. Když změním ovoce na ovoceee čímž se postarám o to, že tabulka neexistuje a v dotazu dojde k chybě, měla by první podmínka být aktivní, ale není, spadne to do posledního else Data existují! Když tedy změním v první podmínce false na NULL vše funguje jak má. Nechápu, nerozumím. přestanu číst manuály, jsou stejně k hovnu :-) $sql = mysql_num_rows(mysql_query($sql = "SELECT `id` FROM `ovoce` WHERE `id` = ".intval($id)."")); if($sql === false){ # Spojení s MySQL se nezdařilo! }elseif($sql === 0){ # Data neexistují! }else{ # Data existují! } Může mi k tomu něco říct nějaký znalec PHP? Dík |
||
Alphard Profil |
Antonín:
„v manuálu se píše, že: mysql_query() vrací false or true, mysql_num_rows() vrací 0 or 1“ O jakém manuálu se bavíme? php.net asi těžko. Kdybych bral vaše tvrzení jako pravdivá, váš kód stejně nemůže fungovat, protože mysql_num_rows vrací 1 nebo 0, ne false. |
||
Antonín Profil * |
#3 · Zasláno: 1. 3. 2012, 19:03:12
O jakém manuálu se bavíme? php.net asi těžko.
Ano, bavíme se o manuálu php.net Kdybych bral vaše tvrzení jako pravdivá, váš kód stejně nemůže fungovat, protože mysql_num_rows vrací 1 nebo 0, ne false. Já jsem snad psal, že mysql_num_rows vrací false ? Psal jsem, že: mysql_query() vrací false or true mysql_num_rows() vrací 0 or 1 Nikde se ovšem nepíše, že by mysql vrátila u těchto dvou funkcí hodnotu NULL, se kterou to bohužl funguje.. |
||
Alphard Profil |
Antonín:
„mysql_query() vrací false or true“ Což není pravda u selectu , v případě úspěchu vrací výsledky.
„mysql_num_rows() vrací 0 or 1“ Ne, vrací počet vrácených řádků, klidně 5000. „Já jsem snad psal, že mysql_num_rows vrací false ?“ Přímo ne, ale do $sql ukládáte hodnotu z mysql_num_rows a pak porovnáváte na false. Doplním ukázku lepšího zpracování: $result = mysql_query($sql = "SELECT `id` FROM `ovoce` WHERE `id` = ".intval($id).""); if (!$result) { echo "Error: <br>$sql<br>".mysql_error(); # takto zapsaný výpis chyb je samozřejmě jen demonstrace } # tady pokračujete |
||
Antonín Profil * |
#5 · Zasláno: 1. 3. 2012, 19:19:48
Což není pravda u selectu, v případě úspěchu vrací výsledky.
Ano, v mém případě je to stejně nepodstatné Ne, vrací počet vrácených řádků, klidně 5000. Nebudeme slovíčkařit, jistě jste programátor a podle te podmínky je naprosto jasné, jak je to myšleno ;-) Přímo ne, ale do $sql ukládáte hodnotu z mysql_num_rows a pak porovnáváte na false. Ano, porovnávam false, ale na to, abych zjistitl, jestli se spojení podařilo, čili false je pro mysql_query() ne pro mysql_num_rows(). Doplním ukázku lepšího zpracování: To mi nepomůže, potřebuji zjistit já, že nastala nějaká chyba a dle toho nasměrovat pokračování scriptu, ne to pastnout uživatelům na screen ;-) |
||
Tori Profil |
#6 · Zasláno: 1. 3. 2012, 19:20:41
Antonín:
mysql_num_rows vrací počet řádků výsledku jen v případě, že dostane platný popisovač výsledků (viz resource). Pokud dostane cokoli jiného (např. SQL dotaz selhal a mysql_query vrátila FALSE, nebo překlep ve jméně proměnné), vrací NULL. Je to celkem logické - nemůže zjistit počet neexistujících řádků. |
||
Antonín Profil * |
#7 · Zasláno: 1. 3. 2012, 19:25:05
Chtěl jsem si zkrátit kód ale vidím, že jinak než takhle to nepůjde.. Navíc to funguje i to vrací to, co píše manuál ;)
$mysql_query = mysql_query($sql); if($mysql_query === false){ # Spojení s MySQL se nezdařilo }else{ # Spojení s MySQL proběhla v pořádku } $mysql_num_rows = mysql_num_rows($mysql_query); if($mysql_num_rows === 0){ # Data neexistují } else { # Data existují } |
||
Alphard Profil |
#8 · Zasláno: 1. 3. 2012, 19:38:11
Antonín:
„Navíc to funguje i to vrací to, co píše manuál“ Tak to dobře dopadlo. Ten kód moc zkrátit nejde. Jen možná nebudou potřeba ty else větve. Jak jsem naznačoval, když dojde k chybě, nějak se ošetří, když ne, jde se dál. Nenapadá mě, co byste dal do větve # Spojení s MySQL proběhla v pořádku Ještě malá poznámka k terminologii, o spojení se většinou mluví v souvislosti s mysql_connect(), u query je to mírně matoucí. „Ano, porovnávam false, ale na to, abych zjistitl, jestli se spojení podařilo, čili false je pro mysql_query() ne pro mysql_num_rows().“ Já jsem pochopil, jak jste to myslel, ale naprogramoval jste to jinak. V $sql je hodnota navrácená z mysql_num_rows (který mimochodem umí taky vrátit false, ale už bude křičet, že dostal špatný parametr). V tomto případě vrácení jednoho konkretního záznamu je to srovnatelné, ale obecně když jde jen o zjištění počtu záznamů, je lepší použít select count(*) na úrovni databáze, nemá smysl vracet všechna data do php.
|
||
Antonín Profil * |
#9 · Zasláno: 1. 3. 2012, 19:48:55
Tak to dobře dopadlo.
Ano, to co napsala Tori jsem nějak přehlédl, tím se vše vysvětlilo ;) Ten kód moc zkrátit nejde. Jen možná nebudou potřeba ty else větve. Jak jsem naznačoval, když dojde k chybě, nějak se ošetří, když ne, jde se dál. Nenapadá mě, co byste dal do větve # Spojení s MySQL proběhla v pořádku Musím se přiznat, že jsem ten dotaz trochu čekal :-) samozřejmě, že nic, napsal jsem jen celou posloupnost pro představu kdyby to někdo četl ;) V tomto případě vrácení jednoho konkretního záznamu je to srovnatelné, ale obecně když jde jen o zjištění počtu záznamů, je lepší použít select count(*) na úrovni databáze, nemá smysl vracet všechna data do php. Ale mysql vrátí pomocí $mysql_num_rows(); taky jen číslo s počtem nalezených řádků, v čem je tedy lepší count(); lepší, je rychlejší? Díky |
||
DJ Miky Profil |
#10 · Zasláno: 1. 3. 2012, 19:51:24
SELECT COUNT(*) vybere a přenese do PHP pouze jediné číslo.
mysql_num_rows(mysql_query('SELECT ...')) vybere a přenese do PHP celý výsledek dotazu (= všechny řádky) a poté teprve zjistí jejich počet. Přenáší se tedy zbytečně data navíc. |
||
Alphard Profil |
#11 · Zasláno: 1. 3. 2012, 19:51:44
Antonín:
„Ale mysql vrátí pomocí $mysql_num_rows(); taky jen číslo s počtem nalezených řádků, v čem je tedy lepší count(); lepší, je rychlejší?“ Kdepak, mysql vrácí celou sadu záznamů, klidně miliony řádků, až php to počítá. Když použijete count(*), z databáze se přenáší jediné číslo. |
||
panther Profil |
#12 · Zasláno: 1. 3. 2012, 19:51:46
Antonín:
„v čem je tedy lepší count(); lepší, je rychlejší?“ ano, je rychlejší. |
||
Antonín Profil * |
#13 · Zasláno: 1. 3. 2012, 21:01:31
Hm, ať se snažím jak se snažím, nějak mi to s count(*)em nejde, Dokážu zachytit problém, ale nemůžu přijít na tom jak zachytit jestli řádek existuje či nikoliv :(
|
||
Časová prodleva: 12 let
|
0