Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1547 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Problème avec mysql_num_rows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Problème avec mysql_num_rows

n°1583456
frg159159
Posté le 06-07-2007 à 22:26:39  profilanswer
 

Bonjours,
 
J'ai un problème avec ce code :
 
 $sql=mysql_query("SELECT * FROM familles WHERE nom='$nom_famille'" );
 $row=mysql_num_rows("$sql" );  
 if($row!=0) //Si une famille portant le même nom et résident à la même adresse est repérés, on met les informations à jours
 {
  $array=mysql_fetch_array($sql);
  mysql_query("UPDATE familles SET nom='$nom_famille', adresse='$adresse', ville='$ville', tel='$tel', mail='$mail', prenom_resp='$prenom_resp' WHERE nom=$nom_famille" );
 }
 else
 {
  mysql_query("INSERT INTO familles VALUES ('', '$nom_famille', '$adresse', '$ville', '$tel', '$mail', '$prenom_resp')" );
 }
 
L'erreur renvoyé est la suivante :
 
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\program files\easyphp1-8\www\agcem\modules\insfact\p1a2.php on line 29
 
Quelqu'un pourrait-il m'expliquer pourquoi cette erreur n'apparait que lorsque $row=0 ?

mood
Publicité
Posté le 06-07-2007 à 22:26:39  profilanswer
 

n°1583458
MagicBuzz
Posté le 06-07-2007 à 22:28:38  profilanswer
 

1/ MYSQL ? Regarde la doc de "REPLACE", ça fait automatiquement un INSERT ou UPDATE selon le cas
2/ WHERE nom='$nom_famille'
3/ Vérifie que la merde de MagicQuotes est bien activée, sinon au moindre ' dans une des valeurs tes requêtes très mal écrites vont planter.
4/ INSERT INTO <table> (<liste des champs> ) VALUES (<liste des valeurs> )
 
PS : C'est le point 4 qui merde. T'as moins de valeurs que de champs. Donc tu dois bien mettre la liste des champs correspondant aux valeurs, et vérifier que les champs qui ne prennent pas de valeur acceptent bien NULL (ou ont une valeur par défaut)


Message édité par MagicBuzz le 06-07-2007 à 22:30:52
n°1583460
MagicBuzz
Posté le 06-07-2007 à 22:34:27  profilanswer
 

J'oubliais...
 
5/ $row = mysql_num_rows($sql)
 
Je pige pas trop ce que tu veux faire à le mettre entre " Et $row = 0 car mysql_num_rows a merdé, pas l'inverse... Ca plante à la 2nde ligne en fait, tout le reste pour le moment, même si c'est aussi bancal que la tour de Pise dans 500 ans, pour le moment n'est pas à l'origine de ton erreur.

n°1583499
frg159159
Posté le 07-07-2007 à 09:38:38  profilanswer
 

J'ai remplacé INSERT par REPLACE ce qui m'a permit de résoudre la problème en ne gardant que la requête.
 
Sinon, tu dis que mes requêtes sont "très mal écrites", mais en quoi sont-elles mal écrites, que faut-il que je modifie ? (je débute et ne cherche qu'a m'améliorer).

n°1583514
MagicBuzz
Posté le 07-07-2007 à 11:58:20  profilanswer
 

passe par des requêtes paramétrées.
le style d'écriture que tu utilises est très sensible aux SQL Injection, mais aussi d'un point de vue performances est largement inférieur.
sans parler au niveau de la maintenance, car c'est bien moins lisible.

n°1583516
frg159159
Posté le 07-07-2007 à 12:18:30  profilanswer
 

C'est quoi des requêtes paramétrées ?

n°1583523
MagicBuzz
Posté le 07-07-2007 à 13:05:33  profilanswer
 

c'est une requête qui s'écrit de la façon suivante :
 
select * from familles where nom = :nom
 
et ensuite, avant l'exécution de la commande, tu vas indiquer grace à une fonction spécial quel est le type et la valeur de :nom
 
ceci à plusieurs avantages :
- plus de ' dans ton code, ou de problèmes de cast
- plus de risque d'injection de code avec un entier qui récupère par exemple la valeur suivant : "0;delete familles;--"
- le moteur du sgbd exécute toujours la même requête (c'est la requête avec :nom qui est exécutée, pas celle avec la valeur de :nom. il faut savoir que l'optimiseur sql conserve en cache le plan d'exécution des requêtes un certain temps. si on lui demande plusieurs fois la même requête (cela se joue au caractère près) alors il n'a pas besoin de recalculer le plan. pour de toutes petites requêtes de ce genre, c'est le plan est le plus long à établir pendant l'exécution, il est donc intéressant de ne pas avoir à le recalculer à chaque fois.
 
 
pour la suite, n'oublie pas aussi deux choses :
- banis de tes requête les select * : tu va rammener inutilement un certain nombre de champs dont tu n'as pas besoin, et ainsi réduire inutilement les performances. deplus, si l'odre des champs change, ou si tu ajoutes/supprimer des champs, tu risque de te heurter à des problèmes lors de la lecture du résultat, sans pour autant penser forcément que c'est la requête qui pose problème
- lors d'un INSERT, met systématiquement la liste des champs que tu insère, pour la même raison

n°1583524
MagicBuzz
Posté le 07-07-2007 à 13:09:04  profilanswer
 

a noter aussi (je ne sais pas si PHP en est capable, la couche OLEDB ou ODBC le sont en tout cas), avant l'exécution de la requête, tu peux la "péparer", et ainsi valider le type et la valeur des paramètres avant d'envoyer la requête au SGBD. ceci te permet, en cas d'erreur, d'éviter de surcharger inutilement le SGBD en l'obligeant à lever une exception lui-même. c'est à nouveau un gain de temps considérable.

n°1583530
frg159159
Posté le 07-07-2007 à 13:36:13  profilanswer
 

Je vais tacher d'appliquer tes conseils. Merci MagicBuzz.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Problème avec mysql_num_rows

 

Sujets relatifs
streaming [PHP][MSSQL] probleme de date
Problème PHP ![PHP] Affichage données Mysql
Connection à une base de données mysqlexport DbDesigner VS import MySQL 5
[Résolu] Problème IE et Firefox + alignement vertical[RESOLU]Problème de background avec des DIV
Plus de sujets relatifs à : [PHP] Problème avec mysql_num_rows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR