Problème d'insertion dans un while

Résolu/Fermé
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 - 29 mars 2018 à 02:47
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 - 2 avril 2018 à 00:19
Bonjour, Bonsoir,

Je me casse la tête depuis plusieurs jours sur un problème qui me paraît impossible à résoudre. J'ai retourner mon code dans tout les sens mais il ne veux absolument pas fonctionner. Je songe partir en dépression longue durée, mais avant ça, je vous pose au cas où mon gros problème.

Sur ma page1.php j'ai ceci :


<div class="posttopageelementsi">
<?php require 'elements/post_pulication.php'; ?>
</div>


Sur mon post_pulication.php j'ai ceci :


<?php
/* DÉBUT DU WHILE */
?>
<div class="commentpost" id="sectionposts">
<?php require('showcomments.php'); ?>
</div>
<form method="post">
<?php require('post_comment.php'); ?>
</form>
<?php
/* FIN DU WHILE */
?>


Sur mon post_comment.php j'ai ceci :

<?php session_start();

$comment = htmlspecialchars($_POST['commentpost']);
if (isset($_POST['sendmessage'])) {
$insertmsg = $bdd->prepare('INSERT INTO comments (id_post, date_comment, contenu, id_posteur) VALUES (:idpost, NOW(), :contenu, :idposteur)');
$insertmsg->bindParam('idpost', $a['id']);
$insertmsg->bindParam('contenu', $comment);
$insertmsg->bindParam('idposteur', $_SESSION['id']);
$insertmsg->execute();

}
?>
<form method="post">
<div class="inputpost">
<img <?php echo 'src="membres/avatars/' . $userinfo['avatar'] . '"'?> class="imgpost" style="border-radius: 100%;">
<input type="text" name="commentpost" class="inputpost" placeholder="Écrire un commentaire...">
<input type="submit" name="sendmessage" class="sendchatsubmit" value="Envoyer<?php echo $a['id']; ?>" style="display: none;">
</form>
</div>


Mon code fonctionne parfaitement (Traitement de la demande, insertion dans la base de donnée) mais il y a un hic. Sinon ça ne serait pas drôle. L'insertion se fait, mais au nombre de post se trouvant sur le profil de quelqu'un, du coup :



Je me dit que forcément le problème viens du WHILE étant donner que $a['id'] passe par tous les commentaires générés. Quand je fait une echo, il me met bien l'identifiant du post. Si je le met dans une variable, forcément, ça ne fonctionne pas non plus.

Quelqu'un aurait-il une solution s'il vous plaît ?
Merci d'avance !
A voir également:

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
29 mars 2018 à 13:28
Bonjour,

Je n'ai pas tout compris à tes explications et ce que tu veux faire, ça manque de contexte.
Ceci dit, tu fais un INSERT au sein d'une boucle, donc forcément tu vas avoir autant de ligne que d'itérations de ta boucle.
Comme tu ne nous montres pas la boucle en question (mais pourquoi l'avoir masquée ??) il nous manque des infos...

L'idéal serait soit :
- de n'exécuter l'INSERT que dans la bonne occurrence de ta boucle, en vérifiant par exemple le $a['id']
- de sortir l'exécution du INSERT de ta boucle

Xavier
0
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 22
29 mars 2018 à 14:14
Bonjour Xavier et merci pour ta réponse,

En fait, je suis obliger de mettre l'Input Text dans un While, et donc, l'INSERT.
J'ai masquer le While car il y a énormément de code, la plupart qui n'a rien à voir avec mon problème, mais si ça peut t'aider, voici :

• Sur mon post_pulication.php j'ai ceci :

<!-- Début du while -->
	<?php 
		$post = $bdd->prepare('SELECT * FROM post WHERE id_mur = :idmur ORDER BY date_post DESC');
		$post->execute(array(
			'idmur' => $getid,
		));
		while ($a = $post->fetch()) {
		$infouser = $bdd->query('SELECT * FROM membres WHERE id = ' . $a['id_posteur']);
		$uinfo = $infouser->fetch();
	?>
	<script type="text/javascript">
		$('ul.nav li.dropdown').hover(function() {
		  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
		}, function() {
		  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
		});
		myscroll = $('#sectionposts');
		myscroll.scrollTop(myscroll.get(0).scrollHeight);
	</script>
<?php
$DateToday = new DateTime(); /* Date du jour */
$DatePublished = new DateTime($a['date_post']); /* Date de la publication */
$DateSeconde = $DateToday->diff($DatePublished)->format('%s'); /* Secondes de la publication */
$DateMinute = $DateToday->diff($DatePublished)->format('%i'); /* Minutes de la publication */
$DateHour = $DateToday->diff($DatePublished)->format('%H'); /* Heure de la publication */
$DateDay = $DateToday->diff($DatePublished)->format('%d'); /* Jour de la publication */
$DateMouth = $DateToday->diff($DatePublished)->format('%n'); /* Mois de la publication */
$DateYear = $DateToday->diff($DatePublished)->format('%o'); /* Année de la publication */
if ($DateYear > 0) { /* Si l'année est supérieur à 0 */
	if ($DateYear == 1) {
		$DateResult = 'Il y a ' . $DateYear . ' an'; /* On affiche le nombre d'anné (Au singulier) */
	} elseif ($DateYear > 1) {
		$DateYear = 'Il y a ' . $DateYear . ' ans'; /* On affiche le nombre d'années (Au pluriel) */
	}
} else { /* Si l'année n'est pas supérieur à 0 */
	if ($DateMouth > 0) { /* Si le mois est supérieur à 0 */
		$DateResult = 'Il y a ' . $DateMouth . ' mois'; /* On affiche le nombre de mois */
	} else { /* Si le mois n'est pas supérieur à 0 */
		if ($DateDay > 0) { /* Si le jour est supérieur à 0*/
			if ($DateDay == 1) {
				$DateResult = 'Il y a ' . $DateDay  . ' jour'; /* On affiche le nombre de jour (Au singulier) */
			}else{
				$DateResult = 'Il y a ' . $DateDay  . ' jours'; /* On affiche le nombre de jours (Au pluriel) */
			}
		}
		else /* Si le jour n'est pas supérieur à 0 */
		{
			if ($DateHour > 0) { /* Si l'heure est supérieur à 0 */
				$DateResult = 'Il y a ' . $DateHour . ' h';
			} else { /* Si l'heure n'est pas supérieur à 0 */
				if ($DateMinute > 0) {
					if ($DateMinute == 1) {
						$DateResult = 'Il y a 1 minute';
					} else {
						$DateResult = 'Il y a ' . $DateMinute . ' minute';
					}
				}else{
					if ($DateSeconde == 0) {
						$DateResult = 'À l\'instant';  /* On affiche "À l'instant" */
					}elseif ($DateSeconde == 1) {
						$DateResult = 'Il y a 1 seconde';  /* On affiche le nombre de seconde (Au singulier) */
					}else{
						$DateResult = 'Il y a ' . $DateSeconde . ' secondes'; /* On affiche le nombre de secondes (Au pluriel) */
					}	
				}			
			}
		}
	}
}
?>
<div class="formpost" style="line-height: 25px;">
	<div id="post_text">
		<div class="headpost">
			<a href="../profile.php?id=<?php echo htmlspecialchars($a['id_posteur']); ?>"><img src="membres/avatars/<?php echo $uinfo['avatar']; ?>" class="imgpost" style="border-radius: 100%;"></a>
			<div>
				<p><a href="../profile.php?id=<?php echo $a['id_posteur']; ?>"><?php echo $uinfo['pseudo']; ?></a></p>
				<p class="timepost"><?php echo $DateResult ?></p>
				<?php if ($a['id_posteur'] == $_SESSION['id'] OR $a['id_mur'] == $_SESSION['id']) { ?>
				<ul class="nav navbar-nav navbar-right">
		            <li class="dropdown">
		              <a class="dropdown-toggle" data-toggle="dropdown"><b class="caret"></b></a>
		              <ul class="dropdown-menu">
		              	<?php if ($a['id_posteur'] == $_SESSION['id']) { ?>
		                	<li><a href="#">Modifier</a></li>		                	
		                <?php } ?>
		                <?php if ($_SESSION['id'] ==  $a['id_posteur']) { ?>
		                <li class="divider"></li>
		                <?php } ?>		                
						<?php if ($_SESSION['id'] ==  $a['id_posteur'] OR $a['id_mur'] == $_SESSION['id']) { ?>		                	
		                	<li><a href="elements/gest_post.php?delpostid=<?php echo $a['id']; ?>">Supprimer la publication</a></li>
						<?php } ?>
		              </ul>
		            </li>
		        </ul>
		        <?php } ?>
			</div>
		</div>
		<p class="hightcom"><?php echo $a['contenu']; ?></p>
		<?php if (!empty($a['picturecontent'])) { ?>
			<a><img src="../membres/avatars/<?php echo $a['picturecontent']; ?>" class="piccontent"></a>
		<?php } ?>		
		<div class="actionpost">
			<p class="action-button">J'aime</p>
			<p class="action-button">Répondre</p>
			<p class="action-button">Partager</p>
		</div>
		<div class="footpost">
			<div class="commentpost" id="sectionposts">
				<?php require('showcomments.php'); ?>
			</div>						
			<form method="post">
				<?php require('post_comment.php'); ?>
			</form>
			<iframe name="framet" style="display: none;"></iframe>
		</div>
	</div>
</div>
<?php
		}/* <- Fin du while */	


Voici ce que me donne mon WHILE :



Ensuite j'ai fait un seconde While qui fonctionne parfaitement, pour afficher mes commentaires. Un While dans un While Showcomment.php, donc qui ne pose aucun problème. Cependant, le textbox est obligatoire dans un while, sinon, il ne s'afficherait pas pour toutes les publications.

Si je sort l'insert, il ne sera pas pris en compte si par exemple je le met au dessus du premier While (Dans post_publication.php)

<?php session_start();

$comment = htmlspecialchars($_POST['commentpost']);
if (isset($_POST['sendmessage'])) {
	$insertmsg = $bdd->prepare('INSERT INTO comments (id_post, date_comment, contenu, id_posteur) VALUES (:idpost, NOW(), :contenu, :idposteur)');
	$insertmsg->bindParam('idpost', $a['id']);
	$insertmsg->bindParam('contenu', $comment);
	$insertmsg->bindParam('idposteur', $_SESSION['id']);
	$insertmsg->execute();

}
?>
<form method="post">
<div class="inputpost">
	<img <?php echo 'src="membres/avatars/' . $userinfo['avatar'] . '"'?> class="imgpost" style="border-radius: 100%;">
	<input type="text" name="commentpost" class="inputpost" placeholder="Écrire un commentaire...">
	<input type="submit" name="sendmessage" class="sendchatsubmit" value="Envoyer<?php echo $a['id']; ?>" style="display: none;">
</form>
</div>


Merci d'avance
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 30 mars 2018 à 10:29
Bonjour,

Ce n'est pas pris en compte parce que $a['id'] n'existe pas encore.
Le mieux je pense est de rajouter un champ hidden aux formulaires, et le reprendre dans l'insertion.
<input type="hidden" name="idpost" value="<?php echo $a['id']; ?>" />
<input type="text" name="commentpost" class="inputpost" placeholder="Écrire un commentaire...">
<input type="submit" name="sendmessage" class="sendchatsubmit" value="Envoyer<?php echo $a['id']; ?>" style="display: none;">


Puis dans ton bloc d'insertion, que tu peux, du coup, sortir de la boucle :
<?php session_start();

if (isset($_POST['sendmessage'])) {
    $comment = htmlspecialchars($_POST['commentpost']);
    $idpost = $_POST['idpost'];
    $insertmsg = $bdd->prepare('INSERT INTO comments (id_post, date_comment, contenu, id_posteur) VALUES (:idpost, NOW(), :contenu, :idposteur)');
    $insertmsg->bindParam('idpost', $idpost);
    $insertmsg->bindParam('contenu', $comment);
    $insertmsg->bindParam('idposteur', $_SESSION['id']);
    $insertmsg->execute();
}
?>


Xavier
0
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 22
30 mars 2018 à 13:07
Bonjour Xavier, c'est incroyable ça fonctionne parfaitement !

Merci beaucoup de m'avoir aider, ce n'était vraiment pas évidant, la prochaine fois j'aurais la technique.

Résolu !

Merci encore :)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
30 mars 2018 à 13:48
Note également que, si tu veux vraiment laisser ce code dans ta boucle (ce qui pourrait se comprendre dans une optique de « ranger » le code, mettre ensemble le formulaire et son traitement), tu peux le faire en rajoutant le test
 && $_POST['idpost'] == $a['id']
dans ton if().

C'est moins optimal car le test sera refait à chaque itération de la boucle, mais ça facilite la maintenance en gardant ensemble les éléments qui vont ensemble.
0
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 22
2 avril 2018 à 00:19
Merci pour ton conseil Xavier, j'ai utiliser la méthode la plus simple, pour ce qui est du rangement je penses que c'est déjà trop tard. haha

Maintenant il me reste plus qu'à envoyer les formulaires sans rafraîchissement complet de la page, ce qui va être, je penses, bien galère car c'est du Jquery.

Merci encore pour tes réponses et tes explications. Bon courage pour la suite. :)
0