Système de news avec un forum phpbb

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Système de news avec un forum phpbb

par Truc » 03 janv. 2006, 21:45

tu fait appel a 3 tables
phpbb_topics`, `phpbb_users`, `phpbb_posts_text
elles sont nécessaires ? les champs qui sont dans le SELECT font tous parti d'une de ces tables ?

Ensuite tu as
post_id = topic_first_post_id
à quelles tables appartiennent ces champs ?

apres on peut envisager l'ajout un mot clé tel que JOIN.

par Obiwan-sensei » 03 janv. 2006, 21:34

Ce sont les mêmes infos, et c'est aussi le même auteur !!
Il n'y a pas un "mot" particulié à insérer dans la requete, genre INNER JOIN ou IN (SELECT ... FROM....)... ?
Un truc du même type quoi qu'il puisse reconnaitre quelle partie de la table et associée à quelle autre table..... Parce que là en fait, je pense que c'est vraiment un problème de produit cartésien, c'est à dire que j'ai un message qui s'affiche pour chaque utilisateur, j'avais deux users, l'admin et l'anonyme, j'ai créé un nouveau pour vérifier ma théorie, et maintenant j'ai trois messages affichés ^^ ! Il n'y a pas des moyens d'y rémédier, je veux dire... des moyens faciles ? :roll:

par Truc » 03 janv. 2006, 00:42

Oui mais avec la concaténation, ça revient à écrire la valeur de la variable en clair, pas entouré de guillemets ni d'apostrophes, ce qui est une erreur. Ce qu'il aurait pu faire: '" . $variable . "'.
Eh oui je réagis tard, pas vu O:)

mais d'apres la requete initiale il s'agit d'id (phpbb_posts.topic_id) donc je suppose "numérique" donc pas besoin de guillemets... :-k bref


• du nouveau
alors ca fonctionne maintenant
[ 31/12/05 19:04 ] - [ Par Anonymous ] - [ Commentaires (1) ]
• du nouveau
alors ca fonctionne maintenant
[ 31/12/05 19:04 ] - [ Par admin] - [ Commentaires (1) ]
ce sont peut-être les memes infos mais pas le meme auteur il faut peut etre regarder de ce coté.

par Obiwan-sensei » 03 janv. 2006, 00:28

Non, ça ne change rien.

Moi je pense plus à une histoire de produit cartésien. Mais je ne sais pas comment faire pour y rémédier !? Je n'ai pas trouvé de site où il est question de produit cartésien, et pourtant..... j'ai une vilaine impression :) ! Voilà, quelqu'un peut il m'aider ? Merci

par alexbad » 31 déc. 2005, 21:43

Essaie d'ajouter un DISTINCT à ta requête :wink:


<?
    $query        = "SELECT DISTINCT topic_id,
                          topic_title As title,
                          topic_time As date,
                          topic_replies As commentaires,
                          topic_poster As poster,
                          username As poster_name,
                          post_text As post                          
                          FROM `phpbb_topics`, `phpbb_users`, `phpbb_posts_text`
                          WHERE forum_id = 1 AND post_id = topic_first_post_id
                          ORDER BY topic_id  
                          DESC LIMIT 0,5"; 
?>

par Obiwan-sensei » 31 déc. 2005, 20:20

Salut à tous,
J'ai réussi à faire un code potable:
<?
include($_SERVER["DOCUMENT_ROOT"]."basededonneeconnexion.php");

	$dbconn		= @mysql_connect($host,$user,$pass);
	if(!$dbconn){die('La Connexion au Serveur MySQL a échoué. ('.mysql_error().')');};
	$dbsele		= @mysql_select_db($bdd,$dbconn);
	if(!$dbsele){die('La Connexion à la Base a échoué. ('.mysql_error().')');};
	$query		= "SELECT topic_id, 
						  topic_title As title,
						  topic_time As date, 
						  topic_replies As commentaires,
						  topic_poster As poster,
						  username As poster_name,
						  post_text As post						  
						  FROM `phpbb_topics`, `phpbb_users`, `phpbb_posts_text`
						  WHERE forum_id = 1 AND post_id = topic_first_post_id
						  ORDER BY topic_id  
						  DESC LIMIT 0,5";
						  
						  
	$result		= @mysql_query($query);
	if(!$result){die('La Requête sur la Base a échoué. ('.mysql_error().')');};

	while($post = @mysql_fetch_array($result)){
?>
<div class="news">
	
  <div class="title"> &nbsp;<strong>&bull; 
    <?=$post["title"]?>
    </strong> 
  </div>
	<div class="post">
		<?=$post["post"]?>
	</div>
	<div class="comments">
		[ <?=date("d/m/y H:i",$post["date"])?> ] - [ Par <a href="/forum/profile.php?mode=viewprofile&u=<?=$post["poster"]?>"><?=$post["poster_name"]?></a> ] - [ <a href="/forum/viewtopic.php?t=<?=$post["topic_id"]?>">Commentaires</a> (<a href="/forum/viewtopic.php?t=<?=$post["topic_id"]?>"><?=$post["commentaires"]?></a>) ]
	</div>
</div>
<?
	}
?>
Ce qui me donne ça
• du nouveau
alors ca fonctionne maintenant
[ 31/12/05 19:04 ] - [ Par Anonymous ] - [ Commentaires (1) ]
• du nouveau
alors ca fonctionne maintenant
[ 31/12/05 19:04 ] - [ Par admin] - [ Commentaires (1) ]
• qq nouvelles
c tt
[ 31/12/05 18:24 ] - [ Par Anonymous ] - [ Commentaires (0) ]
• qq nouvelles
c tt
[ 31/12/05 18:24 ] - [ Par admin] - [ Commentaires (0) ]
• Le site
Voici donc le forum de TP. C'est ici que vous pourrez discutter et échanger ce que vous voudrez ...
[ 21/10/00 02:01 ] - [ Par Anonymous ] - [ Commentaires (1) ]
Mais comme vous pouvez voir, j'ai deux fois la même news qui s'affiche, et ça pour chacune, alors que je n'ai besoin que d'une seule ^^. Voilà donc, savez vous pourquoi ça se passe comme ça ? Merci

par alexbad » 26 déc. 2005, 17:53

Dans une chaine de caractères il est toujours recommandé de séparer les variables du reste donc concaténations. donc la syntaxe initiale était correcte niveau structure!!
Oui mais avec la concaténation, ça revient à écrire la valeur de la variable en clair, pas entouré de guillemets ni d'apostrophes, ce qui est une erreur. Ce qu'il aurait pu faire: '" . $variable . "'.

par Truc » 26 déc. 2005, 15:28

Franchement là je comprend rien a ce que tu as voulu faire ( a part des erreurs :wink: )
Ben a vrai dire ça m'affiche pas mal de trucs ouais ^^ Que je ne comprend pas mais ouais....
Ça t'affiche "Erreur" :lol:

Sérieusement, remplace les trucs " . $variable . " par "$variable" dans ta requête
j'ai corrigé le bout de code qui cloche dans la requête de la fin:
$sql_get_body = mysql_query("SELECT *
                    FROM     phpbb_posts,
                        phpbb_posts_text
                    WHERE
                        phpbb_posts.topic_id = "$get_news['topic_id']"
                    AND
                        phpbb_posts.poster_id = "$get_news['topic_poster']"
                    AND
                        phpbb_posts_text.post_id = phpbb_posts.post_id
                    ORDER BY
                        phpbb_posts.topic_id DESC LIMIT 10");


Dans une chaine de caractères il est toujours recommandé de séparer les variables du reste donc concaténations. donc la syntaxe initiale était correcte niveau structure!!

aurais-je loupé un chapitre ?! :roll:

par Obiwan-sensei » 26 déc. 2005, 05:41

Umm ! Je ne comprend pas pourquoi pourquoi tu créés deux tables ? Parce que en fait les commentaires sont les messages suivants le premier ! je veux dire, le premier message du dernier topic créé dans un certain forum, est considéré comme la "news", donc le message qu'il faut afficher, et les messages en réponse à ce premier message dans le topic sont considérés comme "commentaires". Donc je pensais qu'il suffirait de copier dans une nouvelle table seulement les messages et topic du forum "news", du coup on aurait pû les récupérer dans cette table ! Mais là j'avoue ne pas trop comprendre ! Parce que là en fait tu fais un système à part entière, complétement indépendante du forum ? Non ? Umm.. oO !

Ouais, merci @ demain, moi aussi je vais quitter ce lieu pour visiter mon pieux ^^, disons qu'il est un peu 04:41 h du matin quoi :). Merci, je vais réfléchir pendant ce reste de nuit... peut être je vais rêver mon code :P ! Merci ! @ ++

par alexbad » 26 déc. 2005, 05:27

Nous allons pour simplifier les choses faire deux INSERT INTO.

D'abord, crée ta table news, je te montre la structure que j'utilise:

Code : Tout sélectionner

CREATE TABLE `news` ( `date` varchar(255) NOT NULL, `titre` varchar(255) NOT NULL, `nouvelle` longtext NOT NULL, `par` varchar(255) NOT NULL );
Tu peux exécuter directement dans phpmyadmin.

Là, par contre, il y a 4 tables dans lesquelles il faut insérer pour phpbb et 1 autre pour les news (celle que je t'ai fait créé).

Seulement, la structure est un peu difficile à comprendre... C'est pourquoi, avec la superbe tendance que j'ai à faire mes propres scripts (parce que je comprends que les miens :lol: ), je vais te recommander de faire ton propre système de commentaires.

Tu as maintenant ta propre table news.

Tu vas maintenant créé une table commentaires, avec cette structure:

Code : Tout sélectionner

CREATE TABLE `commentaires` ( `date` varchar(255) NOT NULL, `nouvelle` varchar(255) NOT NULL, `par` longtext NOT NULL, `commentaire` varchar(255) NOT NULL );
Maintenant que tu as tes deux tables, tu peux insérer dans les deux lorsque tu postes, avec deux INSERT INTO, si tu as des questions, pose les, je suis plutôt pressé, je vais revenir demain.

par Obiwan-sensei » 26 déc. 2005, 04:56

Ouais, c'est pas con du tout ! Je n'y avais pas pensé, mais... ça pourra fonctionner pareil ? Et ça pourra fonctionner tout court ? C'est possible d'insérer dans deux tables ? Tu fais un insert into *** suivi de la même chose sur une autre table ? C'est ça ?

Ouais, c'est vrai qu'il faudrait que j'en apprenne un peu plus sur les BDD :roll:

Umm.... Même avec la correction $get_news = mysql_fetch_array($sql_get_news); ça ne fonctionne pas pour les variables où on a elevé les concaténations phpbb_posts.topic_id = "$get_news['topic_id']" ... :cry:

Peut être bien que ce serait plus simple de faire avec deux tables, mais il faut tout refaire :o :(. Et surtout il faut modifier le code de phpbb, et ça sa dépace encore plus mon niveau de nouveau jeune petit débuttant ^^ ! Umm... Dur !! Ce serait quand même bien que ça puisse fonctionner ce code là :P !

par alexbad » 26 déc. 2005, 04:39

$get_news = mysql_fetch_array($sql_get_news));

C'est cette ligne qui cloche, tu l'avais sans doute corrigé mais j'ai pris ton dernier code posté. Remplace par:

$get_news = mysql_fetch_array($sql_get_news);

Ne serait-il pas 100 fois plus simple de faire ainsi:

Chaque fois que tu postes une news, ça insère à la fois dans la table correspondante de phpbb et à la fois dans une table news.

Ce qui selon moi, rendrait les choses vraiment plus simple.

Au fait, pour faire cela, il faudrait davantage se pencher sur l'insertion dans la base que sur l'affichage car il en sera grandement facilité :wink: Tu es intéressé par cette solution?

par Obiwan-sensei » 26 déc. 2005, 04:09

J'ai essayé avec ton code, et ça rend :
Parse error: parse error, unexpected ')' in /var/www/free.fr/b/1/home/forum/news.php on line 23
Soit =>$get_news = mysql_fetch_array($sql_get_news));<= est faux
:( J'ai enfin compris à quoi servait le ASC à la fin de la requête : à rien :D, puisque c'est dans l'ordre décroissant, c'est bien ça ?
Umm... pour les tables il y en a tellement sur les forums phpbb que ça me fait un peu peur moi, s'triste :cry:
Merci de veiller pour moi :D

Edit: Bah en fait, je veux le premier post affiché, et après le nombre de commentaires dans une parenthese au dessous !, avec un lien direction le forum, pour pouvoir voir et ajouter des coms !

par alexbad » 26 déc. 2005, 04:00

Oui bon... regarde, j'ai corrigé le bout de code qui cloche dans la requête de la fin:
<?
$mysql_host = ""; //Le host du serveur
        $mysql_login = ""; //le login ou l'username du serveur
        $mysql_pass = ""; //le mot de pass du serveur
        $db_name = ""; //Le nom de votre base de donnée
           
        $db_link = @mysql_connect($mysql_host,$mysql_login,$mysql_pass);
        if(!$db_link) {
                 echo "Connexion impossible à la base de données";
            }

        $db_selected = mysql_select_db($db_name,$db_link);
        if (!$db_selected) {
                         die ('Impossible d\'utiliser la base : ' . mysql_error()); }





        // 1. mov_topics -> regarde dans la base de donnée, car avec phpbb on peu utilise ce qu'on souhaitecomme prefix, donc il est fort probable qu'il y ai ecrit phpbb_topics (standart si je me souvien bien)
// 2. le forum_id c'est le id du salon ... il faudra donc changer celui la du salon que tu souhaite afficher les topics                    
$sql_get_news = mysql_query("SELECT * FROM phpbb_topics WHERE forum_id = 2 ORDER BY topic_time DESC LIMIT 1");
$get_news = mysql_fetch_array($sql_get_news));

   // changer le prefix et le id du salon
      $sql_get_news_next = mysql_query("SELECT * FROM phpbb_topics WHERE forum_id = 2 ORDER BY topic_time DESC LIMIT 1");
?>

<div style="font-size: 12px; font-weight: bolder; font-family: Verdana;">    
<?
                           
   while ($get_news_next = mysql_fetch_array($sql_get_news_next))
   {
     echo $get_news_next['topic_title']."<br />";
   }
?>
</div>

<?
                         
// Ici il suffit juste de changer le mov_topics pour ton prefix comme si dessus
$sql_get_replies = mysql_query("SELECT topic_replies FROM phpbb_topics WHERE topic_id = ".$get_news['topic_id']);
$get_replies = mysql_fetch_array($sql_get_replies);

                         
// Pareil ici, changer le prefix
$sql_get_poster = mysql_query("SELECT username FROM phpbb_users WHERE ". $get_news['topic_poster'] ." = user_id");
$get_poster = mysql_fetch_array($sql_get_poster);
                         
// toujours pareil changer les prefix
$sql_get_body = mysql_query("SELECT *
                    FROM     phpbb_posts,
                        phpbb_posts_text
                    WHERE
                        phpbb_posts.topic_id = "$get_news['topic_id']"
                    AND
                        phpbb_posts.poster_id = "$get_news['topic_poster']"
                    AND
                        phpbb_posts_text.post_id = phpbb_posts.post_id
                    ORDER BY
                        phpbb_posts.topic_id DESC LIMIT 10");
while ($get_body = mysql_fetch_array($sql_get_body))
{
echo $get_body['post_text']; }
?>
Maintenant, je vais aller jeter un oeil aux tables phpbb question d'y voir plus clair...

EDIT: Au fait, ce script, c'est pour récupérer la news ou les commentaires?

par Obiwan-sensei » 26 déc. 2005, 03:56

Ben non ! C'est bien pire ^^ ! Enfin en tout cas il y a toujours de belles erreurs ;)
Je me suis gourré dans la syntaxe ? Et moi qui trouvais le français difficile :lol: :roll: