ERREUR mysql_fetch_objet

Petit nouveau ! | 9 Messages

24 mars 2008, 12:58

bonjour,

je suis nouvelle ici et je poste deseperement un sujet pour demander de l aide.
je suis en train de faire une formulaire de modification de donnees dans ma base de donnees (je me suis inspiree d exemples trouves sur le net) et j ai une erreur dont je ne trouve pas la solution si quelqu un pouvait m aider ca serait sympas.
je met le bout de code en question
   <?php
$cnx = mysql_connect($co_host,$co_user,$co_mdp)or die("erreur de connexion au serveur $host");
    //sélection de la base de données:
    $db = mysql_select_db('ma_bdd', $cnx)or die("erreur de connexion à la base");	
  //récupération de la variable d'URL,
  //qui va nous permettre de savoir quel enregistrement modifier
  $id  = $_GET["nom"] ;
  //requete SQL:
  $sql = "SELECT * FROM user WHERE nom = ".$id ;
  //exécution de la requete:
    $requete = mysql_query( $sql, $cnx ) ;
  //affichage des données:
    if( $result = mysql_fetch_object( $requete ) )
    {
  ?>
//formulaire en html
  <?php
  }//fin if 
  ?>
et voila l erreur que j ai a chaque fois "mysql_fetch_object(): supplied argument is not a valid MySQL result resource" j ai essaye avec mysql_fetch_row et mysql_fetch_array avec le meme resultat

donc si quelqu un peut m aider ca serait super cool merci d avance
Modifié en dernier par mystic666 le 24 mars 2008, 16:11, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mars 2008, 13:04

Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

24 mars 2008, 13:15

merci je vais essaye tout ceci en esperant que ca va resoudre mon probleme

Mammouth du PHP | 558 Messages

24 mars 2008, 13:19

<?php 
mysql_connect($co_host,$co_user,$co_mdp)or die("erreur de connexion au serveur $host"); 
    //sélection de la base de données: 
mysql_select_db('ma_bdd', $cnx)or die("erreur de connexion à la base");     
  //récupération de la variable d'URL, 
  //qui va nous permettre de savoir quel enregistrement modifier 
  $id  = $_GET["nom"] ; 
  //requete SQL: 
  //exécution de la requete: 
    $requete = mysql_query( "SELECT * FROM user WHERE nom = '$id'") ; 
  //affichage des données: 
    if( $result = mysql_fetch_object( $requete ) ) 
    { 
  ?> 
//formulaire en html 
  <?php 
  }//fin if  
  ?> 
essaye sa a tout hazard j'ai un peu modifier ton script.
j'ai également remarqué que tu ne protèege pas ton ton entrée url nom.
attention à la securité.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mars 2008, 13:36

Si je peux me permettre quelques critiques au code de hakazizi
  • Il vaut mieux mettre les requêtes dans des variables que directement dans mysql_query()
  • On extrait les variables des chaines
Du coup, le code d'origine est mieux que le tiens :?

Sinon, il faut effectivement protéger les données provenant de l'extérieur (GET, POST, ...)
Et, pour finir, il faut que tu testes le résultat de l'exécution de la requête ($requete)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 174 Messages

24 mars 2008, 14:33

Bonjour.

En fait le problème est assez classique lorsque l'on écrit ce genre de code :
//requete de selection
$sql = "SELECT * FROM table";
//envoi requête
$req = mysql_query($sql);
//récupération résultat
$data = mysql_fetch_assoc($req);
et si on n'a pas de résultat ?

bang, supplied argument is not valid.

of course puisque $req contient un élément innatendu !

il faut penser au petit test magique :
//si la table retourne au moins un enregistrement
if(mysql_num_rows($req)!=0) {
//récupération des données
}
//sinon
else {
//message à l'utilisateur
print("aucun enregistrement ne correspond à vos critères de recherche");

Que vous utilisiez des langages procéduraux (comme PHP) ou orientés objets (comme JAVA) il est utile (et c'est une excellente habitude à prendre) de réaliser ce que l'on appelle des tests unitaires.
Un test unitaire permet de vérifier qu'une fonction ne donnera pas d'erreur ou que les erreurs seront gérées : ici mysql_fetch_assoc($req) ne sera appelée que si $sql retourne au moins un enregistrement, mais cela peut aussi être employé pour tester si un utilisateur n'a pas entré une lettre là où vous auriez voulu des chiffres, ou un code sans caractères spéciaux.

Bon courage et bonne programmation à tous.

Julie
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mars 2008, 14:53

Nous ne sommes toujours pas au bon endroit puisque le message d'erreur indique que le paramètre passé à mysql_fetch_object() est invalide.
Cet argument est $requete, qui est le retour de mysql_query().

Pour une raison x ou y, le résultat de la requête est invalide et c'est ce retour qu'il faut tester avant tout.

un mysql_num_rows() donnerais la même erreur puisqu'il utilise également la valeur de retour de la requête.

Il n'en reste pas moins que les test unitaires sont une bonne pratique ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 693 Messages

24 mars 2008, 15:10

  $sql = "SELECT * FROM user WHERE nom = ".$id ; 
Le champ nom doit contenir du texte. Il faut donc mettre les valeurs dans des quotes. Cette requete marchera mieux
  $sql = "SELECT * FROM user WHERE nom = '".$id."''; 
Et en utilisant mysql_real_escape_string() pour éviter les injections, ca donne
  $sql = "SELECT * FROM user WHERE nom = '".mysql_real_escape_string($id,$cnx)."''; 

Petit nouveau ! | 9 Messages

24 mars 2008, 16:10

wouhou merci a tout le monde pour ces reponses

j'ai tout teste et la solution de orgerix a fonctionne :)

je vous remercie tous pour ces reponses nombreuses rapides et precises