IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

mysql_num_rows comportement inattendu [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2007
    Messages : 290
    Points : 209
    Points
    209
    Par défaut mysql_num_rows comportement inattendu
    Bonjour,

    Je viens de me rendre compte d'un comportement de mysql_num_rows.
    Il me comptabilise des valeurs qui se trouve deux fois dans une ligne de ma BDD.

    Par exemple je lui demande de me compter le nombre de ligne ou Champ1 et Champ3 sont égale à A

    Ma table //////////////
    Ligne1 -------
    Champ1 = A
    Champ2 = B
    Champ3 = A
    ----------------
    Ligne2 -------
    Champ1 = C
    Champ2 = B
    Champ3 = E
    ----------------
    ////////////////////////////////

    On est d'accord qu'il est censé me retourner 1 non ? Et bien il me retourne 2 car deux champs sont égale A. Même si c'est sur la même ligne il me les comptabilise.

    Chelou non ? Ou peut être que c'est normal et que je ne m'en été jamais rendu compte ? Oo

    Vous en pensez quoi ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'en pense que, sans voir la requête, je ne peux qu'être d'accord avec moi-même.

    Et vice-versa, bien sûr.

    Ah ! Sacré mysql_num_rows ! Il nous fera toujours rire !

  3. #3
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2007
    Messages : 290
    Points : 209
    Points
    209
    Par défaut
    Ma requête exact est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM book_tarifs_saison WHERE 
    	(YEAR(date_debut) = ".$annee." OR YEAR(date_fin) = ".$annee." ) AND 
    	((MONTH(date_debut) = ".$m." OR MONTH(date_fin) = ".$m.")  OR
    	('".$m."' BETWEEN MONTH(date_debut) AND MONTH(date_fin)) OR 
    	('".$m."' BETWEEN MONTH(date_debut) AND MONTH(date_fin)) )
    	AND id_chambre = ".$retour2['id']."   AND type = '".$config[$a]."'

    Si je boucle les résultats j'ai la bonne quantité.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Fait un echo de ta requête, et exécute la dans phpmyadmin pour voir s'il est correcte.
    A la recherche d'un film : http://chercher-un-film.com

  5. #5
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2007
    Messages : 290
    Points : 209
    Points
    209
    Par défaut
    La requête est juste, les résultats et la quantité de lignes retournée est bonne.
    C'est juste mysql_num_rows qui n'indique pas la bonne qte.

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT count(*)  as total
    FROM book_tarifs_saison 
    WHERE 
    	(
    		YEAR(date_debut) = ".$annee." 
    		OR YEAR(date_fin) = ".$annee." ) 
    	AND (
    		(MONTH(date_debut) = ".$m." OR MONTH(date_fin) = ".$m.")  
    		OR ('".$m."' BETWEEN MONTH(date_debut) AND MONTH(date_fin)) 
    		OR ('".$m."' BETWEEN MONTH(date_debut) AND MONTH(date_fin)) 
    	)
    	AND id_chambre = ".$retour2['id']."   AND type = '".$config[$a]."'
    Quel nombre te renvoie cette requête ?
    Un nombre différent de mysql_num_rows ?
    C'est la seule question à te poser à ce stade.
    Ah et aussi, tu peux enlever tout ce qui est redondant (or deux fois la même condition)...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Combien de ligne t'a reçu en l’exécutant sous phpmyadmin??
    A la recherche d'un film : http://chercher-un-film.com

  8. #8
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	AND (
    		(MONTH(date_debut) = "09" OR MONTH(date_fin) = "09")  
    		OR ("09" BETWEEN MONTH(date_debut) AND MONTH(date_fin)) 
    	)
    J'ai du mal à croire que ces 2 lignes font sens..
    Je dirais plutôt (en prenant la valeur numérique de ta variable PHP)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	AND 9 BETWEEN MONTH(date_debut) AND MONTH(date_fin)
    MONTH(date)

    Retourne le numéro du mois de la date date, dans un intervalle de 1 à 12 :
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  9. #9
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2007
    Messages : 290
    Points : 209
    Points
    209
    Par défaut
    Dans ma BDD j'ai 2 lignes qui correspondent à ma requête.
    Si je count() j'ai un retour 2
    Si je boucle, j'ai 2 lignes
    Si je met directement dans Mysql j'ai également 2 lignes.

    Mysql_num_rows me retourne 3 ^^

    J'ai supprimé mes deux lignes, je les ai recréées et maintenant il m'affiche 2.

    C'est à ne rien comprendre...

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Tu es d'emblée convaincu que c'est mysql_num_rows qui est incohérente.
    Tellement convaincu que tu me mets un vent, sympa merci.
    Pourtant, si ton SQL est bancal, il peut donner des résultats pour le moins aléatoire, les algorithmes de phpmyadmin, en cas d'incohérence étant peut-être différents de ce que va donner les algorithmes de ta base de données directe.
    Dans ce cas, ton titre est juste une mauvaise interprétation. Le "mauvais comportement" ne serait pas dû à une fonction de PHP, mais à ton "mauvais usage du SQL".
    Si l'on peut revenir une minute à ton SQL, que veux-tu faire ? Filtrer des dates de quelle façon ?
    Par exemple pour filtrer une date sur un mois, il y a ça, qui est sans surprise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //filtre sur tout le mois de mars 2013
    where madate between '2013-03-01' and LAST_DAY('2013-03-01')
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  11. #11
    Membre actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2007
    Messages : 290
    Points : 209
    Points
    209
    Par défaut
    Oups désolé, effectivement je n'ai pas vu ton message de "17h14". Je n'ai plus de problèmes, je te remercie en tout cas

    C’était bien une erreur humaine.

  12. #12
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    errare humanum est, enfin c'est ce qu'on dit.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    ... tu me mets un vent, sympa merci.
    Et moi, j'ai eu droit à un "vote contre". Merci.

    En effet, l'horreur est humaine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C# et transaction SQL : Comportement inattendu
    Par StringBuilder dans le forum C#
    Réponses: 1
    Dernier message: 29/12/2011, 11h30
  2. Réponses: 4
    Dernier message: 27/12/2010, 11h27
  3. [XSLT]Problème de comportement inattendu
    Par kalimatchoum dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 06/03/2007, 18h33
  4. [PL/SQL][Oracle9] Proc. Stoc. comportement inattendue
    Par Carlito_superheros dans le forum Oracle
    Réponses: 2
    Dernier message: 30/08/2006, 16h13
  5. Comportement inattendu de Firefox
    Par reggae dans le forum Firefox
    Réponses: 3
    Dernier message: 08/05/2006, 21h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo