[RESOLU] Écriture de donnée dans une BDD

Eléphanteau du PHP | 10 Messages

01 janv. 2013, 22:14

Bonjour tout le monde,

Je suis en train de réaliser un forum pour mettre en pratique ce que j'ai appris en PHP et je rencontre un problème et j'ai aussi un petit doute que je détaillerai à la fin.

1- Mon problème


Mon (futur) forum est constitué de differents "topics" qui peuvent être écris pas les internautes. J'ai fais un formulaire pour créer les topic. Tous s'enregistre très bien dans la BDD et tous s'affiche très bien.

C'est pour écrire une réponse à un topic que je galère un peu plus. Mon problème c'est que rien ne s'écris dans la BDD et je ne comprends pas pourquoi...

Donc voici mon script pour afficher toute les réponses et à la suite de sa le formulaire pour en écrire une nouvelle :
<?php
session_start();
?>

		<?php
				include("connexion_bdd.php");
				
 				$reponse= $bdd->query('SELECT*
										FROM forum_post 
										INNER JOIN forum_topic
										ON forum_post.topic_id=forum_topic.topic_id
										WHERE topic_id= $_POST[\'topic_id\']
										ORDER BY post_id');
				while ($donnees = $reponse)
				{
					echo $donnees['post_createur']; 
					echo	$donnees['post_time'];
					echo	$donnees['post_texte'];
						
				}
				
			?>
				
				<form method="post" action="traitement_creer_post.php">
				Votre réponse: <textarea name="topic_post"> </textarea> </br>
				<input type="hidden" name="topic_id" value="$_POST['topic_id']">
				
				<input type="submit" value="Valider" />
				</form>

et la page qui traite la nouvelle réponse ( et qui la rentre dans la BDD ) :
<?php
	session_start();
	
	$_POST['topic_post']=htmlspecialchars($_POST['topic_post']);
	
	include("connexion_bdd.php");
	$req = $bdd->prepare('INSERT INTO forum_post ( post_createur, post_texte, post_time,topic_id) 
	VALUES( :post_createur, :post_texte, NOW()), :topic_id');
	$req-> execute(array(
		'post_createur'=> $_SESSION['pseudo'],
		'post_texte'=> $_POST['topic_post'],
		'topic_id'=> $_POST['topic_id']
		));
		echo ' Voter réponse  a était ajouté  ';

Donc voilà je pense que le problème est dans le second script mais où ? je ne sais pas... ( je précise qu'il n'y a aucun message d'erreur quand je le fais fonctionner !)


et sinon j'ai un doute :

Lorsque je veux afficher les réponse au topic, il faut que j'affiche SEULEMENT les réponse au topic qui est regardé ! C'est pour cela que j'ai fais une jointure interne ! Mais je ne sais pas comment transmettre l'id du topic ar là je le transmets avec un methode trouvé sur un autre site web mais je ne suis pas très convaincu ( et je ne sais pas si elle marche ) si quelqu'un à un autre solution ! ....

Mes tables sont comme ceci :
FORUM_POST:
post_id
post_createur
post_texte
post_time
topic_id

et FORUM_TOPIC:
topic_id
topic_titre
topic_createur
topic_vu
topic_first_post
topic_post

Quelqu'un peu m'aider ?

Merci d'avance !

À très bientôt !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 janv. 2013, 00:16

Salut ,

As tu regardé ce ce qu'il y'a dans ton formulaire ?

Quand tu l'affiche (regardé la source html).
Quand tu le valide, ajoute un var_dump($_POST); Au début du script afin de voir les données dont tu dispose et si elle sont cohérente.


Sinon le principe est bon il te faut passer l'id du topic au script d'insertion, donc soit par l'url, soit en donnée cachée du formulaire (comme tu le souhaite).


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

02 janv. 2013, 01:15

Losque je fais : var_dump($_POST),
il me dit :
array(2) { ["topic_post"]=> string(7) " qdfqdf" ["topic_id"]=> string(18) "$_POST['topic_id']" }

Je ne comprend pas que faut il faire pour mettre la bonne valeur dans $_POST['topic_id'] ?

Eléphanteau du PHP | 10 Messages

02 janv. 2013, 02:17

ReBonjour
Je viens de m'aperçevoir que j'avais oublier d'envoyer les données entre les pages ! donc c'est normal que l'autre page ne la recevais pas car l'id n'était pas envoyer ! :p

Bon sauf que là un autre problème apparaît ! :/

Tous rentre super bien dans la BDD mais lorsque je veux afficher les message d'un topic et ben rien ne s'affiche... voici ma page où tout doit s'afficher ( normalement ) !
<?php
session_start();
?>

		<?php
				include("connexion_bdd.php");
				$topic_id=$_POST['topic_id'];
 				$reponse= $bdd->query('SELECT*
										FROM forum_post 
										LEFT JOIN forum_topic
										ON forum_post.topic_id=forum_topic.topic_id
										WHERE forum_post.topic_id= $topic_id
										ORDER BY post_id');
				while ($donnees = $reponse->fetch())
				{
					echo $donnees['post_createur']; 
					echo	$donnees['post_time'];
					echo	$donnees['post_texte'];
						
				}
				
				
				
				
				echo $topic_id;
				
				
				?>
				
				
				
				
				
				
				
				<form method="post" action="traitement_creer_post.php">
				Votre réponse: <textarea name="topic_post"> </textarea> </br>
				<input type="hidden" name="topic_id" value= <?php echo $topic_id ?>>
				
				
				<input type="submit" value="Valider" />
				</form>
				

Je pense que ce qui cloche c'est la requête avec les jointures... mais quoi dans la requête .... À vous de me le dire car moi je trouve pas ... :p

Néanmoins, un message s'affiche :
Fatal error: Call to a member function fetch() on a non-object in /opt/lampp/htdocs/rm/affichage_topic.php on line 14

Que faire ?

ViPHP
xTG
ViPHP | 7331 Messages

02 janv. 2013, 10:48

Les variables ne sont pas interprétées entre simple quote.
De plus il faut absolument échapper toute variable que tu injectes dans une requête SQL.
Tu peux utiliser les requêtes préparées ou bien utiliser la fonction de protection PDO::quote().

Eléphanteau du PHP | 10 Messages

02 janv. 2013, 11:03

Ok, j'ai mis une requête préparé et sa marche nickel ! CImer ! =D>