Problème avec mysql_num_rows [PHP] - PHP - Programmation
Marsh Posté le 06-07-2007 à 22:28:38
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)
Marsh Posté le 06-07-2007 à 22:34:27
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.
Marsh Posté le 07-07-2007 à 09:38:38
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).
Marsh Posté le 07-07-2007 à 11:58:20
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.
Marsh Posté le 07-07-2007 à 13:05:33
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
Marsh Posté le 07-07-2007 à 13:09:04
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.
Marsh Posté le 07-07-2007 à 13:36:13
Je vais tacher d'appliquer tes conseils. Merci MagicBuzz.
Marsh Posté le 06-07-2007 à 22:26:39
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 ?