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

Résolu/Fermé
roukmouth Messages postés 26 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 10 mars 2010 - 25 avril 2005 à 20:05
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 26 avril 2005 à 15:19
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.
A voir également:

27 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 20:39
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....
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 20:55
Faudrais dans un premier temps mettre ta variable de connexion dans ton mysql_query : c'est pas obligé mais c'est plus sécurisé.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 20:58
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
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 21:01
oui oui, uniquement si tu a acces à plusieur base, mais je suis assez maniaque de ce coté la en fait... :D
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 20:58
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.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 21:07
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 21:09
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....
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 21:15
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....
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 21:37
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....
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 21:41
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.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 21:55
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 :-(
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 22:00
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.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:03
Aaah d'accord, je le voyais pas comme ça....
Bon ok, bah j'ai rien dis alors :-D
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:02
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
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 22:13
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.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:17
Tout à fait d'accord :-)

Mais tu peux aussi traiter durablement avec fetch_array.
Suffit d'utiliser la technique du tableau comme avec fetch_assoc...
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 22:24
...

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

++
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:33
:-D

Yep, bonne nuit :-)

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

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

++
0
roukmouth Messages postés 26 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 10 mars 2010 2
25 avril 2005 à 22:49
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.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 22:55
C'est que ton erreur doit se située avant, ailleur que dans la boucle en effet.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:55
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?
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 22:57
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.. :)
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2005 à 23:00
C'est quoi ce extract() ? Ca met tout seul dans les variables ?
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
25 avril 2005 à 23:00
non c bon g compris..
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
25 avril 2005 à 22:49
C'est partie remise, on retrouvera bien d'autres fonctions à éplucher :-)
0