[RESOLU] Afficher des commentaires sur un fil d'actualités

Eléphant du PHP | 386 Messages

12 avr. 2014, 23:40

Bonjour,

Dans mon exemple, j'ai 2 actualités, l'une avec l'id 1 et l'autre 2.
J'ai posté un commentaire dans l'actu 1, et le commentaire s'affiche dans les 2 commentaires.

Voici ma base de donnée :

USERS_STATUT : "statut_id"(INT) AutoIncrement ; "user_id"(INT) ; "statut_text"(TEXT) etc... ;
USERS_COMS : "coms_id"(INT) AutoIncrement ; "user_id"(INT) ; "coms_statut"(INT) ; "coms_text"(TEXT) etc... ;

coms_statut doit être égal à statut_id

Voici ma requête :
$resultat = Bdd::connect() -> prepare('SELECT * FROM users_coms, users_statut, users WHERE users_coms.user_id = users.id AND coms_statut = statut_id');
$resultat -> execute();
if($resultat -> rowCount() >= 1){
	while($coms = $resultat -> fetch(PDO::FETCH_ASSOC)){
		echo $coms['coms_text'];
	}
}
Ce n'est pas des jointures mais je n'arrive pas à en faire qui fonctionne :(
Ma requête est insérée dans une fonction qui, elle, est affichée dans la fonction d'affichage des actualités.

Merci d'avance pour votre aide

Eléphant du PHP | 58 Messages

13 avr. 2014, 08:23

Il te faudrait effectivement une jointure pour bien faire. Et il y a un petit soucis dans le sens où tu ne récupères pas les données pour un id spécifique.
As-tu une clé étrangère dans la table actu qui te permet de la lier aux commentaires ?

Eléphant du PHP | 386 Messages

13 avr. 2014, 17:51

Désolé pour ma réponse tardive, je viens de rentrer du taf 8-)

J'ai juste le champ "statut_id" PRIMARY
Je ne vois pas l'option Clé étrangère dans phpmyadmin...

Sinon pour la jointure, tu saurais comment faire ?

Merci d'avance :)

Eléphant du PHP | 58 Messages

13 avr. 2014, 18:40

Dans ta table de commentaire, quel est le champ qui reprend l'id de l'actu ?
En gros, la jounture devrait ressemblée à
SELECT * FROM table_actu JOIN table_commentaire ON table_actu.id = table_commentaire.actu_id WHERE table_actu.id = id_actu_courante

Eléphant du PHP | 386 Messages

13 avr. 2014, 19:49

Dans la table commentaires, c'est "coms_statut" qui reprend l'id de l'actu

J'ai essayé de faire ta jointure, ça ne fonctionne pas :
Ça vient peut-être de la fonction infoStatut() avec :actu

USERS est la table membre :
- id est l'id du membre
- user_id (de la table users_statut) est égal à l'id du membre
function displayCom(){
	$resultat = Bdd::connect() -> prepare('SELECT * FROM users_statut JOIN users_coms ON users_statut.statut_id = users_coms.coms_statut WHERE users_statut.statut_id = :actu');
	$resultat -> execute(array('actu' => infoStatut('statut_id')));
	if($resultat -> rowCount() >= 1){
		while($coms = $resultat -> fetch(PDO::FETCH_ASSOC)){
			echo $coms['coms_text'];
		}
	}
}
function infoStatut($info){
	$resultat = Bdd::connect() -> prepare('SELECT * FROM users_statut LEFT JOIN users ON users_statut.user_id = users.id ORDER BY statut_date DESC');
	$resultat -> execute();
	$infoStatut = $resultat -> fetch(PDO::FETCH_ASSOC);
	return $infoStatut[$info];
}

Eléphant du PHP | 58 Messages

14 avr. 2014, 08:27

As-tu vérifié ce que te renvoie infoStatut('statut_id') ?

Eléphant du PHP | 386 Messages

14 avr. 2014, 14:58

Si je fais : echo infoStatut('statut_id'); dans la fonction, j'ai l'id de la dernière actu dans les 2 actus.

Dans mon exemple, j'ai 246 à toutes les actus alors que normalement ma deuxième actu à l'id 245
J'affiche toutes les fonctions des statuts, et des commentaires, pour que tu comprenne mieux ;-)
Il y a peut-être une modification à faire dans les fonctions des actualités (statuts).
<?php
// Statut
function infoStatut($info){
	$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS_STATUT.LEFTJOIN.USERSZ.ONSTATUT);
	$resultat -> execute();
	$infoStatut = $resultat -> fetch(PDO::FETCH_ASSOC);
	return $infoStatut[$info];
}
function createStatut($user_id,$statut_text,$statut_acces,$statut_photo){
	$statut_text = trim(html_entity_decode($_POST['statut_text']));
	if(isset($statut_text) && !empty($statut_text)){
		$resultat = Bdd::connect() -> prepare(INSERT.USERSZ_STATUT.STATUTINSERT);
		$resultat -> execute(array('user_id' => $user_id,'statut_text' => trim(html_entity_decode($statut_text)),'statut_acces' => $statut_acces,'statut_photo' => $statut_photo)); ?> 
		<div class="clearfix statutPost">
				<div class="post">
					<a href="<?php echo infoStatut('pseudo'); ?>" class="postAvatar"><img src="users/upload/avatars/<?php echo verifAvatarStatut(); ?>" height="56" width="56" alt="" /><i class="postAvatarCover"></i></a>
					<a href="<?php echo infoStatut('pseudo'); ?>" class="postName"><?php echo majuscule(infoStatut('prenom')); ?> <?php echo majuscule(infoStatut('nom')); ?></a>
					<div class="postOpt">
						<ul>
							<li class="dropdown"><a href="#" class="tooltip_top dropdown-toggle optLink" data-toggle="dropdown" title="Options"><i class="optIcon"></i></a>
								<ul class="subOpt"><?php if(infoStatut('user_id') == info($id, 'id')){ ?> 
									<li><a href="#" class="subOptLink modifPost" id="<?php echo infoStatut('statut_id'); ?>">Modifier</a></li>
									<li><a href="#" class="subOptLink delPost" id="<?php echo infoStatut('statut_id'); ?>">Supprimer</a></li><?php } elseif(infoStatut('user_id') != info($id, 'id')) { ?> 
									<li><a href="#" class="subOptLink signalPost" id="<?php echo infoStatut('statut_id'); ?>">Signaler comme indésirable</a></li><?php } ?> 
								</ul>
							</li>
						</ul>
					</div>
					<div class="postContent"><?php echo nl2br(smiley(infoStatut('statut_text'))); ?></div>
					<div class="postTime"><?php echo getRelativeTime(infoStatut('statut_date')); ?></div>
					<form method="post" action="home" class="statutCom" onsubmit="return false;">
						<div class="clearfix">
							<a href="#" class="postLink postComments"><i id="postComs"></i><span>Commenter</span></a>
							<a href="#" class="postLink postLikes"><i id="postLike"></i><span>J'aime</span></a>
							<span class="postText tooltip_top" title="<?php echo majuscule(infoStatut('statut_acces')); ?>"><i id="post_<?php echo infoStatut('statut_acces'); ?>"></i></span>
						</div>
						<div class="postContainer">
							<div class="newsCom"></div>
							<?php echo displayCom(); ?> 
							<div class="comsComposer showCom">
								<div class="clearfix">
									<div class="avatarCom">
										<img src="users/upload/avatars/<?php echo verifAvatar(); ?>" height="34" width="34" alt="" />
									</div>
									<div class="inputCom">
										<input type="text" data-user="<?php echo info($id,'id'); ?>" data-statut="<?php echo infoStatut('statut_id') ?>" class="text_coms" name="coms_text" placeholder="Écrire un commentaire" value="" />
									</div>
								</div>
							</div>
						</div>
					</form>
				</div>
			</div><?php
	} else {
		return false;
	}
}
function displayStatut(){
	$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS_STATUT.LEFTJOIN.USERSZ.ONSTATUT);
	$resultat -> execute();
	if($resultat -> rowCount() >= 1){
		while($statut = $resultat -> fetch(PDO::FETCH_ASSOC)){
			$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.infoStatut('id').'-mini.jpg';
			$avatarDefault = infoStatut('sexe') == 'homme' ? 'homme.jpg' : 'femme.jpg'; ?> 
			<div class="clearfix statutPost">
				<div class="post">
					<a href="<?php echo $statut['pseudo']; ?>" class="postAvatar"><img src="users/upload/avatars/<?php if(file_exists($avatar)){ echo $statut['id']; } else { echo $avatarDefault; } ?>-mini.jpg" height="56" width="56" alt="" /><i class="postAvatarCover"></i></a>
					<a href="<?php echo $statut['pseudo']; ?>" class="postName"><?php echo majuscule($statut['prenom']); ?> <?php echo majuscule($statut['nom']); ?></a>
					<div class="postOpt">
						<ul>
							<li class="dropdown"><a href="#" class="tooltip_top dropdown-toggle optLink" data-toggle="dropdown" title="Options"><i class="optIcon"></i></a>
								<ul class="subOpt"><?php if($statut['user_id'] == info($id, 'id')){ ?> 
									<li><a href="#" class="subOptLink modifPost" id="<?php echo $statut['statut_id']; ?>">Modifier</a></li>
									<li><a href="#" class="subOptLink delPost" id="<?php echo $statut['statut_id']; ?>">Supprimer</a></li><?php } elseif($statut['user_id'] != info($id, 'id')) { ?> 
									<li><a href="#" class="subOptLink signalPost" id="<?php echo $statut['statut_id']; ?>">Signaler comme indésirable</a></li><?php } ?> 
								</ul>
							</li>
						</ul>
					</div>
					<div class="postContent"><?php echo nl2br(smiley($statut['statut_text'])); ?></div>
					<div class="postTime"><?php echo getRelativeTime($statut['statut_date']); ?></div>
					<form method="post" action="home" class="statutCom" onsubmit="return false;">
						<div class="clearfix">
							<a href="#" class="postLink postComments"><i id="postComs"></i><span>Commenter</span></a>
							<a href="#" class="postLink postLikes"><i id="postLike"></i><span>J'aime</span></a>
							<span class="postText tooltip_top" title="<?php echo majuscule($statut['statut_acces']); ?>"><i id="post_<?php echo $statut['statut_acces']; ?>"></i></span>
						</div>
						<div class="postContainer">
							<div class="newsCom"></div>
							<?php echo displayCom(); ?> 
							<div class="comsComposer showCom">
								<div class="clearfix">
									<div class="avatarCom">
										<img src="users/upload/avatars/<?php echo verifAvatar(); ?>" height="34" width="34" alt="" />
									</div>
									<div class="inputCom">
										<input type="text" data-user="<?php echo info($id,'id'); ?>" data-statut="<?php echo $statut['statut_id'] ?>" class="text_coms" name="coms_text" placeholder="Écrire un commentaire" value="" />
									</div>
								</div>
							</div>
						</div>
					</form>
				</div>
			</div><?php
		}
	} else { echo '<div id="nofeed">Publiez quelque chose, partager des articles, photos ou vidéos...</div>'; }
}
function deleteStatut($statut_id){
	$statut_id = $_GET['statut_id'];
	if(isset($_GET['statut_id'])){
		$resultat = Bdd::connect() ->prepare(DELETE.USERS_STATUT.' WHERE statut_id = :statut_id');
		$resultat -> bindParam(':statut_id', $statut_id, PDO::PARAM_INT, 11);
		$resultat -> execute();
	} else {
		return false;
	}
}

// Commentaires
function createCom($user_id,$coms_statut,$coms_text){
	$coms_text = trim(html_entity_decode($_POST['coms_text']));
	if(isset($coms_text) && !empty($coms_text)){
		$resultat = Bdd::connect() -> prepare(INSERT.USERSZ_COMS.COMINSERT);
		$resultat -> execute(array('user_id' => $user_id,'coms_statut' => $coms_statut,'coms_text' => trim(html_entity_decode($coms_text)))); ?> 
		<div class="comsContainer">
			<div class="comAvatar">
				
			</div>
			<div class="comContent">
				
			</div>
		</div><?php
	} else {
		return false;
	}
}
function infoCom($info){
	$resultat = Bdd::connect() -> prepare('SELECT * FROM users_coms LEFT JOIN users ON user_id = id');
	$resultat -> execute();
	$infoComs = $resultat -> fetch(PDO::FETCH_ASSOC);
	return $infoComs[$info];
}
function displayCom(){
        $resultat = Bdd::connect() -> prepare('SELECT * FROM users_statut JOIN users_coms ON users_statut.statut_id = users_coms.coms_statut WHERE users_statut.statut_id = :actu');
        $resultat -> execute(array('actu' => infoStatut('statut_id')));
        if($resultat -> rowCount() >= 1){
			while($coms = $resultat -> fetch(PDO::FETCH_ASSOC)){
				echo $coms['coms_text'];
				echo infoStatut('statut_id');
			}
        }
}
?>
le fichier avec mes variables define :
<?php
include('config.inc.php');

// variables de connexion
define('DNS', 'mysql:host='.$PARAM_hote.';dbname='.$PARAM_bdd);
define('USER', $PARAM_login);
define('PASS', $PARAM_mdp);

// Informations de base
define('NAMESITE', $PARAM_namesite);
define('MAILSITE', $PARAM_mailsite);
define('URLSITE', $PARAM_urlsite);
define('URLHOME', $PARAM_urlhome);

// Instructions SQL
define('SELECT', 'SELECT ');
define('UPDATE', 'UPDATE ');
define('INSERT', 'INSERT INTO ');
define('DELETE', 'DELETE ');
define('ALL', '*');
define('LEFTJOIN', ' LEFT JOIN ');

// Les tables SQL
define('USERS', ' FROM users');
define('USERS_STATUT', ' FROM users_statut');
define('USERS_FRIENDS', ' FROM users_friends');
define('USERS_MSG', ' FROM users_msg');
define('USERS_COMS', ' FROM users_coms');

// Les tables SQL sans FROM
define('USERSZ', 'users');
define('USERSZ_STATUT', 'users_statut');
define('USERSZ_FRIENDS', 'users_friends');
define('USERSZ_MSG', 'users_msg');
define('USERSZ_COMS', 'users_coms');

// Les variables de recherche sur la table membres
define('LOGIN', ' WHERE email = :email AND mdp = :mdp');
define('EMAIL', ' WHERE email = :email');
define('ID', ' WHERE id = :id');
define('PSEUDO', ' WHERE pseudo = :pseudo');

// Les variables d'affichage des amis
define('FRIENDS', ' (friend_from + friend_to - :id) AS id_friend, friend_date, pseudo, prenom, nom, id, sexe');
define('COUNTFRIENDS', ' friend_id');
define('ONFRIENDS', ' ON id = (friend_from + friend_to - :id)');
define('WHEREFRIENDS', ' WHERE (friend_from = :id OR friend_to = :id) AND friend_confirm = :conf ORDER BY pseudo');

// Les variables d'affichage des messages
define('MSG', ' msg_id, msg_sender, msg_receiver, msg_text, msg_time, msg_lu, pseudo, prenom, nom, id, sexe');
define('COUNTMSG', ' msg_id');
define('ONMSG', ' ON users_msg.msg_sender = users.id');
define('WHEREMSGNONLU', ' WHERE msg_receiver = :id AND msg_lu = :nonlu ORDER BY msg_id DESC');
define('WHEREMSGLU', ' WHERE msg_receiver = :id AND msg_lu = :lu ORDER BY msg_id DESC');

// Les variables d'affichage du statut
define('ONSTATUT', ' ON users_statut.user_id = users.id ORDER BY statut_date DESC');
define('ONSTATUTPUBLIC', ' ON users_statut.user_id = users.id WHERE statut_acces = :public ORDER BY statut_date DESC');
define('ONSTATUTAMIS', ' ON users_statut.user_id = users.id WHERE statut_acces = :amis ORDER BY statut_date DESC');
define('ONSTATUTMOI', ' ON users_statut.user_id = users.id WHERE statut_acces = :moi ORDER BY statut_date DESC');

// Les variables d'affichage des commentaires


// Les variables d'enregistrement
define('STATUTINSERT', ' (user_id, statut_text, statut_acces, statut_photo, statut_date) VALUES (:user_id, :statut_text, :statut_acces, :statut_photo, NOW())');
define('COMINSERT', ' (user_id, coms_statut, coms_text, coms_date) VALUES (:user_id, :coms_statut, :coms_text, NOW())');

// Les variables de mises à jour
define('MAJPASS', ' SET mdp = :newPass');
define('MAJCONFIDENTIEL', ' SET confidentiel = :confidentiel');
?>

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

14 avr. 2014, 16:03

salut,

ton code n'est pas simple à lire et ton utilisation, a outrance, des constantes ne facilite pas la chose ;).

tu parles d'actualité et de commentaire, mais fournit du code relatif aux utilisateur, c'est pas clair.

Pour que l'on comprennent bien (et peux être que cela pourrait t'aider), il est nécessaire de nous montrer un MCD (Modèle Conceptuel de Données) de ta base (au pire un MDP, Modèle Physique de Données).
Ce type de document est très utile afin de savoir où tu va et pour nous que l'on parle le même langage que toi ;) (n'oublie pas que l'on connait pas ta base ni ce que tu a dans la tête et qui peu te sembler évident :D ).


Pour ce qui est des relations : utilisateur - actualité - commentaire d'actualité, tu devrais avoir un mcd de ce genre : (Toutes les donnés ne sont pas représentées je n'ai mis que le nécessaire à la compréhension).
mcd.jpg
A partir de la tu sais comment afficher le commentaire associé à une actu précise et comment afficher les auteurs de ces commentaires (même plus lus que l'on a aussi l'auteur de l'actu par la relation "Créer").
La relation "appartenir" indique comment tu sais à qu'elle actu appartient un commetnaire
La relation "Commenter" indique comment tu sais qui à commenté une news.


@+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

14 avr. 2014, 16:25

Merci pour ta réponse, et je comprend bien ton MCD, mais je n'arrive pas à créer la requête qu'il faut pour afficher le commentaire associé à l'actualité.
J'ai pourtant essayé beaucoup de possibilité avec les jointures.

Peux-tu m'expliqué comment on fait pour utiliser le schéma MCD avec une requête et des jointures, stp ?
Merci d'avance :wink:

PS : Mon code est pas très simple, c'est vrai, mais dans l'éditeur de texte que j'ai, ça devient facile :D

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

14 avr. 2014, 22:45

sans ton mcd on ne peux pas t'aider.

pour ce qui est des requêtes SQL => http://sqlpro.developpez.com

pour le MCD demande à google un tuto sur le modèle entité association de la méthode merise.

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

Eléphant du PHP | 386 Messages

14 avr. 2014, 23:59

Problème résolu que j'ai réussi à trouver.

Voici ma correction :

Il fallait passer le statut_id en paramètre de la fonction
function displayCom($statut_id){
        $resultat = Bdd::connect() -> prepare('SELECT * FROM users_statut JOIN users_coms ON users_statut.statut_id = users_coms.coms_statut JOIN users ON users_coms.user_id = users.id WHERE coms_statut = :actu');
        $resultat -> execute(array('actu' => $statut_id));
        if($resultat -> rowCount() >= 1){
			while($coms = $resultat -> fetch(PDO::FETCH_ASSOC)){
				echo $coms['coms_text'];
				echo $coms['id'];
			}
        }
}
Et j'affiche ma fonction : echo displayCom($statut['statut_id']);
Et ça fonctionne ;)