Mysql_fetch_array(): et foreach()

Bonjour,
J'ai un petit souci avec mon site internet j'ai deux message d'erreur et ca le fait pas trop car je trouve pas la solution pour résoudre mon probleme.

Voici le script :

$db=new DataBase;
//connexion à la base de donnée
$id_connex=$db->ConnexionDataBase($db);
$id_result=$db->LireTable($id_connex,$sql);

$tabmoto=mysql_fetch_array($id_result,MYSQL_ASSOC);

$html="<table bgcolor='#EDEDED' align='center' width='800px'><tr><td><ul>\n";
$i=0;
foreach($tabmoto as $t)
{
$html.="<li><font color='black' size='3' font-family='Georgia'><strong> - ".mysql_field_name($id_result, $i++)."</strong></font> : <font color='#981117' size='3'><strong>$t</strong></font></li>\n";
}
//lit dans le rep. la photo vignette
$replecture=lecture_rep($rep."/".$reppetit."/");
if($replecture!=-1)
{
//insert les photos à l'écran
foreach($replecture as $t)
{
if(is_file($rep."/".$reppetit."/".$t))
echo("<img src='".$rep."/".$reppetit."/$t'>\n");
}
}
function lecture_rep($rep)
{
if(is_dir($rep))
{
$dir = opendir($rep);
$i=0;
while ($f = readdir($dir))
{
$photo[$i]=$f;
$i++;
}
return $photo;
}
return -1;
}
$html.="</ul></td></tr></table>\n";
echo($html);
mysql_close();
?>

Et j'ai ceci en message d'erreur :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/motorev2/public_html/vendre/formmoto_etape3.php on line 237

Warning: Invalid argument supplied for foreach() in /home/motorev2/public_html/vendre/formmoto_etape3.php on line 241


Merci pour votre aide

--
Moto2Reve.com : Site internet de petites annonces moto 
Configuration: Windows Vista
Internet Explorer 7.0

19 réponses

  1. Sur un programme correct, on peut comprendre ce que l'auteur a voulu faire.
    Sur un programme avec des erreurs, on ne peut faire que des suppositions.
    Donc, sous toutes réserves :
    Je pense que le Id_annonce=$Id_annonce dont tu parles dans ton message 14 est incorrect, il devrait y avoir une valeur à la place de $Id_annonce. Cela vient probablement de la façon dont le lien a été créé, une chaîne entre apostrophes au lieu de double quotes et une variable PHP n'a pas été substituée.
    Je pense également que $Id_annonce est une erreur dans ta requête
    ...select $Id_annonce,nom_photo,type_photo,taille_photo,photo from `photo` where Id_photo=49");
    il devrait y avoir simplement Id_annonce.
    1. Non, tu n'as pas de champ ID_annonce, tu as un champ Id_annonce
      Mais peu importe l'erreur de majuscule, le problème c'est que dans ta requête tu appelles ton champ $Id_annonce
      1. Mais si ça vient bien de la requête !
        Si tu as ?Id_annonce=$Id_annonce dans ton URL, alors je suppose que cette valeur se retrouve dans ta variable $Id_annonce, même si je ne vois pas comment puisque tu as $Id_annonce=$_POST["Id_annonce"]; au lieu de $Id_annonce=$_GET["Id_annonce"];.
        Dans ce cas, dans la sous-requête "select $Id_annonce,nom_photo,type_photo,taille_photo,photo from `photo` where Id_photo=49", la variable $Id_annonce est remplacée par sa valeur, c'est à dire...$Id_annonce
        Puisque ce $Id_annonce ,n'est pas entre apostrophes, il est pris comme un nom de champ. Et comme tu n'as pas de champ de ce nom là, il y a une erreur, qui correspond exactement au message indiqué.
        1. en faite je ne pense pas que ca vienne d'une requete mais de l'ID_annonce car dans mon lien j'ai ca :

          formmoto_etape2.php?Id_annonce=$Id_annonce

          Et on voi bien qu'il ne prend pas l'ID_annonce dans le lien et je pense que c'est la ou est le souci

          Par contre comment recupérer l'ID ca je trouve pas
          1. D'accord, mais tu peux peut-être dire sur quelle requête ?
            Si tu ne le sais pas, fais un echo htmlentities($sql); au début de la fonction LireTable
            1. J'ai fait quelques essais, je ne vois pas.

              le message d'erreur dit-il bien Unknown column '$Id_annonce' in 'field list' ? Peux-tu donner le message complet ?
              Sur laquelle des requêtes y a-t-il une erreur ?
              Dans la dernière requête, est-ce bien un select $Id_annonce que tu veux et non pas un select Id_annonce ?
              1. Voici le message d'erreur mais qui vien de la page d'avant en faite

                Unknown column '$Id_annonce' in 'field list'

                Donc voila mon script de la page d'avant :

                $Id_annonce=$_POST["Id_annonce"];
                $rep="../temporaire/".session_id();
                $repnormal="normal";
                
                
                $db=new DataBase;
                //connexion à la base de donnée
                $id_connex=$db->ConnexionDataBase($db);
                
                function lecture_rep($rep)
                	{
                		if(is_dir($rep))
                		{
                			$dir = opendir($rep);
                			$i=0;
                			while ($f = readdir($dir)) 
                			{
                				$photo[$i]=$f;	
                				$i++;
                			}
                			return $photo;
                		}
                			return -1;
                	}
                
                //lit dans le rep. la photo vignette
                	$replecture=lecture_rep($rep."/".$repnormal."/");
                	if($replecture!=-1)
                	{
                		//insert les photos à l'écran
                		foreach($replecture as $t)
                		{
                			if(is_file($rep."/".$repnormal."/".$t))
                			{
                				$handle = fopen ($rep."/".$repnormal."/".$t, "rb");
                				$contents = fread ($handle, filesize ($rep."/".$repnormal."/".$t));
                				fclose ($handle);
                				if(filetype($rep."/".$repnormal."/".$t)=='file')
                				{
                					$requete="insert into `photo`(photo,nom_photo,type_photo,taille_photo,Id_annonce)VALUES
                						('".addslashes($contents)."','$t','image/pjpeg','".filesize ($rep."/".$repnormal."/".$t)."',$Id_annonce);";
                					$db->LireTable($id_connex,$requete);
                				}
                			}
                		
                		}
                	}
                	else 
                			$db->LireTable($id_connex,"insert into `photo`(Id_annonce,nom_photo,type_photo,taille_photo,photo)
                										select $Id_annonce,nom_photo,type_photo,taille_photo,photo from `photo` where Id_photo=49");
                		
                	mysql_close();
                	
                	//header("location: formmoto_etape3.php?IId_annonce=$Id_annonce");
                	
                echo '<script language="Javascript">
                <!--
                document.location.replace("formmoto_etape3.php?IId_annonce=$Id_annonce");
                // -->
                </script>';	
                ?>
                1. Fais les modifications suivantes :

                  dans ConnexionDataBase :
                  $c->connexion = mysql_connect($c->serveur,$c->utilisateur,$c->pass) or die (mysql_error());
                  dans ta fonction LireTable
                  $rs=mysql_query($sql, $idcon) or die(mysql_error());
                  ça ne va pas résoudre le problème mais ça va donner des informations sur la cause
                  1. Voila ma requete : qui vien juste avant le script que j'ai mis

                    $sql="SELECT `annonce`.`titre` as `Titre de votre annonce`, 
                    `annonce`.`Constructeur` as `Marque`, 
                    `annonce`.`Modele` as `Modèle`,
                    `annonce`.`Modele2` as `Autre Modèle`, 
                    `annonce`.`Type` as Type, 
                    `annonce`.`Km` as Kilométres, 
                    `annonce`.`Année`, 
                    `annonce`.`1ere immat` as `1ére Immatriculation`, 
                    `annonce`.`Carnet` as `Carnet d'entretien`,  
                    `annonce`.`garantie`,
                    `annonce`.`Options`, 
                    `annonce`.`Etat`, 
                    `annonce`.`Nb de proprietaire` as `1ère main`,
                    `annonce`.`Cylindrée`, 
                    `annonce`.`Puissance`, 
                    `annonce`.`Couleur`, 
                    `annonce`.`tuning` as `Personnalisation / Tuning`, 
                    `annonce`.`Prix`, 
                    `annonce`.`texte` as `Commentaire`
                    FROM `annonce`
                    WHERE `annonce`.Id_annonce=".$Id_annonce.";";


                    et voila pour la connexion :

                    class DataBase
                    /* Site web root localhost */
                    {
                    	var $database="Site_web";
                    	var $connexion;
                    	var $utilisateur="root";
                    	var $pass="";
                    	var $serveur="localhost";
                    
                    	//connexion à une base de donnée
                    	function ConnexionDataBase($c)
                    	{
                    		//objetd de connexion
                    		$c->connexion = mysql_connect($c->serveur,$c->utilisateur,$c->pass);
                    		mysql_select_db($c->database,$c->connexion);
                    		return $c->connexion;
                    	}
                    	
                    	
                    	function affiche($m)
                    	{
                    		//$database="moi";
                    		echo $m->database."<br>";
                    		echo $m->utilisateur."<br>";
                    		echo $m->pass."<br>";
                    		echo $m->serveur."<br>";
                    	}
                    	
                    	function LireTable($idcon,$sql)
                    	{
                    		$rs=mysql_query($sql, $idcon);
                    		return $rs;
                    	}
                    
                    }

                    1. Bonjour

                      Pas facile car on ne sait pas ce que c'est que ta classe DataBase. Le sais-tu, toi ?
                      $id_connex=$db->ConnexionDataBase($db);

                      Je trouve bizarre cette méthode qui prend l'objet lui-même comme paramètre, mais comme on ne connaît pas la classe tout est possible.
                      $id_result=$db->LireTable($id_connex,$sql);

                      Elle sort d'où la requête $sql ?
                      1. $db=new DataBase; 
                        //connexion à la base de donnée 
                        $id_connex=$db->ConnexionDataBase($db); 
                        $id_result=$db->LireTable($id_connex,$sql); 
                        
                        $tabmoto=mysql_fetch_array($id_result,MYSQL_ASSOC); 
                        
                        $html="<table bgcolor='#EDEDED' align='center' width='800px'><tr><td><ul>\n"; 
                        $i=0; 
                        foreach($tabmoto as $t) 
                        { 
                        $html.="<li><font color='black' size='3' font-family='Georgia'><strong> - ".mysql_field_name($id_result, $i++)."</strong></font> : <font color='#981117' size='3'><strong>$t</strong></font></li>\n"; 
                        } 
                        //lit dans le rep. la photo vignette 
                        $replecture=lecture_rep($rep."/".$reppetit."/"); 
                        if($replecture!=-1) 
                        { 
                        //insert les photos à l'écran 
                        foreach($replecture as $t) 
                        { 
                        if(is_file($rep."/".$reppetit."/".$t)) 
                        echo("<img src='".$rep."/".$reppetit."/$t'>\n"); 
                        } 
                        } 
                        function lecture_rep($rep) 
                        { 
                        if(is_dir($rep)) 
                        { 
                        $dir = opendir($rep); 
                        $i=0; 
                        while ($f = readdir($dir)) 
                        { 
                        $photo[$i]=$f; 
                        $i++; 
                        } 
                        return $photo; 
                        } 
                        return -1; 
                        } 
                        $html.="</ul></td></tr></table>\n"; 
                        echo($html); 
                        mysql_close(); 
                        ?> 
                        

                        1. Ca simplifierait pas mal si tu mettais ton code entre balises

                          LireTable($id_connex,$sql);


                          Dans ta fonction LireTable, tu ne cherches pas a te reconnecter a ta BD ?
                          1. Pour ta première erreur, cela arrive quand tu as 2 connexion actives sur ta BD SQL. Par exemple, Avant d'appeler uen fonction qui elle-même se connectera a ta BD, il faut que tu ai fermé toutes la connexion déja présente à ta BD.