Forum avec pdo

Résolu/Fermé
ClR555 - Modifié par ClR555 le 10/04/2011 à 01:05
theshadoo Messages postés 786 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 3 mai 2016 - 12 avril 2011 à 00:36
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
<?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

theshadoo Messages postés 786 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 3 mai 2016 123
10 avril 2011 à 12:27
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.
3
Bonsoir et merci de tes recommandations.
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?

require ('fonctions/pdo/select.php'); 
select_table_messages(); 
echo $msg_id; 


fonctions > pdo > select.php
function select_table_messages 
{ 
$req_aff_mess=$connexion->prepare('SELECT * FROM messages'); 
$req_aff_mess->execute();  
 while ($rs_aff_mess = $req_aff_mess->fetch())  
   { 
   $msg_id=$rs_aff_mess['msg_id'];  
   } 
return; 
} 


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
0
theshadoo Messages postés 786 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 3 mai 2016 123
11 avril 2011 à 19:10
oui c'est exact, c'est à ca que je pense. Si tu utilises beaucoup la poo et donc des class, tu peux utiliser la fonction __autoload qui permet de chargement automatiquement des class selon le besoin, si non pour des fichiers de fonction il vaut mieux segmenter et les rassembler dans un seul dossier.

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é
0
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?
$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()); 
} 
0
theshadoo Messages postés 786 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 3 mai 2016 123
11 avril 2011 à 19:19
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
0
Impec, j'ai suivi tes conseils. c'est bien proppre, ça marche niquel. J'ai une seule page d'affichage du coup. Bien bien. je passe mes pages en fonction de variables et puis je fais un switch avec des case et ça roule.
Merci de tes conseils
0
theshadoo Messages postés 786 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 3 mai 2016 123
12 avril 2011 à 00:36
no problems j'aurais aimé que l'on me dise cela quand j'ai débuté en php à l'époque alors autant faire gagner du temps à d'autres
0