[PHP] num_rows, 0 of false bij geen rijen

Pagina: 1
Acties:
  • 425 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CyberArt
  • Registratie: Mei 2004
  • Laatst online: 10-08-2011
Beste tweakers,

Ik vraag van een tabel via mysql_num_rows het aantal rijen op. Hij telt het aantal subpagina's van een categorie. Dit gaat prima, tot er een categorie is zonder subpagina's.
PHP:
1
$num_menu_subitems = $this->db->num_rows($result_menu_subitems);

De functie verwijst door naar een simpele:
PHP:
1
2
3
4
    function num_rows($query) {
      $result = mysql_num_rows($query) or exit ('Error with num_rows!'.mysql_error().'<br />');
      return $result;
    }

Als er geen rijen zijn is $num_menu_subitems false. Ik dacht eigenlijk dat het dan 0 hoort te zijn.

Mijn eerste vraag is, klopt het wel dat ie false geeft, of is er echt iets fout?

En daarnaast.. ik vind het prettiger en meer human-readeble als het gewoon 0 geeft. Is dit anders mogelijk? Of moet ik gewoon inbakken dat ie kan reageren op een false?

hopende hiermee een post te hebben gemaakt, teken ik


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
PHP:
1
2
3
4
    function num_rows($query) { 
      $result = mysql_num_rows($query) or exit ('Error with num_rows!'.mysql_error().'<br />'); 
      return $result; 
    }

In dit codevoorbeeld gebruik je de variabelenaam $query. Misschien een fout in de naamgeving, maar je moet de resource doorgeven die je via mysql_query verkregen hebt, en niet de query zelf.

Daarnaast, stel dat $num_menu_subitems inderdaad false is, dan is $result false, maar dat zou al afgevangen moeten zijn door de OR achter mysql_num_rows. Daarom de vraag: hoe heb je gecheckt dat hij 'false' is, en niet 0?

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:01

Reinier

\o/

Als er nul rijen zijn hoort mysql_num_rows() inderdaad 0 als resultaat te geven. False duidt op een error volgens http://www.php.net/mysql_num_rows.
Kan je je precieze queries ook even posten? Ik denk dat er eerder al iets mis gaat.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Binnen php is 0 hetzelfde als false. ALs je daadwerkelijk op false wilt controleren zul je === moeten gebruiken. Ik kan in de manual echter niet vinden of hij een echte false teruggeeft wanneer er een error optreed.

[ Voor 84% gewijzigd door Janoz op 10-10-2005 13:50 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • CyberArt
  • Registratie: Mei 2004
  • Laatst online: 10-08-2011
Hier in ieder geval de volledige code:
PHP:
1
2
3
4
5
6
$result_menu_subitems = $this->db->query("SELECT `$l_menutitle` FROM `pages` WHERE `category_id` = '$this_crrnt_category' AND `$l_visible` = '1' GROUP BY `order`");

$num_menu_subitems = $this->db->num_rows($result_menu_subitems);
if ($num_menu_subitems == false) { echo 'false'; }
else { echo 'good'; }
echo '[num: '.$num_menu_subitems.']';
De if, else en echo zijn alleen om dit te controlleren, omdat het fout gaat.

En de bijbehorende functies:
PHP:
1
2
3
4
5
6
7
8
9
    function query($query) {
      $result = mysql_query($query) or exit ('Error quering database!'.mysql_error().'<br />');
      return $result;
    }
    
    function num_rows($query) {
      $result = mysql_num_rows($query); // or exit ('Error with num_rows!'.mysql_error().'<br />');
      return $result;
    }

De comment achter num rows heb ik tijdelijk gedaan om in het eerste script zelf te kunnen detecteren.


Het vervelende van die php.net/mysql_num_rows vind ik nu juist dat er níet bij staat wat er gebeurt bij lege rijen, en wanneer hij een false geeft. Althans, ik zie t niet staan :(

En 0 is toch niet hetzelfde als false?? Bij 10 - 10 is het antwoord toch 0, en niet false? Dan toch ook hierbij??

hopende hiermee een post te hebben gemaakt, teken ik


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

0 evalueerd wel naar false bij een niet-stricte vergelijking; PHP is immers loose-typed ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

CyberArt schreef op maandag 10 oktober 2005 @ 13:57:
En 0 is toch niet hetzelfde als false?? Bij 10 - 10 is het antwoord toch 0, en niet false? Dan toch ook hierbij??
maar daarom evalueert 0 wel naar false ;)
crisp schreef op maandag 10 oktober 2005 @ 14:01:
0 evalueerd wel naar false bij een niet-stricte vergelijking; PHP is immers loose-typed ;)
ook andere talen die niet loose-typed zijn evalueren 0 naar false

[ Voor 34% gewijzigd door Erkens op 10-10-2005 14:02 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

CyberArt schreef op maandag 10 oktober 2005 @ 13:57:
En 0 is toch niet hetzelfde als false?? Bij 10 - 10 is het antwoord toch 0, en niet false? Dan toch ook hierbij??
In C-style talen is 0 gewoon gelijk aan false, en aangezien PHP niet strong-typed is heb je dus wel eens problemen als deze. Gebruik gewoon de identity operator (===), zoals al eerder geopperd is. Die vereist namelijk ook gelijke types. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Is de query wel goed? Ik kan hier simpel een foute query maken die gewoon false terug geeft. De num rows blijft dan even false als het resultaat van de query.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
CyberArt schreef op maandag 10 oktober 2005 @ 13:57:
Het vervelende van die php.net/mysql_num_rows vind ik nu juist dat er níet bij staat wat er gebeurt bij lege rijen, en wanneer hij een false geeft. Althans, ik zie t niet staan :(
The number of rows in a result set on success, or FALSE on failure.
Duidelijk toch? :) 0 bij geen rijen en false bij een error in principe.
CyberArt schreef op maandag 10 oktober 2005 @ 13:57:
En 0 is toch niet hetzelfde als false?? Bij 10 - 10 is het antwoord toch 0, en niet false? Dan toch ook hierbij??
PHP:
1
2
if (10-10 == false) echo "True";
if (10-10 === false) echo "True";

Alleen de eerste zal "True" echo-en :)

edit:
Damn, hot topic dit :P

[ Voor 5% gewijzigd door Osiris op 10-10-2005 14:03 ]


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:01

Reinier

\o/

Kan je de query zoals die naar MySQL gestuurd wordt even posten, dus niet dit:

SQL:
1
SELECT `$l_menutitle` FROM `pages` WHERE `category_id` = '$this_crrnt_category' AND `$l_visible` = '1' GROUP BY `order`"


Want ik vermoed dat je query al niet goed gaat en FALSE retourneert.

[ Voor 14% gewijzigd door Reinier op 10-10-2005 14:06 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

The number of rows in a result set on success, or FALSE on failure.
Duidelijk toch? :) 0 bij geen rijen en false bij een error in principe.
[phprant]
Zo, niet alleen de taal zelf is onsamenhangend.. De documentatie ook :D
[/]

Hier even een quote van wat ik zie als ik op die link druk:
mysql_num_rows
(PHP 3, PHP 4 , PHP 5)

mysql_num_rows -- Geef het aantal rijen in een resultaat
Beschrijving
int mysql_num_rows ( resource result)


mysql_num_rows() geeft het aantal rijen in een resultaat set terug. Dit commando is alleen geldig voor SELECT queries. Om het aantal rijen op te halen dat werd betrokken bij een INSERT, UPDATE of DELETE query, gebruik mysql_affected_rows().
Nergens iets te zien over de false.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Janoz schreef op maandag 10 oktober 2005 @ 14:08:
Nergens iets te zien over de false.
Return values staat wat lager. ;)
Return Values

The number of rows in a result set on success, or FALSE on failure.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Niet in de nederlandse versie. Hier een complete copy/paste van de pagina:
mysql_num_rows
(PHP 3, PHP 4 , PHP 5)

mysql_num_rows -- Geef het aantal rijen in een resultaat
Beschrijving
int mysql_num_rows ( resource result)


mysql_num_rows() geeft het aantal rijen in een resultaat set terug. Dit commando is alleen geldig voor SELECT queries. Om het aantal rijen op te halen dat werd betrokken bij een INSERT, UPDATE of DELETE query, gebruik mysql_affected_rows(). Voorbeeld 1. MySQL num rows voorbeeld

PHP:
1
2
3
4
5
6
7
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result);

echo "$num_rows Rows\n";



Opmerking: Als je mysql_unbuffered_query() gebruikt zal mysql_num_rows() niet de correcte waarde teruggeven totdat alle rijen in de resultaat set zijn opgehaald.

Zie ook: mysql_affected_rows(), mysql_connect(), mysql_data_seek(), mysql_select_db(), mysql_query().

Voor compatibiliteit kan mysql_numrows() ook gebruikt worden. Dit wordt echter afgekeurd.


add a note User Contributed Notes
mysql_num_rows
edit:
Ik druk op exact dezelfde link. Waarschijnlijk is hier in de browser prefered language NL ingesteld. Ik zie trouwens nergens een taalswitch op die pagina. De enige manier om van taal te wisselen is de url hacken (zelf ergens een en ertussen zetten) of vanaf het begin opnieuw surfen.

[ Voor 13% gewijzigd door Janoz op 10-10-2005 14:20 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Janoz schreef op maandag 10 oktober 2005 @ 14:08:
[...]

Zo, niet alleen de taal zelf is onsamenhangend.. De documentatie ook :D

Hier even een quote van wat ik zie als ik op die link druk:

[...]

Nergens iets te zien over de false.
beter lezen ;)
Return Values
The number of rows in a result set on success, or FALSE on failure.
[edit] weer eens te laat...

[ Voor 7% gewijzigd door Bosmonster op 10-10-2005 14:13 ]


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

-NMe- schreef op maandag 10 oktober 2005 @ 14:10:
[...]
Return values staat wat lager. ;)
Niet op de nederlandse documentatie :D

Verder is het verschil tussen nederlands en engels nog erger aangezien de functie lijst aan de linker kant compleet inconsistent is en verschillende functies hebben :+

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Janoz schreef op maandag 10 oktober 2005 @ 14:08:
[...]

[phprant]
Zo, niet alleen de taal zelf is onsamenhangend.. De documentatie ook :D
[/phprant]

Hier even een quote van wat ik zie als ik op die link druk:

[...]

Nergens iets te zien over de false.
Vaagheid, aangezien ik altijd gewoon naar "php.net/functienaam" surf en PHP zélf de "nl3" ervoor heeft gepleurt, maar dat tóch de pagina in 't Engels is.. Sowieso zou ik dat altijd aanraden, gewoon in 't Engels, meestal completer ;) (maar dat wist je vast al wel :P)

[ Voor 12% gewijzigd door Osiris op 10-10-2005 14:22 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Misschien kunnen we de discussie over het al dan niet goed zijn van de PHP-documentatie beter even stopzetten. Ik elk geval totdat de topicstarter zijn probleem opgelost heeft. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CyberArt
  • Registratie: Mei 2004
  • Laatst online: 10-08-2011
Ja :) En daar moet ik dan allemaal op gaan reageren :o

De query zoals ie naar de database gaat is prima, anders zou toch de query functie problemen geven? Hier de variabelen naar waardes vertaald.
SQL:
1
SELECT `nl_menutitle` FROM `pages` WHERE `category_id` = '4' AND `nl_visible` = '1' GROUP BY `order`


Maar goed, ik moet dus kennelijk op false gaan controleren met ===. Jammer :)

En inderdaad vrij stom dat de nederlandse documentatie niet compleet is.. :(

[ Voor 6% gewijzigd door CyberArt op 10-10-2005 14:24 . Reden: typfoutje, niet in code, in nederlands :) (edit2: code type naar sql veranderd) ]

hopende hiermee een post te hebben gemaakt, teken ik


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

CyberArt schreef op maandag 10 oktober 2005 @ 14:23:
[...]
De query zoals ie naar de database gaat is prima, anders zou toch de query functie problemen
Ligt eraan. De query kan juist genoteerd zijn waardoor die niet stopt op de query code, maar wel in de mysql.

Zet gewoon eens na de query een echo mysql_errno() of error. Ik denk 1054 ;)

[ Voor 12% gewijzigd door disjfa op 10-10-2005 14:47 ]

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • CyberArt
  • Registratie: Mei 2004
  • Laatst online: 10-08-2011
nummer = 0, error nummer bedoel ik dan :)

maar dat is eigenlijk wel raar niet..?
is deze code dan wel goed?
PHP:
1
$result = mysql_num_rows($query) or exit ('Error with num_rows!'.mysql_errno().'<br />');

hopende hiermee een post te hebben gemaakt, teken ik


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

CyberArt schreef op maandag 10 oktober 2005 @ 14:53:
nummer = 0, error nummer bedoel ik dan :)

maar dat is eigenlijk wel raar niet..?
is deze code dan wel goed?
PHP:
1
$result = mysql_num_rows($query) or exit ('Error with num_rows!'.mysql_errno().'<br />');
Je krijgt hier een error?
wat geeft mysql_error() daar?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

disjfa schreef op maandag 10 oktober 2005 @ 14:43:
Ligt eraan. De query kan juist genoteerd zijn waardoor die niet stopt op de query code, maar wel in de mysql.

Zet gewoon eens na de query een echo mysql_errno() of error. Ik denk 1054 ;)
Omdat? Die query werkt toch gewoon? Hij krijgt gewoon het aantal 0 terug, en dat evalueert naar false. Dat is alles. Simpelweg vergelijken met false lost alles op? :?
PHP:
1
2
3
4
5
6
$result_menu_subitems = $this->db->query("SELECT `$l_menutitle` FROM `pages` WHERE `category_id` = '$this_crrnt_category' AND `$l_visible` = '1' GROUP BY `order`");

$num_menu_subitems = $this->db->num_rows($result_menu_subitems);
if ($num_menu_subitems === false) { echo 'false'; }
else { echo 'good'; }
echo '[num: '.$num_menu_subitems.']';

Dat is alles...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CyberArt
  • Registratie: Mei 2004
  • Laatst online: 10-08-2011
Ja, ik heb nu een if !== false, en dan voert ie de code wel uit. Werkt prima.

Iedereen bedankt voor de hulp!

hopende hiermee een post te hebben gemaakt, teken ik

Pagina: 1