[PHP/MySQL] Erreur aléatoire...?

Résolu
Bonjour à tous,
j'ai un site utilisant une base de données qui me sert entre autre à contenir les chemins de fichiers à inclure (avec la fonction include( )) (je ne suis pas sûr de bien m'exprimer là???)
pour faire simple voici ma base :
table "liens" contenant :
lien_id
lien_titre
lien_page
lien_date
lien_membre
lien_categorie
lien_genre1
lien_genre2
lien_image

Voici la page qui pose problème :

<?php
	include("fichier de connection");
	$connexion = mysql_connect($host, $user, $pass) or die ("Connexion au serveur impossible");
	$db = mysql_select_db($base, $connexion) or die ("La base de données ne peut être sélectionnée");
	$query = "	SELECT * FROM liens
				WHERE lien_titre = '$titre'"; //$titre=variable sélectionnant le lien dans la base données ajouté dans l'URL de la page
	$result = mysql_query ($query) or die ("Exécution de la requête impossible");
	$ligne = mysql_fetch_array ($result);
	$image = $ligne['lien_image']; //j'ai voulu remplacer
	$nom = $ligne['lien_titre']; //toutes variables par 
	$date = $ligne['lien_date']; //extract($ligne) mais cela 
	$membre = $ligne['lien_membre']; //n'a pas marché
	$categorie = $ligne['lien_categorie'];
	$genre1 = $ligne['lien_genre1'];
	$genre2 = $ligne['lien_genre2'];
	$download = $ligne['lien_page'];
	echo "	<br>
			<img src='$image' border='0' align='left'>
			<h3><b>$nom</b></h3>
			Ajouté le $date par $membre<br>
			<b>Catégorie : </b>$categorie<br />";
	if ($genre2 == "")
		{
		echo"<b>Genre : </b>$genre1<br>";
		}
	else
		{
		echo"<b>Genre : </b>$genre1 / $genre2<br>";
		}		
	include($download); //ligne 37
?>


Avec ce code j'obtiens aléatoirement l'erreur : Warning: main(): Failed opening '' for inclusion (include_path='/var/www/... on line 37

Pour certaines données tout se passe très bien et pour d'autres j'ai cette erreur. J'ai pensé que cela venait de ma base de données mais toutes les données contenues dans cette table sont toutes équivalentes.

Aidez-moi je vous en prie... Merci d'avance.

27 réponses

Résumé de la discussion

Problème rencontré : un script PHP qui inclut des fichiers via include(...) échoue lorsque le chemin enregistré dans la base de données est vide, générant l'erreur Warning: main(): Failed opening '' for inclusion. Des approches recommandées incluent la vérification du chemin (relatif à la racine du site), l'emploi d'une boucle avec mysql_fetch_array et l'accès direct aux colonnes plutôt que extract. En cas de doute, il est conseillé de tester avec des échos, d'assurer que chaque résultat est traité et d'ajuster les chemins pour qu'ils correspondent à l'emplacement des scripts côté serveur.

Bobot (l’IA à votre service)
  1. Contributeur
    Ben c'est du beai ca tiens ! Tout ce temps perdu pour rien, dorénavant tu saurra qu'il ne faut jamais nommé en commencant par des signe de ponctuation ou autre !

    Ravi que ce soit bon.
    ++
    1. J'ai trouvé la solution !!!!

      Dans ma base de données, tous les titres contenant le signe "+" appelé par $lien_titre ne fonctionnaient pas. J'ai enlevé tous les "+" et les ai remplacé par des "-" et tout fonctionne.

      Je vous remercie tous. Roukmouth...
      1. Contributeur
        Je trouve ca quand même bizarre que tu ne mette pas ta variable de connexion quand tu fais un mysql_query. Tu ouvre une connexion ou ? Et tu la ferme ou ? Car si tu en ouvre une au début, et que tu ne la ferme qu'à la fin de toute tes pages, c'est possible qu'entre temps la connexion soit fermée si une erreur que tu n'a pas prévue (par un die("message"), arrive finalement (apres avoir affiché ta page, et de ce coup, quand tu clique sur un truc pour aller dans la page suivante, ta connexion n'étant pas effective, les requetes ne se font pas, et rien n'est affiché.
        Peut etre..
        1. je viens d'effectuer un nouvel essai, j'ai remplacé la boule while par :
          $query = "	SELECT * FROM liens
          				WHERE lien_titre = '$titre'";
          	$result = mysql_query ($query) or die ("Exécution de la requête impossible");
          	$nblignes = mysql_num_rows ($result);
          	for ($i=0; $i<$nblignes; $i++)
          				{
          				$ligne = mysql_fetch_array ($result);
          				extract($ligne);
          				echo "	<br>
          				<img src='$lien_image' border='0' align='left'>
          				<h3><b>$lien_titre</b></h3>
          				Ajouté le $lien_date par $lien_membre<br>
          				<b>Catégorie : </b>$lien_categorie<br />";
          		if ($lien_genre2 == "")
          			{
          			echo"<b>Genre : </b>$lien_genre1<br>";
          			}
          		else
          			{
          			echo"<b>Genre : </b>$lien_genre1 / $lien_genre2<br>";
          			}
          		include($lien_page);
          		}
          

          Mais cela ne change strictement rien.
          1. tous les "lien_page" de la base de données sont de type : lien_*.php" où * est généralement le nom d'un lien (ex: lien_187codemeurtre.php) et tous ces fichiers sont situés au même endroit. Alors pourquoi est-ce si aléatoire??? (Mais c'est toujours les mêmes qui fonctionnent et les mêmes qui ne fonctionnent pas bien sûr)
            1. Contributeur
              Bon ben c'est la requete peut être, la base ?

              cherchons un peu...
              1. Contributeur
                Ta variable $titre, elle est mise à jours dans le fichier inclut (celui de connexion) j'imagine.
                Tu peux nous le faire voir stp.
              2. @kij_82$titre n'est pas dans le fichier de connexion mais dans l'URL de la page envoyé par la page précedante. Voici son code :
                <?php
                			include("fichier de connexion");
                			$connexion = mysql_connect($host, $user, $pass) or die ("Connexion au serveur impossible");
                			$db = mysql_select_db($base, $connexion) or die ("La base de données ne peut être sélectionnée");
                			$query = "	SELECT * FROM liens
                						WHERE lien_categorie = '$cat'
                						ORDER BY lien_titre"; //$cat étant dans l'URL de la page
                			$query2 = "	SELECT * FROM liens
                						ORDER BY lien_titre";
                			$result = mysql_query ($query) or die ("Exécution de la requête impossible");
                			$result2 = mysql_query ($query2) or die ("Exécution de la requête impossible");
                			$nblignes = mysql_num_rows ($result);
                			$nblignes2 = mysql_num_rows ($result2);
                			for ($i=0; $i<$nblignes; $i++)
                				{
                				$ligne = mysql_fetch_array ($result);
                				extract($ligne);
                				echo "	<tr>
                							<td width='50%'>
                								<center>
                								<br>
                								<a href='fichelien_auto.php?titre=$lien_titre'> //fichelien_auto.php étant la page à problème citée plus haut
                								<img src='$lien_image' border='0' align='left'>
                								<b><h3>$lien_titre</h3></b></a>
                								Ajouté le $lien_date par $lien_membre
                								</center>
                							</td>";
                				$i++;
                				if ($i<$nblignes)
                					{
                					$ligne = mysql_fetch_array ($result);
                					extract($ligne);
                					echo "		<td width='50%'>
                									<center>
                									<br>
                									<a href='fichelien_auto.php?titre=$lien_titre'>
                									<img src='$lien_image' border='0' align='left'>
                									<b><h3>$lien_titre</h3></b></a>
                									Ajouté le $lien_date par $lien_membre
                									</center>
                								</td>
                							</tr>";
                					}
                				else
                					{
                					$i--;
                					echo " 	<td width='50%'>
                							</td>
                							</tr>";
                					}
                				}
                			echo "	</table>
                					<br>
                					<center><u>Résultat : <b>$i</b> liens sur un total de <b>$nblignes2</b></u></center>
                					<br>
                					<center><img src='retour.gif' border='0' onClick='history.go(-1)'></center>";
                			?>
                
            2. je viens de rajouter
              echo mysql_num_rows($result)

              et le résultat est 0 pour les pages où cela ne fonctionnent pas et 1 pour celles qui fonctionnent.

              Et en effet,
              $query = "	SELECT * FROM liens
              				WHERE lien_titre = '".$titre."'";

              ne change rien.
              1. Modérateur
                C'est à dire? Si tu executes ce mysql_num_rows avant la boucle, tu ne devrais avoir qu'un seul resultat, un chiffre de 0 à n... Mais pas un chiffre pour chaque ligne...
            3. Modérateur
              C'est partie remise, on retrouvera bien d'autres fonctions à éplucher :-)
              1. C'est très intéressant ce que vous dites mais je reviens à mon problème.
                J'ai suivi ce que vous m'avez conseillé (et je vous en remercie). Donc voici le nouveau code :
                while ( $ligne = mysql_fetch_array ($result, MYSQL_ASSOC) )
                		{
                		echo"test"; //pour test
                		extract($ligne);
                		echo "	<br>
                				<img src='$lien_image' border='0' align='left'>
                				<h3><b>$lien_titre</b></h3>
                				Ajouté le $lien_date par $lien_membre<br>
                				<b>Catégorie : </b>$lien_categorie<br />";
                		if ($lien_genre2 == "")
                			{
                			echo"<b>Genre : </b>$lien_genre1<br>";
                			}
                		else
                			{
                			echo"<b>Genre : </b>$lien_genre1 / $lien_genre2<br>";
                			}
                		include($lien_page);
                		}
                


                Maintenant, je n'ai plus d'erreur mais il ne m'affiche plus rien du tout. Il ne m'affiche même pas "test" au début de la boucle, cela signifie donc qu'il ne rentre même pas dans la boucle??
                Merci pour votre aide.

                PS: Je rappelle que cette erreur reste aléatoire alors que tous les fichiers sont situés au même endroit et que les données dans la base de données sont équivalentes.
                1. Contributeur
                  C'est que ton erreur doit se située avant, ailleur que dans la boucle en effet.
                2. Modérateur
                  Si tu ecris echo"test; sans espace ça risque de ne pas marcher....
                  Essaie echo "test";

                  Si ça ne donne rien, c'est peut être que ta boucle n'est pas executée, ça donne quoi
                  echo mysql_num_rows($result)
                  juste avant ta boucle?
                3. Contributeur
                  Et si tu met la requete suivante à la place de celle que tu as :
                  $query = "	SELECT * FROM liens
                  				WHERE lien_titre = '".$titre."'";
                  

                  Je en pense pas que cela change, mais puisqu'on en est à titiller.. :)
                4. Contributeur
                  C'est quoi ce extract() ? Ca met tout seul dans les variables ?
              2. Contributeur
                Bonne nuit :),

                tu vas me manquer un peu, j'vais parler de rien à qui maintenant !

                ++
                1. Modérateur
                  Oui mais tu peux aussi utiliser fetch_assoc dans une boucle et sans crochet. Suffit de préciser le champs par la suite, il sera par défaut uniquement associatif c'est tout (au contraire de array qui sera associatif et numerique)...

                  Voilà c'était mon dernier pinaillage :-)

                  Bonne nuit .... ^^
                  1. Modérateur
                    :-D

                    Yep, bonne nuit :-)

                    PS: Ya autant de lettres dans array que dans assoc :o)
                    1. Contributeur
                      ...

                      oui mais plutot que te prendre une technique de qqchose qui existe déjà, je pense qu'il est préférable de prendre la technique la mieux adaptée pour le cas que l'on souhaite traiter :
                      En l'occurrence, fetch_array pour les traitements temporaires dans une boucle, et fetch_assoc pour le reste (ou un autre), car fetch_array est moins long à écrire... (lol on va en arrivés au arguments de merde là, faut qu'on s'arrete)

                      Bon, j'ai bien aimé discuté d'une chose sur laquelle on est d'accord depuis le début,ça fait du bien de temps en temps !

                      Bonne nuit

                      ++
                      1. Modérateur
                        Tout à fait d'accord :-)

                        Mais tu peux aussi traiter durablement avec fetch_array.
                        Suffit d'utiliser la technique du tableau comme avec fetch_assoc...
                        1. Contributeur
                          Donc on est d'accord :
                          tant que tu veux faire ton traitement dans la boucle, tu peux garder la forme $ligne = mysql_fetch_array($result) qui aurra le même effet que
                          $ligne[] = mysql_fetch_assoc.

                          Conclusion : fetch_array sert à traiter temporairement et fetch_assoc durablement.
                          1. Modérateur
                            Pardon je rectifie:

                            le
                            echo $titres dans la boucle me retourne ArrayArrayArray etc...

                            Mais le gettype après la boucle me retourne Boolean. Voilà, donc je continue à camper sur mes positions de pinailleur :-D
                            1. Contributeur
                              Non, si tu est dans ta boucle, c'est qu'il te renvoie un tableau,sinon il te renvoie le bouléen false et tu sort.
                              Par contre, effectivement, si tu veux pouvoir traiter $ligne en dehors de la boucle, il faut mettre autre chose que fetch_array() sinon, il ne le gardera pas.
                              1. Modérateur
                                Aaah d'accord, je le voyais pas comme ça....
                                Bon ok, bah j'ai rien dis alors :-D
                            2. Modérateur
                              Ah ok, d'accord j'avais mal compris :-)

                              Mais bon avec mysql_fetch_array() je ne pense pas qu'on puisse utiliser une variable sans [] s'il ya plusieurs resultats, auquel cas les anciennes valeurs seront écrasées. Non?

                              Je viens de remplacer
                              while($titres[]=mysql_fetch_assoc($truc))


                              Par:
                              while($titres=mysql_fetch_array($truc,MYSQL_ASSOC))
                              {
                                         echo $titres;
                              }

                              J'obtiens:
                              ArrayArrayArrayArrayArrayArrayArrayboolean

                              Donc il récupère bien les valeurs sauf au dernier test de la boucle où mysql_fetch_array retourne False car il n'a plus rien.

                              Mais $titre n'est plus un tableau, car après la boucle si j'écris
                              echo gettype($titres);

                              J'obtiens "boolean".

                              Il n'a donc gardé que la dernière valeur renvoyée par mysql_fetch_array, c'est à dire False. Et les anciennes ont été écrasées. Et c'est à priori ce qui devrait se passer à chaque fois qu'on crée une boucle avec cette fonction. Ce qui peut être pallié avec une variable tableau.

                              Désolé je suis très lourd ce soir :-(
                              1. Contributeur
                                oui mais la différence est là justement :
                                Tu met bien des [ ] avec fetch_assoc, mais avec fetch_array, pas besoin de [ ]. C'est tout.
                                Qunad au tableau qui devient un entier, oui, c'est ce que je voulais dire : tu peux prendre la même variable pour plusieurs triatement qui ne sont pas du même type sans que ca change qqchose (si ce n'est que les ancienne valeur sont écrasée en effet, et que donc ca peut entrainer des erreurs d'étourderies.
                                • 1
                                • 2