[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 :
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.
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.
-
ContributeurBen 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.
++ -
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... -
ContributeurJe 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.. -
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. -
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)
-
ContributeurBon ben c'est la requete peut être, la base ?
cherchons un peu...-
-
@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>"; ?>
-
-
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. -
ModérateurC'est partie remise, on retrouvera bien d'autres fonctions à éplucher :-)
-
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.-
-
-
-
-
Contributeur@kij_82non c bon g compris..
-
-
ContributeurBonne nuit :),
tu vas me manquer un peu, j'vais parler de rien à qui maintenant !
++ -
ModérateurOui 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 .... ^^ -
Contributeurvoui mais ya pas de crochet [], ;o)
-
Modérateur:-D
Yep, bonne nuit :-)
PS: Ya autant de lettres dans array que dans assoc :o) -
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
++ -
ModérateurTout à fait d'accord :-)
Mais tu peux aussi traiter durablement avec fetch_array.
Suffit d'utiliser la technique du tableau comme avec fetch_assoc... -
ContributeurDonc 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. -
ModérateurPardon 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 -
ContributeurNon, 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. -
ModérateurAh 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 remplacerwhile($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'écrisecho 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 :-( -
Contributeuroui 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
Suivant