Forum avec pdo
Résolu
ClR555
-
theshadoo Messages postés 786 Date d'inscription Statut Membre Dernière intervention -
theshadoo Messages postés 786 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Depuis quelques jours j'essaie de réaliser un petit forum sur mon site avec pdo. Je m'arrache les cheveux.
je n'y arrive pas du tout. J'aurais besoin d'une méthode, d'une logique fiable à suivre car je m'emmêle vraiment les pinceaux.
Je vous montre ce que j'ai fait afin que vous puissiez peut-être me mettre sur la voie. J'ai plein d'erreurs que je ne comprends pas et que je ne parviens pas à corriger.
(du type, entre autres, "Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near" ), dès que j'essaie de poster, modifier...
l'affichage se fait bien mais je doute de l'organisation globale de la page. Si vous avez des conseils, des pistes, des méthodes... je vous en remercie d'avance
forum.php
Depuis quelques jours j'essaie de réaliser un petit forum sur mon site avec pdo. Je m'arrache les cheveux.
je n'y arrive pas du tout. J'aurais besoin d'une méthode, d'une logique fiable à suivre car je m'emmêle vraiment les pinceaux.
Je vous montre ce que j'ai fait afin que vous puissiez peut-être me mettre sur la voie. J'ai plein d'erreurs que je ne comprends pas et que je ne parviens pas à corriger.
(du type, entre autres, "Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near" ), dès que j'essaie de poster, modifier...
l'affichage se fait bien mais je doute de l'organisation globale de la page. Si vous avez des conseils, des pistes, des méthodes... je vous en remercie d'avance
forum.php
<?php //VARIABLE DE SESSION DE CONNEXION require_once ('acces.php'); if (!isset($u_acces)) { header('location:./index.php'); } else { //SI ON FAIT UNE DEMANDE DE MODIF (ouvre fenêtre du formulaire) if(isset($_GET['mod_no']) && !empty ($_GET['mod_no'])) { $msg_id=$_GET['mod_no']; //$sup_id est plus vide $sup_id='<input type="hidden" name="msg_id" value="'.$msg_id.'">'; //req pour récup les msg $rq_msg=$connexion->prepare('SELECT * FROM messages WHERE msg_id = '.$msg_id); $rq_msg->execute(); $rs_msg = $rq_msg->fetch(PDO::FETCH_OBJ); $msg_texte=$rs_msg->msg_txt; $msg_date=$rs_msg->msg_date; $msg_modif_der=$rs_msg->msg_modif_der; $style_none="display:block"; } //SINON SI ON A CLIQUE SUR VALIDER LE MESSAGE elseif(isset($_POST['submit_form'])) { //VERIF QUE LES CHAMPS EXISTENT $msg_texte=$_POST['msg_txt']; $msg_exp=$_POST['u_id']; //SI CHAMP MESSAGE VIDE, MSG ERREUR if (empty ($msg_texte)) { $result_crea_msg='<p class="msg_erreur">Vous n\'avez posté aucun contenu. <br/>Aucun enregistrement n\'a été soumis. <br/>Rédigez un texte si vous souhaitez envoyer un message </p>'; } //SINON TTT DES CHAMPS else { $msg_id=$_POST['msg_id']; $msg_exp=$_POST['u_id']; //si on n'est pas le créateur : msg_exp (créateur msg) != u_id (connecté) if ($u_id != $msg_exp) { $result_crea_msg='<p class="msg_erreur">Vous tentez de modifier un message qui ne vous appartient pas.</p>'; } //sinon (créateur msg) == u_id (connecté) else { //SI ID EXISTE EST UN CHIFFRE numérique= MODIF POUR MISE A JOUR MSG if(isset($msg_id) && is_numeric($msg_id)) { //SI MESSAGE IDENTIQUE DU MEME EXP EXISTE DANS LA BASE $reponse = $connexion->prepare("SELECT COUNT(*) AS nbr FROM messages WHERE msg_txt='$msg_texte' AND msg_exp='$msg_exp'"); $reponse->execute(); $donnees = $reponse->fetch(); $totalDesMessages = $donnees['nbr']; if (isset($totalDesMessages)AND($totalDesMessages >=1)) { $result_crea_msg='<p class="msg_erreur">Ce message a déjà été enregistré, et il n\'est pas autorisé de poster plusieurs fois un message strictement identique. <br/>Votre message n\'a pas été validé. </p>'; } //sinon message existe pas encore else { $msg_modif_der=time(); $data = array( 'msg_id'=> $msg_id, 'msg_modif_der'=> $msg_modif_der, 'msg_txt' => $msg_texte ); $sql = 'UPDATE messages SET msg_txt=:msg_txt, msg_modif_der=:msg_modif_der WHERE msg_id=:msg_id'; } } //SINON NEW MSG { $data = array( 'msg_exp' => $msg_exp, 'msg_txt' => $msg_texte ); $sql = 'INSERT INTO messages(msg_exp, msg_txt, msg_date) VALUES(:msg_exp, :msg_txt, :NOW())'; } try { $req = $connexion->prepare($sql); // requete en fonction du choix ajout ou modif $req->execute($data); // donnée en conséquence $result_crea_msg= '<p class="msg_ok">Enregistrement ajouté !</p>'; // Deconnexion de la base de donnees $msg_texte=''; } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } } } } //SINON ON A RIEN CLIQUE (ARRIVEE SUR LE SITE) else { //txt du msg à poster vide $msg_texte=''; //style du msg : message fermé $style_none="display:none"; } //AFFICHAGE DES MESSAGES //cpte nbr total de résultats ds req et calcule nbr de page $nombreDeMessagesParPage = 5; $reponse = $connexion->prepare('SELECT COUNT(*) AS nbr FROM messages' ); $reponse->execute(); $donnees = $reponse->fetch(); $totalDesMessages = $donnees['nbr']; //si nbr total des messages supérieurs à 0 if($totalDesMessages>0) { try { $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } if(!isset($_GET['l'])) $_GET['l']=10; if(!isset($_GET['d'])) $_GET['d']=0; $d = $_GET['d'];//1er msg $l = $_GET['l'];//nbr msg/p $d1 = '&d='.$d; $l1 = '&d='.$l; // la requete : $rq_cpt_mess=$connexion->query('SELECT COUNT(*) AS nbr FROM messages' ); $rq_cpt_mess->execute(); $rq_cpt_mess=$rq_cpt_mess->fetch(); $nb_total=$rq_cpt_mess['nbr']; $suiv=$d+$l; //pagination : $pagination= '<table width="180px" cellspacing="0" cellpadding="2" border="0" class="mini" align="center"><tr><td width="33%" nowrap="nowrap" align="left" valign="bottom">'; $debut=$d-$l; if($debut<0) $debut=0; if($d>0) { $pagination.= '<a href="?d=0&l='.$l.'" alt="première page" title="première page"><img src="images/left.png" width="9" height="16" hspace="0" border="0" /><img src="images/left.png" width="9" height="16" hspace="0" border="0" /></a>'; $pagination.= '<a href="?d='.$debut.'&l='.$l.'"><img src="images/left.png" width="9" height="16" hspace="10" alt="page précédente" title="page précédente" border="0" /></a>'; } $pagination.= '</td><td width="33%" nowrap="nowrap" align="center" valign="middle">page '; $pagination.= (ceil($d/$l)+1).'/'.(ceil($nb_total/$l)); $pagination.= '</td><td width="33%" nowrap="nowrap" align="right" valign="bottom">'; if($suiv<$nb_total) { $pagination.= '<a href="?d='.$suiv.'&l='.$l.'"><img src="images/right.png" width="9" height="16" hspace="10" alt="page suivante" title="page suivante" border="0" /></a>'; $nbr_page=ceil($nb_total/$l); $dernier_msg_page=$l*($nbr_page-1) ; $pagination.= '<a href="?d='.$dernier_msg_page.'&l='.$l.'" alt="dernière page" title="dernière page"><img src="images/right.png" width="9" height="16" hspace="0" border="0" /><img src="images/right.png" width="9" height="16" hspace="0" border="0" /></a>'; } $pagination.='</td></tr></table>'; //req pour récup les msg $req_aff_mess=$connexion->prepare('SELECT * FROM messages,utilisateurs WHERE u_id = msg_exp ORDER BY msg_date DESC LIMIT '.$_GET['d'].','.$_GET['l'] ); $req_aff_mess->execute(); //tous les messages $msg='<div class="messages">'; while ($rs_aff_mess = $req_aff_mess->fetch()) { //TRAITEMENT INFOS DE LA BDD $msg_id=$rs_aff_mess['msg_id']; $exp_id=$rs_aff_mess['u_id']; $expediteur=$rs_aff_mess['u_nom']; $msg_txt=$rs_aff_mess['msg_txt']; $date_edition=$rs_aff_mess['msg_date']; $date_edit=date("d/m/Y \à H\hi",strtotime($date_edition)); $date_edit='le '.$date_edit; if (isset($rs_aff_mess['msg_modif_der'])&& !empty($rs_aff_mess['msg_modif_der']) && $rs_aff_mess['msg_modif_der']!=0) { $date_reedition=$rs_aff_mess['msg_modif_der']; $date_reedit=date("d/m/Y \à H\hi",strtotime($date_reedition)); $date_edit=$date_edit.' (Edité le '.$date_reedit.')'; } $date_edit='<span class="msg_h_date">'.$date_edit.'</span>'; if ($u_id == $exp_id) { $date_edit.='<a href="forum.php?mod_no='.$msg_id.$d1.$l1.'" title="Modifier mon message" alt="Modifier mon message" class="modif"><div class="btn_modif"> </div></a>'; } /* --------------------affichage---------------- */ $msg.= '<div class="msg"> <div class="titre_msg"> <h5 class="msg_exp">'.$expediteur.'</h5>'.$date_edit.' </div> <div class="msg_contenu"> '.$msg_txt.' </div> </div>'; } $req_aff_mess->closeCursor(); $msg.='</div>'; } //sinon 0 messages else { $msg='<p class="msg_erreur"> Aucun enregistrement de message n\'existe dans le forum.</p>'; } //CONNECTED PEOPLE //renvoit $connectes include('nbr_user_connectes.php'); //EN-TETE require_once ('head.php'); //CONTENU ?> <h2>Forum</h2> <a class="new_msg_lien" href="javascript:visibilite('new_msg_form');" title="Laissez un message sur le mini forum du site !" alt="Laissez un message sur le mini forum du site !"> <h4>Postez un message...</h4> </a> <div id="new_msg_form" style="<?php echo $style_none; ?>"> <form method="post" action="forum.php<?php if (isset($_GET['d'])) {echo '?d='.$_GET['d'];} if (isset($_GET['l'])) {echo '&l='.$_GET['l'];} ?>"> <textarea name="msg_txt" rows="15" cols="40" style="width: 700px"> <?php echo $msg_texte; ?> </textarea> <input type="hidden" name="u_id" value="<?php echo $u_id ;?>"/> <?php if (isset ($_GET['mod_no'])) { ?> <input type="hidden" name="msg_id" value="<?php echo $msg_id ;?>" /> <?php } ?> <input type="submit" name="submit_form" value="Valider" style="margin-top:2px;"/> <input type="reset" name="reset" value="Rétablir" style="margin-top:2px;"/> </form> </div> <script type="text/javascript"> if (document.location.protocol == 'file:') { alert("The examples might not work properly on the local file system due to security settings in your browser. Please use a real webserver."); } </script> <?php if (isset ($result_crea_msg)) echo '<div class="resultat_creation"><h4>Rapport d\'erreurs</h4>'.$result_crea_msg.'</div>'; echo '<div>'.$pagination.'</div>' ; ?> <div class="msg_bloc"> <?php echo $msg ;?> </div> <div class="connected_people"> <?php echo $connectes ;?> </div> <?php //PIED DE PAGE require_once ('footer.php'); } ?>
2 réponses
Que tu utilises la class PDO ou bien du procédural avec des requêtes mysql, l'organisation n'est en rien différente ....
Cela n'a rien avoir avec comment s'organiser avec pdo, si après tu as des erreurs sql c'est autres choses.
une piste : Créer des fonctions de tes requêtes en PDO et place tes fichiers dans un dossier précis, comme ca lorsque tu as besoin tu appelles tes fonctions PDO si besoin.
L'organisation d'un site dynamique est l'une des choses les plus importantes il est vrai.
Cela n'a rien avoir avec comment s'organiser avec pdo, si après tu as des erreurs sql c'est autres choses.
une piste : Créer des fonctions de tes requêtes en PDO et place tes fichiers dans un dossier précis, comme ca lorsque tu as besoin tu appelles tes fonctions PDO si besoin.
L'organisation d'un site dynamique est l'une des choses les plus importantes il est vrai.
Bonjour,
N'ayant pas eut de réponse, j'ai fait ce que j'ai pu en reprenant pas à pas, mais sans réussir à mettre comme il faut mes requetes dans des fonctions.
En revanche tout est presque enfin fonctionnel... :) :) :)
il ne reste qu'une chose :
Updater mes messages...
la commande sql marche seule dans php myAdmin, mais dans mon code, j'ai une erreur du type :
"Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\wamp\www\Maroc\forum_reno.php:70 Stack trace: #0 C:\wamp\www\Maroc\forum_reno.php(70): PDOStatement->execute() #1 {main} thrown in C:\wamp\www\forum_reno.php on line 70"
Il me dit que le nombre de variables données n'est pas le bon... et pourtant...(voyez par vous même...)
Voici mon morceau de code qui coince (souligné et en gras).
Quelqu'un aurait-il une idée?
N'ayant pas eut de réponse, j'ai fait ce que j'ai pu en reprenant pas à pas, mais sans réussir à mettre comme il faut mes requetes dans des fonctions.
En revanche tout est presque enfin fonctionnel... :) :) :)
il ne reste qu'une chose :
Updater mes messages...
la commande sql marche seule dans php myAdmin, mais dans mon code, j'ai une erreur du type :
"Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\wamp\www\Maroc\forum_reno.php:70 Stack trace: #0 C:\wamp\www\Maroc\forum_reno.php(70): PDOStatement->execute() #1 {main} thrown in C:\wamp\www\forum_reno.php on line 70"
Il me dit que le nombre de variables données n'est pas le bon... et pourtant...(voyez par vous même...)
Voici mon morceau de code qui coince (souligné et en gras).
Quelqu'un aurait-il une idée?
$msg_id=$_POST['msg_id']; //SI ENVOI ID PAR POST == MODIF if(!empty($_POST['msg_id'])) { //SI ID de MSG, de MSG_EXP, existe bien $rq_msg_id=$connexion->prepare('SELECT COUNT(msg_txt) AS nbr_id_itou FROM messages WHERE msg_exp = :msg_exp AND msg_id = :msg_id'); $rq_msg_id->bindParam(':msg_exp', $msg_exp, PDO::PARAM_INT); $rq_msg_id->bindParam(':msg_id', $msg_texte, PDO::PARAM_INT); $rq_msg_id->execute(); if ($rs_msg_id = $rq_msg_id->fetch()) { if($rs_msg_id['nbr_id_itou']==1) { //req pour modif les msg $data = array( 'msg_id'=> $msg_id, 'msg_txt' => $msg_texte ); $sql = 'UPDATE messages SET msg_txt = :msg_txt, msg_modif_der = NOW() WHERE msg_id = :msg_id'; } //SINON ID INCONNU else { $result_crea_msg='<p class="msg_erreur">Le message identifié n\'est pas enregistré dans la base de données. <br/>Si vous validez un message, il sera considéré comme votre nouveau message. <br/>Pour plus d\'informations, consultez la page d\'aide à l\'utilisation du site. </p>'; $msg_id=''; } } } //SINON PAS D'ID == NOUVEAU MESSAGE else { $data = array( 'msg_exp' => $msg_exp, 'msg_txt' => $msg_texte ); $sql = 'INSERT INTO messages(msg_id, msg_exp, msg_txt, msg_date, msg_modif_der) VALUES(NULL, :msg_exp, :msg_txt, NOW(), NULL)'; } //REQUETE SELON RESULTATS try { $req = $connexion->prepare($sql); // requete en fonction du choix ajout ou modif $req->execute($data); // donnée en conséquence $result_crea_msg= '<p class="msg_ok">Enregistrement ajouté !</p>'; $msg_texte=''; } catch(Exception $e) { die('Erreur : '.$e->getMessage()); }
En fait il faut de base structurer son site :
voilà comment je procède mais j'ai plusieurs autre façon de faire c'est un exemple
- admin
- core (ce sont mes librairies de fonctions quand je code en procédurale mais tu peux le nommer comme tu veux, lib, library etc...)
- www /
- images
- javascript
- css
- configuration.php (fichier comportant toutes la configue du site pour se connecter à la bdd)
- index.php (c'est dans ce fichier que je vais mettre tout le code qui va me permettre d'inclure mon fichier de configuration, mes fichiers de fonction
ex:
require_once('/core/ajout.sql.php'); ...
et aussi il va me permettre d'appeler les pages de mon theme qui se trouvent dans www/ en fonctione de l'url
voilà comment je procède mais j'ai plusieurs autre façon de faire c'est un exemple
- admin
- core (ce sont mes librairies de fonctions quand je code en procédurale mais tu peux le nommer comme tu veux, lib, library etc...)
- www /
- images
- javascript
- css
- configuration.php (fichier comportant toutes la configue du site pour se connecter à la bdd)
- index.php (c'est dans ce fichier que je vais mettre tout le code qui va me permettre d'inclure mon fichier de configuration, mes fichiers de fonction
ex:
require_once('/core/ajout.sql.php'); ...
et aussi il va me permettre d'appeler les pages de mon theme qui se trouvent dans www/ en fonctione de l'url
Je crois que j'éprouve des soucis aussi lorsque j'utilise mes variables, entre le exec() et le execute et puis j'ai du mal à me servir des requetes préparées, dont je ne me sers qu'une fois au final... la pagaille quoi. je vais reprendre donc.
Une petite question supplémentaire quand même au sujet de ton conseil:
" une piste : Créer des fonctions de tes requêtes en PDO et place tes fichiers dans un dossier précis, comme ca lorsque tu as besoin tu appelles tes fonctions PDO si besoin. "
C'est à ça que tu penses?
fonctions > pdo > select.php
Juste pour savoir si je pars dans la bonne direction... ; )
Sinon, on m'a dit que comme pdo était une classe, il ne fallait pas l'utiliser dans des fonctions, pour ne pas faire des fonctions de fonctions (c'est ce que j'avais initialement fait pour la pagination). Voilà, je voulais savoir ce que tu en pensais...
Merci de ton temps.
Tous les conseils sont évidemment les bienvenus, je rame pas mal...
Merci encore, et bonne soirée à tous
Il y a quelques autres façons de faire aussi mais si tu veux le faire d'une façon simple, si tu n'es pas sur un trop gros projet en php tu peux faire comme cela :
un dossier où tu auras toutes tes fonctions :
-bibliotheque
- ajout.sql.php
- suppr.sql.php
- edit.sql.php
- select.sql.php
- pagination.php
- ....
tu vois le genre. le but est de pouvoir y accéder de n'importe où l'on en aura besoin tant dans le backoffice que le frontoffice
j'espère t'avoir aidé