[PHP/MySQL] Erreur aléatoire...? [Résolu/Fermé]

Signaler
Messages postés
26
Date d'inscription
mercredi 13 décembre 2000
Statut
Membre
Dernière intervention
10 mars 2010
-
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
-
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

Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Essaie de mettre echo $download juste avant l'include.
En cas d'erreur ça te donnera certainement un indice: un mauvais chemin ou autre chose....
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
Faudrais dans un premier temps mettre ta variable de connexion dans ton mysql_query : c'est pas obligé mais c'est plus sécurisé.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Ah? Je savais pas... Mais alors c'est une sécurité uniquement si utilises plusieurs bases dans un script?

PS: Y clique, Y clique, il y est :-D
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
oui oui, uniquement si tu a acces à plusieur base, mais je suis assez maniaque de ce coté la en fait... :D
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
et met :
while ( $ligne = mysql_fetch_array ($result) ) {
  ...
}

meme si tu n'a qu'un tour de boucle. Car si jamais ton erreur est qu'il n'y a pas de résultat, alors il ne te mettra pas le reste tout simplement, plutot que de fiare une erreur plus loin.
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
Si tu as une erreur encore apres ca, c'est que le chemin enregistré dans ta base n'est pas le bon : Dans le sens ou les chemin à inclure se font par rapport à ta page web, et non pas à la page de script ou tu es (tu me suis la ?) : Par exemple, le index.php ou un équivalent, de ton site se situe à la source www; Dans cet index, tu inclus un fichier qui est placé dans le rep www/script on va dire. Tu as donc dans index.php :
include "script/bidule.php
Mais dans ce bidule.php, tu inclu un autre script, mettons macin.php, qui lui se situ aussi dans www/script, alors dans ton script bidule.php, il ne faudra pas mettre ceci :
include "machin.php" : ce qui est bon au niveau du script bidule.php, mais qui lorsquetu visite ton site n'est pas le cas car la référence ./ sera non plus www/script, mais www uniquement (car tu est dans l'index.php quand tu visite, et non pas dans bidule.php.
Il te faut mettre alors dans ton bidule.php, non plus :
include "machin.php"
Mais :
include "script/machin.php"

Tu as tout compris ?
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Juste un truc, si jamais il ya plusieurs résultats, ce ne serait pas plutôt:

while ( $ligne[] = mysql_fetch_array ($result) ) {
  ...
}


Sinon $ligne ne gardera que le dernier tableau de résultats....
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
non non, juste :
while( $ligne = mysql_fetch_array($result) ){
...
}

C'est ca qui est bien avec php, tu n'a pas à te soucier des déclarations ni des typages. L'allocation se fait en gros "à la volée". Si bien que tu peux faire :
for($i=0;$i<6;$i++) {
  $tab[i] = "coucou";
}
...
et plus loin :
$tab = 9;

Mais c'est aussi un moyen de faire des fautes d'innatentions fréquentes....
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Hmm.. Chuis pas d'accord :-)

Si plus loin tu fais $tab=9, là tu détruis ta variable tableau pour en faire un entier. Tu ne retrouves plus ton tableau après.

Je dis ça par conclusion car je viens de tester: j'ai un script chez moi qui liste toutes les colonnes d'une table:
while ($truc[]=mysql_fetch_assoc($machin)


Ca liste bien.
J'ai un tableau avec mes resultats dans $truc[$muche].

Mais si je le transforme en
while($truc=mysql_fetch_assoc($machin))


Là je n'ai plus de tableau.
J'ai même plus rien si j'essaie avec echo ou print_r d'avoir la valeur de $truc.
Et gettype($truc) me retourne NULL.

Du coup j'en viens à me demander si le dernier test de ce genre de boucle (le test qui determine la fin de la boucle, ou mysql_fetch_assoc ne retourne plus rien) ne se termine pas avec une ultime affectation dans $truc. Provoquant ainsi la destruction de son contenu.....
Si le dernier test qui vérifie une boucle (le dernier test qui provoque l'arrêt de la boucle) est executé, du coup tu affectes une nouvelle valeur dans ta variable. Du moins c'est comme ça que je vois le truc....

Ce n'est qu'une supposition de ma part, c'est peut être une erreur de mon script....
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
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 :-(
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Aaah d'accord, je le voyais pas comme ça....
Bon ok, bah j'ai rien dis alors :-D
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
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
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
Tout à fait d'accord :-)

Mais tu peux aussi traiter durablement avec fetch_array.
Suffit d'utiliser la technique du tableau comme avec fetch_assoc...
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
...

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

++
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
:-D

Yep, bonne nuit :-)

PS: Ya autant de lettres dans array que dans assoc :o)
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
voui mais ya pas de crochet [], ;o)
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
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 .... ^^
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
Bonne nuit :),

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

++
Messages postés
26
Date d'inscription
mercredi 13 décembre 2000
Statut
Membre
Dernière intervention
10 mars 2010
2
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.
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
C'est que ton erreur doit se située avant, ailleur que dans la boucle en effet.
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
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?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
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.. :)
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846
C'est quoi ce extract() ? Ca met tout seul dans les variables ?
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
846 >
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013

non c bon g compris..
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 501
C'est partie remise, on retrouvera bien d'autres fonctions à éplucher :-)