Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2011, 22h20   #1
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Par défaut Fonction gestion des commentaires

Bonjour,

J'ai fait une fonction qui me permet de créer des commentaires et des commentaires de commentaire (notion de recursivité) mais aussi de supprimer et de modifier son commentaire

Le problème est que la récursivité fonctionne une seule fois, sauriez-vous pourquoi ? (cf pièce jointe)

Nota, si vous souhaitez épurer le code c'est avec plaisir !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
	$array_commentaire = array();
		while ($tab_data_comment = $sql_data_comment->fetch())
		{	
			$array_commentaire[$tab_data_comment['id']]['titre']= stripslashes(htmlspecialchars($tab_data_comment['titre'])); 
			$array_commentaire[$tab_data_comment['id']]['contenu']= stripslashes($tab_data_comment['contenu']); 
			$array_commentaire[$tab_data_comment['id']]['pseudo']= stripslashes(htmlspecialchars($tab_data_comment['pseudo'])); 
			$array_commentaire[$tab_data_comment['id']]['timestamp']= intval($tab_data_comment['timestamp']); 
			$array_commentaire[$tab_data_comment['id']]['type_comment']= intval($tab_data_comment['type_comment']); 
			$array_commentaire[$tab_data_comment['id']]['identifiant_comment']= intval($tab_data_comment['identifiant_comment']); 
			$array_commentaire[$tab_data_comment['id']]['message_cite']= intval($tab_data_comment['message_cite']); 
			$array_commentaire[$tab_data_comment['id']]['id_user']= intval($tab_data_comment['id_user']); 		
			$array_commentaire[$tab_data_comment['id']]['type_balade']= intval($tab_data_comment['type_balade']); 	
			$array_commentaire[$tab_data_comment['id']]['id']= intval($tab_data_comment['id']);
		}
 
		//debut fonction
		function afficher_commentaire($identifiant_comment, $array_commentaire,$cite = false)
		{
			$contenu = $array_commentaire[$identifiant_comment]['contenu'];
			$id_message_cite = $array_commentaire[$identifiant_comment]['message_cite'];
			$type_comment = $array_commentaire[$identifiant_comment]['type_comment'];
			$id_maj_supr_comment = $array_commentaire[$identifiant_comment]['identifiant_comment'];
			$type_balade = $array_commentaire[$identifiant_comment]['type_balade'];
			$id = $array_commentaire[$identifiant_comment]['id'];
			$timestamp = $array_commentaire[$identifiant_comment]['timestamp'];
			$pseudo = $array_commentaire[$identifiant_comment]['pseudo'];
 
			echo '<div class="componentheading_categorie">';
				echo stripslashes($array_commentaire[$identifiant_comment]['titre']);			
			echo' <span class="quote_droite">';
 
			//si connecté
			if (Fsb::$session->is_logged())
			{
				$id_user = $array_commentaire[$identifiant_comment]['id_user'];
 
				//si c'est pas son message
				if (Fsb::$session->id() != $id_user )
				{
					//il peut citer
					if(!$cite)
					{
						//si il à déjà cité le message, on ne lui laisse pas quoter une seconde fois
						$racine = $_SERVER['DOCUMENT_ROOT'];
						include ($racine.'/inclusion/connect_pdo.php');
						$sql_unique = $bdd->prepare('SELECT * from comment where message_cite IN(select id from comment) and message_cite = ?');
						$sql_unique->execute(array($id));
						$tab_unique = $sql_unique->fetch();
 
						$message_unique = $tab_unique['message_cite'];
						if($message_unique == $id_message_cite)
						{
							echo' <a href="/php/commentaires/moi/rediger_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'&amp;commentaire_cite='.$identifiant_comment.'';
 
							if($type_balade == 0 OR $type_balade == 1)
							{
								echo'&amp;type_balade='.$type_balade.'';
							}
							echo' " title="Citer le commentaire" target="_self"><img src="/php/commentaires/images/quote.gif" title="Citer le commentaire"></a>';	
						}
 
					}	
				}
 
				//c'est son message
				if (Fsb::$session->id() == $id_user OR Fsb::$session->data['u_auth'] == 5 OR Fsb::$session->data['u_auth'] == 4 )
				{
					//rien dans les messages cités
					if(!$cite)
					{	
						//suppresion ok
						echo' <a href="/php/commentaires/moi/liste_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'';
 
						if($type_balade == 0 OR $type_balade == 1)
						{
							echo'&amp;type_balade='.$type_balade.'';
						}
						echo'&amp;id_com_a_supprimer='.$identifiant_comment.'';
 
						if(!empty($id_message_cite))
						{
							echo'&amp;commentaire_cite='. $id_message_cite .'';
						}
						echo'" title="Supprimer le commentaire" target="_self" onclick="return confirm(\'Etes vous sur de vouloir supprimer ce commentaire ?\');"><img src="/php/commentaires/images/delete.gif" title="Supprimer le commentaire"></a>';
 
						//editer le commentaire
						echo' <a href="/php/commentaires/moi/rediger_commentaires.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'';
						if($type_balade == 0 OR $type_balade == 1)
						{
							echo'&amp;type_balade='.$type_balade.'';
						}
						//si modif, on passe l'id message qui à été cité si il y en a
						if(!empty($id_message_cite))
						{
							echo'&amp;commentaire_cite='. $id_message_cite .'';
						}
 
						echo'&amp;id_message_a_editer='.$identifiant_comment.'" title="Editer le commentaire" target="_self"><img src="/php/commentaires/images/edit.gif" title="Editer le commentaire"></a>';
					}
				}	
			}
 
			echo'</span>';	
			echo'</div>';
 
			//recursive si c'est un message cité
			if (!empty($id_message_cite))
			{
				echo'<blockquote class="cadre_forum">';
				echo '<div class="citer">';
 
					afficher_commentaire($id_message_cite, $array_commentaire, true);
 
				echo '</div>';				
				echo'</blockquote><br />';
			}
 
			echo $contenu;
			echo'<p class="spacer"></p>';
 
			echo'<span class="poste_par">';
			echo'Posté le '.date('d/m/Y à H\hi',$timestamp). ' par <strong>'.$pseudo.' </strong>';  
			echo'</span>';
		}
		//fin fonction
 
		//on lance la fonction
		foreach ($array_commentaire as $id => $value)
		{
			afficher_commentaire($id,$array_commentaire);
		}

Par avance un grand merci à qui saura m'aider
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h17   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Hello

Je suis en train de faire un module de blog pour mon framework. Si tu veux, je te filerai quelques sources du module pour que tu te fasse un idée (je devrais avoir fini entre aujourd'hui et demain). Ce sera en Objet mais dans ce cas de figure (aggrégation d'articles et de commentaires) c'est la solution la plus appropriée.

N'hésite pas à me PM pour en savoir plus ou savoir où j'en suis sinon je risque de t'oublier.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h20   #3
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Hello,

C'est gentil merci, mais n'hésite pas à me corriger aussi sur ce morceau de code ;-)

heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h34   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Je n'arrive pas à rentrer dans ton algorithme, je pense que beaucoup de chose inutiles peuvent être retirées mais pour ça je dois voir ton schéma de tables.

Tu peux me passer les tables ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h02   #5
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Tu veux des backup ou juste la structure ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h09   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
La structure.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h14   #7
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
La voici :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 
-- Structure de la table `comment`
-- 
 
CREATE TABLE `comment` (
  `id` bigint(20) NOT NULL auto_increment,
  `titre` text collate latin1_german2_ci NOT NULL,
  `contenu` text collate latin1_german2_ci NOT NULL,
  `pseudo` varchar(20) collate latin1_german2_ci NOT NULL,
  `timestamp` bigint(20) NOT NULL,
  `identifiant_comment` bigint(20) NOT NULL,
  `type_comment` bigint(20) NOT NULL,
  `type_balade` bigint(20) NOT NULL,
  `id_user` int(11) NOT NULL,
  `message_cite` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=305 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=305 ;
peut-être te faudrait-il le fichier pour rédiger et le fichier de traitement en entier pour cerner le tout ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h55   #8
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bon finalement, ça fonctionne à peu près maintenant. (cf ici)


J'aimerais faire en sorte de ne pas laisser à l'utilisateur le pouvoir de citer deux fois le même message.


ça ce joue ici :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
 
//si connecté
			if (Fsb::$session->is_logged())
			{
				$id_user = $array_commentaire[$identifiant_comment]['id_user'];
 
				//si c'est pas son message
				if($id_user != Fsb::$session->id())
				{
					//essayer de trouver pour interdire de citer deux fois le même message
if(????)
					if(!$cite)
					{
						echo' <a href="/php/commentaires/moi/rediger_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'&amp;commentaire_cite='.$identifiant_comment.'';
 
						if($type_balade == 0 OR $type_balade == 1)
						{
							echo'&amp;type_balade='.$type_balade.'';
						}
						echo' " title="Citer le commentaire" target="_self"><img src="/php/commentaires/images/quote.gif" title="Citer le commentaire"></a>';	
					}
 
				}
			}
une idée ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h05   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Voici ce à quoi ça peut ressembler:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
 
function load_comment ($id, PDO $bdd) {
    $query = "SELECT * FROM `comment` where `id`=:id OR `message_cite`=:id";
    $stmt = $bdd->prepare($query);
 
    if (!$stmt->execute(array(':id' => $id)))
        return false;
 
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $comment = array('children' => array());
    foreach ($stmt as $row) {
        if ($row['id'] == $id) {
            $comment += $row;
        }
        else {
            // si on veut réccupérer l'arbre entier on a pas tellement le choix...
            $comment['children'][] = load_comment($row['id']);
        }
    }
 
    return $comment;
}
 
function display_comment ($comment) {
    $buffer = 
    	"<div class=\"comment\">".
        "<h2>{$comment['titre']}</h2>".
        "<p>{$comment['contenu']}</p>";
 
    foreach ($comment['children'] as $child_comment) {
        $buffer .= display_comment($child_comment);
    }
    return $buffer .= "</div>";
}
 
 
// ce serait mieux de savoir ou on se situe à ce niveau...
$racine = $_SERVER['DOCUMENT_ROOT'];
include ($racine.'/inclusion/connect_pdo.php');
 
if (isset($_GET['comment_id'])) {
    if ($comment = load_comment($_GET['comment_id'], $bdd)) {
        echo display_comment($comment);
    }
    else {
        echo "Je me suis vautré en chargeant les commentaires...";
    }
}
else {
    echo "Y'a pas de commentaire à afficher...";
}
Pour l'affichage en cascade, un regle CSS toute simpel peut faire l'affaire:
Code :
1
2
3
4
 
.comment > .comment {
  margin-left: 20px;
}
A toi de peaufiner
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h59   #10
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Ouille ouille ouille ! Pourrais-tu un peu expliquer ? Parce qu'après une lecture intensive, je ne suis pas sûr de pouvoir adapter à mon fichier existant.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 20h37   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
La seule chose à adapter là dedans c'est la fonction display_comment pour qu'elle formatte correctement un commentaire pour l'affichage.

La fonction load_comment va chercher un commentaire en base de données et va créér l'arbre des commentaires associés à celui-ci (réccursivement).
La fonction display_comment va ensuite lire cet arbre et le transformer en flux xhtml le plus simplement du monde.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 19h09   #12
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonsoir,

Je reviens à l'assaut à propos de ton code Benjamin.

En effet, j'ai revu ma modélisation et re-développe complétement mon site Internet.

Ceci implique donc la modification du code de listing recursif des commentaires et des commentaires commentés.

Pourrais-tu s'il te plaît m'aider à adapter les fonctions qui tu avais produites il y a quelques mois.

Ci-joint, tu trouvera le MPD de ma base de données :




Si tu as des questions, n'hésite pas !

Un très grand merci pour ton aide.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 10h10   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
J'ai une question: c'est quoi ton logiciel de modélisation ? Je ne le connais pas celui-ci, personnellement j'utilise MySQL WorkBench

Juste une chose, tu connais la POO en PHP ? ça te serait sacrément utile dans ton cas
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 21h57   #14
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonsoir,

Citation:
J'ai une question: c'est quoi ton logiciel de modélisation ? Je ne le connais pas celui-ci, personnellement j'utilise MySQL WorkBench
L'outil de modélisation c'est powerAMC. Gratuit pendant 1 mois.

Citation:
Juste une chose, tu connais la POO en PHP ? ça te serait sacrément utile dans ton cas

Oui je connais mais je n'ai pas eu encore le courage de m'y mettre. J'ai la bible du php 5 avancé sur ma table de chevet. Ca va venir petit à petit même si j'ai des difficultés à conceptualiser la chose.

Pour l'instant, je fais tout sans POO et ça me va assez bien. Ce sera pour un partir-en-vtt V4 que je passerai en POO

Par-contre, je suis bien passé en PDO pour mes requêtes .
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h24   #15
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Passer tes modèles en Objet n'est pas bien compliqué.

Voici quelques classes qui pourraient grandement t'aider:
- https://github.com/bdelespierre/php-...base.class.php
- https://github.com/bdelespierre/php-...ator.class.php
- https://github.com/bdelespierre/php-...odel.class.php
- https://github.com/bdelespierre/php-...ject.class.php

Une fois installées, c'est vraiment simple de faire des modèles CRUD. Exemple avec la classe article de ton modèle de données:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
class Article extends MySQLObject {
 
  public function __construct ($id = null) {
    parent::__construct('Article', $id);
  }
 
  public static function getArticles (array $search_params = array(), array $options = array()) {
    return parent::all('Article', $search_params, $options, new self);
  }
 
  public function getComments () {
    if (empty($this->_data))
       return false;
    return Comment::getComments(array('id_article' => $this->id));
  }
 
  // autres méthodes utiles
 
}
Et pour l’utiliser:
Code :
1
2
3
4
5
6
7
8
9
10
<?php
 
$article = new Article(123);
$article->body = "Un corp d'article...";
$article->update();
 
// voir des commentaires
foreach ($article->getComments() as $comment) {
  echo $comment->body;
}
ça te dis d'aller dans cette voie ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h10   #16
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Citation:
Envoyé par Benjamin Delespierre Voir le message
Passer tes modèles en Objet n'est pas bien compliqué.

Voici quelques classes qui pourraient grandement t'aider:
- https://github.com/bdelespierre/php-...base.class.php
- https://github.com/bdelespierre/php-...ator.class.php
- https://github.com/bdelespierre/php-...odel.class.php
- https://github.com/bdelespierre/php-...ject.class.php

Une fois installées, c'est vraiment simple de faire des modèles CRUD. Exemple avec la classe article de ton modèle de données:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
class Article extends MySQLObject {
 
  public function __construct ($id = null) {
    parent::__construct('Article', $id);
  }
 
  public static function getArticles (array $search_params = array(), array $options = array()) {
    return parent::all('Article', $search_params, $options, new self);
  }
 
  public function getComments () {
    if (empty($this->_data))
       return false;
    return Comment::getComments(array('id_article' => $this->id));
  }
 
  // autres méthodes utiles
 
}
Et pour l’utiliser:
Code :
1
2
3
4
5
6
7
8
9
10
<?php
 
$article = new Article(123);
$article->body = "Un corp d'article...";
$article->update();
 
// voir des commentaires
foreach ($article->getComments() as $comment) {
  echo $comment->body;
}
ça te dis d'aller dans cette voie ?
Salut,

Merci pour la proposition, c'est sûr que c'est intéressant, puissant, évolutif.

Maintenant, je pense quelques mois de plus me seront nécessaires pour me lancer dans un tel système. Je me concentre sur le re-développemment de l’entièreté de mon site et c'est assez urgent.

Je préfère donc dans un premier temps mettre en ligne la nouvelle mouture puis la stabiliser et y apporter des nouveautés.

Ensuite, je passerai à la POO car c'est à coup sûr l'avenir de PHP

Sinon, concernant cet partie ajout de commentaires tu peux me filer un coup de main ?

Merci encore.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h30   #17
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Alors tu peux me rappeler ce qu'il te manque exactement et ce que tu veux arriver à faire ?

Au passage donne-moi une version SQL de ton Schéma.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h46   #18
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Ce que je souhaite faire, c'est avoir une fonction capable de recréer l'arbre des commentaires par article.

Un commentaire peut être commenté et un commentaire qui commentait peut être commenté (récursivité).

Niveau affichage HTML, il faut donc être en mesure d'afficher cet arbre via la balise blockquote.

Ci-joint, la partie SQL du MPD

Un grand merci pour le coup de main
Fichiers attachés
Type de fichier : sql crebas.sql (4,0 Ko, 3 affichages)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 12h59   #19
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Sans avoir testé voici ce à quoi ça peut ressembler:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
 
/**
 * Get all comments attached to an article
 *
 * @param PDO $pdo                The database connection
 * @param integer $id             The article ID
 * @param array $search_params    [optionnal] Additionnal search parameters 
 * @param array $options          [optionnal] Additionnal query optiopns (GROUP BY and/or LIMIT)
 * @throws InvalidArgumentException
 * @throws RuntimeException
 * @return array
 */
function get_article_comments (PDO $pdo, $id, array $search_params = array(), array $options = array()) {
	// Parameters validation
	if ($pdo === null)
		throw new InvalidArgumentException("First parameter is expected to be a valid PDO ressource object, null given");
 
	if ($id === null)
		throw new InvalidArgumentException("Second parameters is expected to be a valid Article ID, null given");
 
	// Fetch Comments Query Generation
	$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
			 "FROM pevtt_commentaire AS c ".
			 "JOIN pevtt_commentaire_article AS ca ON (ca.`id_commentaire`=c.`id_commentaire`)".
 
	// Where Clause Construction
	$where_clause = array('id_article' => $id);
	foreach ($search_params as $field => $search_value) {
		$where_clause[] = "`{$field}`=:{$field}";
	}
 
	$query .= " WHERE " . implode(" AND ", $where_clause);
 
	// Query Options (only ORDER BY and GROUP BY)
	if (!empty($options)) {
		if (isset($options['ORDER BY']))
			$query .= " ORDER BY `{$options['ORDER BY']}`";
		if (isset($options['LIMIT'])) {
			if (is_scalar($options['LIMIT']) && $options['LIMIT'])
				$query .= " LIMIT {$option['LIMIT']}";
			if (is_array($options['LIMIT']))
				$query .= " LIMIT " . implode(',', $options['LIMIT']);
		}
	}
 
	// Prepare
	$stmt = $pdo->prepare($query);
 
	// Execute
	if (!$stmt->execute($search_params))
		throw new RuntimeException("Error with query: {$query}");
 
	$comments = array();
	while ($comment = $stmt->fetch(PDO::FETCH_ASSOC)) {
		try {
			// here the magic occurs !
			$comment['children'] = get_child_comments($pdo, $comment['id_commentaire']);
		}
		catch (Exception $e) {
			$comment['children'] = null;
			trigger_error("Unable to retrieve child comments for {$comment['id_commentaire']}. Reason: {$e->getMessage()}");
		}
		$comments[] = $comment;
	}
 
	return $comments;
}
 
/**
 * Get all children of a given comment
 *
 * Note: if the depth parameter is greater than 1
 *       it will retrieve the children until the
 *       max depth is reached.
 * 
 * @param PDO $pdo              The database connection object
 * @param integer $parent_id    The parent comment id
 * @param integer $depth        [optionnal] The max depth to reach
 * @throws InvalidArguemntException
 * @throws RuntimeException
 * @return array
 */
function get_child_comments (PDO $pdo, $parent_id, $depth = 10) {
	// Do not go deeper than orignal depth parameter value
	// Prevents an infinite reccursivity
	if ($depth == 0)
		return null;
 
	// Parameters Validation
	if ($parent_id === null)
		throw new InvalidArgumentException("Second parameter is expected to be integer, null given");
 
	// Query Generation
	$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
			 "FROM pevtt_commentaire AS c ".
			 "JOIN pevtt_commentaire_commente AS cc ON (cc.id_commented=c.id_commentaire) ".
			 "WHERE cc.id_commentant=:parent_id";
 
	// Query Execution
	$stmt = $pdo->prepare($query);
	if (!$stmt->execute(array('parent_id' => $parent_id))
		throw new RuntimeException("Error with query: $query");
 
	// No Children Found
	if (!$stmt->rowCount())
		return null;
 
	// Fetch children's children (Inception Coding-Style duh...)
	$children = array();
	while ($child = $stmt->fetch(PDO::FETCH_ASSOC)) {
		try {
			$child['children'] = get_child_comments($child['id_commentaire'], $depth-1);
		}
		catch (Exception $e) {
			$child['children'] = null;
			trigger_error("Unable to retrieve child comments for {$child['id_commentaire']}. Reason: {$e->getMessage()}");
		}
		$children[] = $child;
	}
 
	return $children;
}
ça doit génerer un arbre avec pour chaque commentaire un index "children" qui contiens soit null (aucun enfant) soit un tableau avec les enfants (qui eux mêmes ont des enfants etc.)

Si on avait fait ça en objet on aurait pu mettre en cache les statements mais là, à moins de les coller dans GLOBALS je vois pas bien comment faire...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 13h26   #20
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Tu codes plus vite que ton ombre !

J'ai essayé de comprendre un peu le fonctionnement, sans trop de résultat.

Pourrais-tu m'expliquer les grandes composantes et aussi comment utiliser l'ensemble par exemple pour l'article N°1, paramètre que je récupère via un $_GET['id_article'].

Aussi, comment modifier la chose pour que les fonctions utilises ma connexion PDO.
Sachant que je me connecte de cette façon :

Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
	try
	{
		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
		$bdd = new PDO('mysql:host=host;dbname=name', 'user', 'password.', $pdo_options);
	}
	catch (Exception $e)
	{
			die('Erreur : ' . $e->getMessage());
	}
?>
Par avance, merci.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h39.


 
 
 
 
Partenaires

Hébergement Web