8796 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,
Je suis actuellement en train de faire un sondage pour un site web. Je me suis servie d'un tuto du site Le PHP Facile. Dans ce dernier, on fait une requête pour sélectionner les questions dans la bdd et n'en afficher qu'une seule, soit la dernière. Voici donc le code d'origine :
// on prépare une requête pour sélectionner l'id et la question du dernier sondage 
//(on sélectionne les questions, et on en prend qu'une (le LIMIT 0,1) et ce, dans un ordre décroissent (DESC), soit en fait, la dernière question posée).  
$sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC LIMIT 0,1';

J'ai donc pensé que pour pouvoir afficher tous les sondages, il me suffisait de retirer la limite. L'ennui, c'est que ça ne fait rien du tout. J'ai essayé plusieurs technique comme rajouter des boucles, mais rien n'y fait.
Quelqu'un pourrait-il m'aider en m'expliquant pourquoi retirer la limite ne change rien ?
Si besoin, voici le lien du tuto : http://www.lephpfacile.com/howto/4-un-sondage
Modifié par tatsu (05 Mar 2009 - 10:33)
Salut,

je suppose que tu n'as pas remplacé
$data = mysql_fetch_array ($req);  
par
while($data = mysql_fetch_array ($req); ) {
//traitement
}
Pinouf : Le reste du code est dans le tuto (lien que j'ai mis à la fin ^^)

Hayoan : A vrai dire, si, j'ai essayé et ça ne m'a affiché que le premier sondage (alors qu'avant je n'avais que le dernier XD) C'est justement de ça dont je parlais en disant que j'avais tenté de rajouter des boucles.
Voici donc mon code :
<?php
// on prépare une requête pour sélectionner l'id et la question du dernier sondage 
//(on sélectionne les questions, et on en prend qu'une (le LIMIT 0,1) et ce, dans un ordre décroissent (DESC), soit en fait, la dernière question posée).  
$sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC';  
// on lance la requête  
$req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
// on récupère le résultat dans un tableau associatif  
$data = mysql_fetch_array ($req);  
$nb_sondage = mysql_num_rows($req);  
if ($nb_sondage == 0) 
{ 
	echo 'Aucun sondage.';  
}  
else 
{ 
	while ($data)
	{
		// on libère l'espace mémoire alloué à cette requête 
		mysql_free_result ($req); 
		// on affiche la question 
		echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 
		// on prepare l'affichage de notre formulaire permettant de voter 
		echo '<form action = "sondage.php" method = "post">'; 
		// on prépare une requête permettant de sélectionner les réponses possibles se rapportant à ce même sondage 
		$sql = 'SELECT id, reponse FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"'; 
		// on lance la requête 
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
		// on prépare notre boucle pour afficher les différents choix possibles de réponses 
		while ($donnees = mysql_fetch_array($req)) 
		{ 
			// on affiche des boutons radio pour les différents choix de réponses possibles 
			echo '<input type="radio" name="choix" value="' , $donnees['id'] , '"> ' , stripslashes(htmlentities(trim($donnees['reponse']))) , '<br />'; 
		} 
	}
?>
<input type = "hidden" name = "sondage_en_cours" value = "<?php echo $data['id']; ?>">
<input type = "submit" name="go" value = "Vote">
</form>
<?php
}  
// on libère l'espace mémoire alloué à cette requête  
mysql_free_result ($req);  
// on ferme la connection à notre base de données  
mysql_close ();  
?>

J'ai donc bien la même boucle que celle que tu m'as montré. Mais là, ça m'affiche mon premier sondage en boucle. J'ai donc pensé que c'était parce que dans la boucle que j'ai là, on utilise la même variable pour des requêtes différentes. J'ai alors rajouté un 2, et retiré la libération de la requête de la boucle, comme cela :
<?php
// on prépare une requête pour sélectionner l'id et la question du dernier sondage 
//(on sélectionne les questions, et on en prend qu'une (le LIMIT 0,1) et ce, dans un ordre décroissent (DESC), soit en fait, la dernière question posée).  
$sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC';  
// on lance la requête  
$req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
// on récupère le résultat dans un tableau associatif  
$data = mysql_fetch_array ($req);  
$nb_sondage = mysql_num_rows($req);  
if ($nb_sondage == 0) 
{ 
	echo 'Aucun sondage.';  
}  
else 
{ 
	while ($data)
	{
		// on affiche la question 
		echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 
		// on prepare l'affichage de notre formulaire permettant de voter 
		echo '<form action = "sondage.php" method = "post">'; 
		// on prépare une requête permettant de sélectionner les réponses possibles se rapportant à ce même sondage 
		$sql2 = 'SELECT id, reponse FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"'; 
		// on lance la requête 
		$req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error()); 
		// on prépare notre boucle pour afficher les différents choix possibles de réponses 
		while ($donnees = mysql_fetch_array($req2)) 
		{ 
			// on affiche des boutons radio pour les différents choix de réponses possibles 
			echo '<input type="radio" name="choix" value="' , $donnees['id'] , '"> ' , stripslashes(htmlentities(trim($donnees['reponse']))) , '<br />'; 
		} 
	}
?>
<input type = "hidden" name = "sondage_en_cours" value = "<?php echo $data['id']; ?>">
<input type = "submit" name="go" value = "Vote">
</form>
<?php
}  
// on libère l'espace mémoire alloué à cette requête  
mysql_free_result ($req);  
// on ferme la connection à notre base de données  
mysql_close ();  
?>

Mais ça ne change rien.
Je pense donc qu'il doit y avoir quelque chose que j'ai mal compris Smiley ohwell

[edit :]
Je viens d'essayer encore autre chose :
<?php
// on prépare une requête pour sélectionner l'id et la question du dernier sondage 
//(on sélectionne les questions, et on en prend qu'une (le LIMIT 0,1) et ce, dans un ordre décroissent (DESC), soit en fait, la dernière question posée).  
$sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC';  
// on lance la requête  
$req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
// on récupère le résultat dans un tableau associatif  
//$data = mysql_fetch_array ($req);  
$nb_sondage = mysql_num_rows($req);  
if ($nb_sondage == 0) 
{ 
	echo 'Aucun sondage.';  
}  
else 
{ 
	while ($data=mysql_fetch_array ($req))
	{
		// on affiche la question 
		echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 
		// on prepare l'affichage de notre formulaire permettant de voter 
		echo '<form action = "sondage.php" method = "post">'; 
		// on prépare une requête permettant de sélectionner les réponses possibles se rapportant à ce même sondage 
		$sql2 = 'SELECT id, reponse FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"'; 
		// on lance la requête 
		$req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error()); 
		// on prépare notre boucle pour afficher les différents choix possibles de réponses 
		while ($donnees = mysql_fetch_array($req2)) 
		{ 
			// on affiche des boutons radio pour les différents choix de réponses possibles 
			echo '<input type="radio" name="choix" value="' , $donnees['id'] , '"> ' , stripslashes(htmlentities(trim($donnees['reponse']))) , '<br />'; 
		} 
		?>
		<input type = "hidden" name = "sondage_en_cours" value = "<?php echo $data['id']; ?>">
		<input type = "submit" name="go" value = "Vote">
		</form>
		<?php
	}
}  
// on libère l'espace mémoire alloué à cette requête  
mysql_free_result ($req);  
// on ferme la connection à notre base de données  
mysql_close ();  
?>

Mais avec ce code, ça ne m'affiche que le premier sondage, pas en boucle cette fois. Je ne comprends d'ailleurs pas pourquoi mes deux précédents codes c'était en boucle, et pas celui-ci...
Modifié par tatsu (03 Mar 2009 - 09:24)
Tu boucles en continu sur ton premier sondage car tu ne récupère que celui là dans ta variable $data :
$data = mysql_fetch_array ($req);
Chaque appel à mysql_fetch_array ne te récupère que la ligne de résultat courante (première donc) et déplace le pointeur de résultat pour pouvoir récupérer le suivant. Tu dois don boucler dessus pour tout récupérer, par exemple :
$data = array();
while($data[] = mysql_fetch_array($req));

Mais vu ton code, cette variable $data est inutile. Boucle directement sur mysql_fetch_array($req), tu feras bien le parcours de chaque sondage.

PS : C'est toujours bien d'éviter de faire des boucles qui font plusieurs appels à MySQL. Tu peux construire une fonction qui te récupère toutes tes infos directement en faisant une simple jointure.
Modifié par Planplan (03 Mar 2009 - 10:29)
$data = array();
while($data[] = mysql_fetch_array($req));

Avec ça, il ne m'affiche plus aucun sondage Smiley ohwell

Et le problème, c'est que si je retire la variable $data, comment je fais après dans le reste du code ? Par exemple pour cette ligne :
echo stripslashes(htmlentities(trim($data['question']))),'<br />'; 

J'ai pensé un instant avec $_GET, mais je ne suis pas sûre que ce soit ce qui est approprié (je ne m'en suis encore jamais servis à vrai dire)

[Edit :]
De plus, mysql_fetch_array() n'est-ce pas une fonction pour récupérer les données sous forme de tableau justement ?
Modifié par tatsu (03 Mar 2009 - 10:40)
<?php
$sql = 'SELECT id, question FROM sondage_questions ORDER BY id DESC';
$req = mysql_query ($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
if (mysql_num_rows($req) == 0)
{
	echo 'Aucun sondage.';
}
else
{
	while ($data = mysql_fetch_assoc($req)) // changé en mysql_fetch_assoc car ton commentaire dit que c'est un tableau associatif que tu veux
	{
		echo stripslashes(htmlentities(trim($data['question']))),'<br />';
		echo '<form action = "sondage.php" method = "post">';
		$sql = 'SELECT id, reponse FROM sondage_reponses WHERE id_sondage="'.$data['id'].'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		while ($donnees = mysql_fetch_array($req))
		{
			echo '<input type="radio" name="choix" value="' , $donnees['id'] , '"> ' , stripslashes(htmlentities(trim($donnees['reponse']))) , '<br />';
		}
	}
?>
	<input type = "hidden" name = "sondage_en_cours" value = "<? echo $data['id']; ?>">
	<input type = "submit" name="go" value = "Vote">
</form>
<?php
}
mysql_close ();
?>
Voilà ce que je voulais dire (j'ai supprimé tes commentaires, le code étant quasi le même).

Sinon ma solution marche mais tu avais une petite modif à faire. Il met tout dans un tableau à 2 dimension :
$data = array();
while($data[] = mysql_fetch_array($req));
Pour récupérer les infos il faut donc faire dans ta boucle quelque chose de la forme $data[$i]['question'], où $i est le numéro de ligne en cours. Pour ça que rien ne s'affichait Smiley cligne

Quand on ne sait pas trop ce que contient une variable, le plus simple est d'utiliser print_r ou var_dump (avec de chaque coté une balise <pre> pour que ça soit lisible Smiley cligne )

Edit : Oui, mysql_fetch_array retourne le résultat courant dans un tableau, pas l'ensemble des résultats de la requête.
Modifié par Planplan (03 Mar 2009 - 10:54)
Bon, mon hébergeur a semble-t-il un problème, je ne peux donc pas tester pour le moment. Je te remercie de tes réponses et explications, je vais y réfléchir un peu seule et faire encore quelques recherches pour comprendre mes erreurs =)

[Edit :]
Mon hébergeur vient de revenir ! J'ai bien tous mes sondages qui s'affichent désormais ! Merci beaucoup pour ton aide ! =D
Modifié par tatsu (03 Mar 2009 - 11:08)
Pardonnez mon double post, mais j'ai un nouveau problème avec mes sondages, cette fois-ci sur l'encodage semble-t-il. Toute mes pages sont créées en UTF-8, mon header spécifie que la page est encodée en UTF-8, et pourtant j'ai des caractères bizarres qui s'affichent quand je veux mettre un é ou è par exemple, ce dernier devenant è.
Je ne comprends pourquoi ça me fait ça sur mon sondage, puisque tout mon encodage semble correcte et que ça ne me le fais sur aucune autre page.

Il faut savoir que j'ai une page d'administration des sondages, permettant de les créer. La page est correcte (le bouton "ajouter une réponse" est écrit correctement) mais pas ce qui est dans les input. Pourtant, quand on regarde dans la base de données, les questions et réponses sont écrits correctement.

Je ne vois donc pas d'où cela peut-il venir Smiley ohwell
Modifié par tatsu (03 Mar 2009 - 13:31)
Héhéhé, les fameux problèmes d'encodages entre PHP et MySQL Smiley cligne

Tes champs, tables et bases utilisent quel jeu de caractères? latin1_swedish_ci, par défaut?
Si c'est le cas, c'est normal que tes caractères s'affichent mal, tu envois des caractères qui ne sont pas en UTF-8.

Le plus rapide c'est d'utiliser utf8_encode autour de l'affichage des résultats de ta requête.

Sinon, faut complètement revoir le jeu de caractère de tes tables, bases et champs MySQL, ainsi que la connexion.

Edit : Une petite requête que tu peux aussi utiliser avant :
SET NAMES 'utf8'
http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html
Justement, non, mes tables ne sont pas en latin1_swedish_ci ^^ Lors de la création, j'ai mis l'interclassement en utf8_general_ci. Je doute d'ailleurs que ça vienne de ma table, puisque j'ai fait une autre table (la table membres) pour un espace membres, et je n'ai pas ce soucis.
Je sais pas si ça peut aider à comprendre le problème, mais la page pour créer les sondage se situe dans un dossier protégé par htaccess. Cela pourrait-il avoir un effet et expliqué ce désagrément ?
Aucune idée pour le htaccess, tu peux toujours essayer sans. Mais si tes tables et champs sont déjà bien en UTF8, fais cette requête simple après la connexion :
mysql_query('SET NAMES \'utf8\' ');

Assure toi que la page est bien interprétée par le navigateur comme une page encodée en UTF-8 aussi.

C'est souvent le bazar de travailler avec tous ces encodages, surtout au début.
Modifié par Planplan (03 Mar 2009 - 15:19)
Comme tu l'as conseillé, je viens d'essayer sans le htaccess, et ça ne change rien Smiley ohwell

J'ai également tenté de mettre ton morceau de code juste après la connexion et ça n'a rien changé non plus.

Par contre, je ne vois pas trop comment s'assurer que le navigateur interprète bien la page en UTF-8. Si c'est juste en faisant "affichage" -> "encodage des caractères" (je suis sous FireFox), alors il est bien en UTF-8.
Je viens de tester sous d'autres navigateur (IE6, Opéra 9, et Safari 3) et j'ai exactement le même problème, tous regardant pourtant la page en UTF-8.

Est-il possible que cela vienne du code en lui-même ? Bien que je ne vois pas trop ce qui pourrait empêcher l'encodage, je ne vois pas non plus ce que ça pourrait être d'autre du coup :s
Un petit article à lire : http://www.blog-and-blues.org/weblog/2004/08/16/275-encodage-caracteres-xhtml/.

Ce qui donnerait, au début de ta page PHP, avant tout envoi d'information vers le navigateur :
header('Content-type: text/html; charset=utf-8');

Et le code necessaire dans le corps de la page générée, par exemple pour un document en XHTML 1.0 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(suite de la page...)
C'est exactement ce que j'ai mis.

Je te remercie pour ton lien. Je vais le regarder et voir si je trouve quelque chose d'intéressant pour régler mon problème =)

Merci de ton aide ^^
Salut,

Planplan a écrit :
Tes champs, tables et bases utilisent quel jeu de caractères? latin1_swedish_ci, par défaut?
Attention : là tu parles de la collation (ou interclassement) ce qui n'est pas la même chose que l'encodage.

tatsu a écrit :
Justement, non, mes tables ne sont pas en latin1_swedish_ci ^^ Lors de la création, j'ai mis l'interclassement en utf8_general_ci.
Idem.

Le plus simple est de lire Comment bien déclarer l'encodage des caractères d'un document.
Je n'ai rien trouvé qui puisse m'aider dans vos liens. Mon header est correcte, j'ai bien spécifié comme il se doit l'encodage, là où il doit être, mais le problème persiste.
Toutes mes pages sont faites de la même manière. Je ne comprends donc pas pourquoi dans l'inscription (par exemple) tout est parfait, et dans la création de sondage il se met à me changer les caractères comme si je n'étais pas dans le bon encodage.

Je crois que je vais laisser tomber ce problème pour le moment, et au pire des cas, je préciserai sur la page qu'il ne faut pas mettre d'accents. Parce que là, j'ai beau chercher, relire mon code, je ne vois vraiment pas le problème >.<
tatsu a écrit :
Toute mes pages sont créées en UTF-8, mon header spécifie que la page est encodée en UTF-8, et pourtant j'ai des caractères bizarres qui s'affichent quand je veux mettre un é ou è par exemple, ce dernier devenant è.
C'est un cas typique d'UTF-8 servi en tant que LATIN1 (ou ISO-8859-1 pour les intimes).

Puisque tu n'as pas d'autres problèmes sur tes autres pages on peut supposer que tout est bien en UTF-8 et que le problème vient seulement ce que tu récupères de la BDD.

Normalement ce que te proposais Planplan devrait suffire : faire juste après le mysql_select_db
mysql_query('SET NAMES UTF8');
pour préciser que la connexion se fait en UTF-8 et pas en LATIN1 (comme c'est généralement le cas par défaut)
Pages :