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 *
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 *
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
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 *
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
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 *
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
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
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
Antonín:
v čem je tedy lepší count(); lepší, je rychlejší?
ano, je rychlejší.
Antonín
Profil *
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 :(

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: