Page 1 sur 1

ERREUR mysql_fetch_objet

Posté : 24 mars 2008, 12:58
par mystic666
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

Posté : 24 mars 2008, 13:04
par zeus

Posté : 24 mars 2008, 13:15
par mystic666
merci je vais essaye tout ceci en esperant que ca va resoudre mon probleme

Posté : 24 mars 2008, 13:19
par hakazizi
<?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é.

Posté : 24 mars 2008, 13:36
par zeus
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)

et si tu n'as aucun résultat ?

Posté : 24 mars 2008, 14:33
par animithra
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

Posté : 24 mars 2008, 14:53
par zeus
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 ;)

Posté : 24 mars 2008, 15:10
par orgerix
  $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)."''; 

Posté : 24 mars 2008, 16:10
par mystic666
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