Aller au contenu

mysql_num_rows()


Sujets conseillés

Posté

bonjour :D ,

j'ai comme un problème avec mysql_num_rows() il me retourne une erreur d'arguments non valide.

Voici mon script:

$req=mysql_query("SELECT title, fname, lname, email, oempv3_subscribers.subscriber_id, oempv3_extrafieds.subscriber_id FROM oempv3_subscribers, oempv3_extrafields WHERE oempv3_subscribers.subscriber_id = oempv3_extrafieds.subscriber_id AND oempv3_subscribers.statut = 'en cours'" , $link);

$res = mysql_num_rows($req);

Voici l'erreur:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/web/users/alalucarne.com/htdocs/envoi7.php on line 31

Alors qu'avec ce script là ca marche !!!!!!

$req=mysql_query("SELECT title, fname, lname, email, subscriber_id FROM oempv3_subscribers ");

$res = mysql_num_rows($req);

Si quelqu'un peu m'aider ;)

Posté

Salut Genmin,

C'est simplement que ta requête ne retourne aucun résultat... tu devrais mettre:

if($req)
     $res = mysql_num_rows($req);
else
     $res = 0;

pour éviter le cas où $res est "false" et n'est donc pas un argument valide pour la fonction mysql_num_rows()

Dans ton second exemple, le select retournera toujours quelque chose si ta table n'est pas vide, alors que le premier a 2 conditions qui ne se vérifient peut-être pas dans tes enregistrements.

Dan

Posté

Alors je dois avoir un problème dans ma requête. Je cherche à selectionner les enregistrements d'une table seulement si une condition est rempli dans une autre.

En gros j'ai une table "subscribers" avec le nom etc... sur mes membres et une autre "extrafieds" avec des infos plus précise.

Et je souhaite selevtionner tout les membres de la table "subscribers" qui on choisi de recevoir des mails (et ce champ "alertes" ce trouve dans la table "extrafieds")

Posté

Voici ton script.

$req=mysql_query("SELECT title, fname, lname, email, oempv3_subscribers.subscriber_id, oempv3_extrafieds.subscriber_id FROM oempv3_subscribers, oempv3_extrafields WHERE oempv3_subscribers.subscriber_id = oempv3_extrafieds.subscriber_id AND oempv3_subscribers.statut = 'en cours'" , $link); 
$res = mysql_num_rows($req);

Insere echo"<br>result ressource = ".$req;

Et tu verras que $req ne retourne rien. Ca devrait retourner quelque chose comme #1 ou #2,.. .

Le fait que la requete retourne une table vide ne cause pas d'erreurs. Seulement, la table est vide. Là, c'est une erreur dans la requete sql.

Si tu as une interface type phpmyadmin, testes ta requete, tu verras si elle retourne une erreur ou une table vide.

Posté

Merci beaucoup je me penchais sur ce num_rows() et je n'avais pas vue mon erreur dans ma requête. maintenant ca marche.

Vraiment top WebmasterHub :up:

PS: Merci à Dan pour me répondre toujours aussi vite ;)

Posté
Vraiment top WebmasterHub  :up:

En tout cas on essaye ;)

Il faut aussi un peu de chance pour que le bon interlocuteur passe par là rapidement. On ne pourra probablement pas toujours tout solutionner en quelques minutes...

Mais anonymus est "le bon interlocuteur" dès qu'on touche au code php/mysql ;)

Dan

Posté
if($req)
     $res = mysql_num_rows($req);
else
     $res = 0;

Si je puis me permettre :

Mettre ce code ne permet pas de savoir si la requete est juste. C'est à dire : S'il y a une erreur dans la requete, ce code renverra toujours un résultat, ce qui paraitra correct, alors meme qu'il devrait s'arreter.

Anonymus. (merci ;) )

Posté

Salut Anonymus,

Dans le cas d'une requête de type SELECT , SHOW , EXPLAIN ou DESCRIBE , les valeurs retournées sont soit une ressource, soit FALSE dans le cas où la requête est fausse (syntactiquement ou sémantiquement).

Donc, dans l'exemple donné, elle retournait FALSE a cause d'une erreur dans la requête. Si la requête est correcte et retourne 0 résultat, le mysql_numrows est appelé avec la ressource en paramêtre ... et retourne 0 .

Cordialement, B)

Dan

Seules les requêtes SQL SELECT , SHOW , EXPLAIN et DESCRIBE , utilisées avec mysql_query retournent une ressource de résultat MySQL, ou bien FALSE si la requête n'a pu être exécuté correctement. Pour les autres types de requêtes SQL, mysql_query retourne TRUE en cas de succès et FALSE en cas d'erreur. Un résultat différent de FALSE , la valeur signifie que la requête soumise est valide et qu'elle a pu être exécutée correctement. Cela n'apporte aucune indication sur le nombre de lignes affectées. Il est parfaitement possible qu'une requête soit réussie, mais qu'elle ne modifie aucune ligne, ou qu'elle n'en retourne aucune.
Posté
Si la requête est correcte et retourne 0 résultat, le mysql_numrows est appelé avec la ressource en paramêtre ... et retourne 0 .

J'ai peur de ne pas comprendre...

si (requete correcte) alors{

nb = nombre de lignes

}

sinon (sous entendu si la requete n'es pas correcte){

nb = 0

}

Or si la requete n'est pas correcte, on ne peut pas retourner un resultat, meme un '0'.

Dans tous les cas, il faut arreter le script si la requete n'est pas correcte. Pourquoi ? Tout simplement parce qu'elle DOIT etre correcte. Elle peut retourner un resultat '0', un tableau ou n'importe quoi, mais si la requete n'est pas correcte, ca vient d'une erreur de programme, et là, le programme ne doit pas pouvoir continuer.

Un exemple ? Allez :

$query="select champ from table where TRUE = FALSE";
$req=mysql_query($query,$link);

if($req)
    $res = mysql_num_rows($req);
else
    $res = 0;

Question : $res = ??

$res = 0. Alors que la requete est fausse.

T'es pas d'accord ? ( honnetement ! )

Nico.

Posté
T'es pas d'accord ? ( honnetement ! )

Nico.

Salut Nico,

Bien sûr que je suis d'accord... mais l'exemple n'avait pas pour but de réécrire la logique du code... ;)

J'aurais probablement dû mettre une instruction die() à la place du $res=0 pour que tout le monde soit content :)

Dan

Posté

Genmin :

Alors pour le fun, on peut écrire :

if ( ! $res = _AT_mysql_num_rows($req)) $res=0;

ce qui signifie :

Si $res=mysql_num_rows génère une erreur, alors on fait $res=0

et pour ne pas afficher le message d'erreur, on 'échappe' la fonction mysql_num_rows d'un arobase _AT_

Voilà.

Anonymus.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...