PHP

Messagerie interne

Résolu

Bonjour,


Je suis en train de suivre d'un tutoriel de Messagerie pour afficher le message avec la requête de SQL que j'ai fait sur phpmyadmin.


Lorsque j'ai copié et coller la requête dans mon code et sur le navigateur j'obtiens messages des erreurs dans la page messagerie.php :


Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':id OR id_receveur = :id) AND statut = 2' at line 3 in C:\xampp\htdocs\EDUTECH\connexionDB.php on line 28


Fatal error: Uncaught Error: Call to undefined method connexionDB::prepare() in C:\xampp\htdocs\EDUTECH\messagerie.php:17 Stack trace: #0 {main} thrown in C:\xampp\htdocs\EDUTECH\messagerie.php on line 17


Voici le code source du fichier messagerie.php


<?php
    session_start();

    include('connexionDB.php');
 
    if(!isset($_SESSION['id'])){
        header('Location: profil.php');
        exit;
    }

     // On récupère les informations de l'utilisateur connecté
    $req = $DB->query("SELECT COUNT(id) AS nb_amis
        FROM relation
        WHERE (id_demandeur = :id OR id_receveur = :id) AND statut = 2");
    $req->execute(array('id' => $_SESSION['id']));

    $req = $DB->prepare("SELECT u.prenom, u.nom, u.id, m.message, m.date_message, m.id_from, m.lu
        FROM(
            SELECT IF(r.id_demandeur = :id, r.id_receveur, r.id_demandeur)id_user, MAX(m.id) max_id
            FROM relation r
            LEFT JOIN messagerie m ON ((m.id_from, m.id_to) = (r.id_demandeur, r.id_receveur) OR (m.id_from, m.id_to) = (r.id_receveur, r.id_demandeur))
            WHERE (r.id_demandeur = :id OR r.id_receveur = :id) AND r.statut = 2
            GROUP BY IF(m.id_from = :id, m.id_to, m.id_from),r.id)AS DM
        LEFT JOIN messagerie m ON m.id = DM.max_id
        LEFT JOIN user u ON u.id = DM.id_user
        ORDER BY m.date_message DESC");
    $req->execute(array('id' => $_SESSION['id']));

    $nb_conversation = $req->fetch();

    //echo $nb_conversation("$nb_amis");

    $afficher_conversations = $req->fetchAll();
       

    // On récupère les informations de l'utilisateur connecté
    $afficher_profil = $DB->query("SELECT *
        FROM user
        WHERE id = ?",
        array($_SESSION['id']));
    $afficher_profil = $afficher_profil->fetch();
 
?>
<!DOCTYPE html>
<html>
<head>
    <title>Messagerie</title>
    <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" type="text/css" href="css/styles.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body style="background-color: #edeef0;">
      <div id="content-wrapper" class="d-flex flex-column">
            <div class="container">
                <div class="row">
                    <div class="col-sm-12">
                        <table>
                            <?php
                                foreach ($afficher_conversations as $ac){
                            ?>
                            <tr>
                                <td>Prenom</td>
                                <td>Lu</td>
                                <td>Message</td>
                                <td>Date message</td>
                            </tr>
                                
                            <?php
                                }
                            ?>
                        </table>
                    </div>
                </div>
            </div>
    </div>
</body>
</html>


La cause de cette erreur je pense qu'il y a une erreur dans le fichier connexionDB.php dans la ligne 28, mais je ne vois pas dans cette ligne de code une erreur.


Voici le code source du fichier connexionDB.php :


<?php
  // Déclaration d'une nouvelle classe
  class connexionDB {
    private $host    = 'localhost';  
    private $name    = 'site';    
    private $user    = 'root';       
    private $pass    = '';       
    private $connexion;
    
    function __construct($host = null, $name = null, $user = null, $pass = null){
      if($host != null){
        $this->host = $host;           
        $this->name = $name;           
        $this->user = $user;          
        $this->pass = $pass;
      }
      try{
        $this->connexion = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name,
          $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8',
          PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
      }catch (PDOException $e){
        echo 'Erreur : Impossible de se connecter  à la BDD !';
        die();
      }
    }
    public function query($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);
      return $req;
    }
    
    public function insert($sql, $data = array()){
      $req = $this->connexion->prepare($sql);
      $req->execute($data);
    }
  }
  // Faire une connexion à votre fonction
  $DB = new connexionDB();
   
?>



Merci d'avance pour vos réponses.

973 vues
28 février 2021 à 17:32 (Édité)
Cette pub permet au site de vivre ...

16 commentaires

Bonjour @Flomir,


C'est bon j'ai suivi un autre tutoriel pour créer une messagerie interne.


Je vais mettre ce topic en résolu.


Je m'excuse d'avoir de répondre en retard.


Re @Epeny:


On attend une réponse de ta part ...

Ton topic est-il résolu ?


Re @Flomir,


D'accord je vais encore suivre le tutoriel et vérifier les conditions.


Je pense que je fais une erreur dans le code, je m'excuse de t'avoir embêté.


Je te tiendrai au courant dès que je vais terminer corriger le bug.


Merci pour ta réponse.

Regarde bien le tutoriel, vérifie que tes conditions sont bonnes 😅


C'est sûrement une erreur de conditions 😂

Re @Flomir,


J'ai modifié toutes les array, mais je n'arrive pas toujours à me connecter, le même message d'erreur s'affiche que le mail est incorrecte lorsque je me connecte.


Voici le code :


<?php
    session_start();
    $msg = "";
 
    include("connexionDB.php");
 
    if(isset($_SESSION->id)){
        header('Location: user.php');
        exit;
    }
 
    if(!empty($_POST)){
        extract($_POST);
        $valid = true;
 
        if(isset($_POST['connexion'])){
 
            $mail = (string) strtolower(trim($mail));
            $mdp = (string) strtolower(trim($mdp));
            
            if(empty($mail)){
                $valid = false;
                $er_mail = "Le mail est incorrecte";
            }else{
                $req = $DB->prepare("SELECT id
                    FROM user
                    WHERE mail = ?");
                    
                $req->execute(array($mail));
                $utilisateur = $req->fetch();
                
                if(!isset($utilisateur->id)){
                    $valid = false;
                    $er_mail = "Le mail est incorrecte";
                }
            }
 
            if(empty($mdp)){
                $valid = false;
                $er_mdp = "Le mot de passe est incorrecte";
            }
 
            $req = $DB->prepare("SELECT id
                FROM user
                WHERE mail = ? AND mdp = ?");
                    
            $req->execute(array($mail, password_hash($mdp, PASSWORD_DEFAULT)));
            $verif_utilisateur = $req->fetch();
 
            if(!isset($verif_utilisateur->id)){
                $valid = false;
                $er_mail = "Le mail est incorrecte";
            }
 
            if($valid){
                $req = $DB->prepare("SELECT *
                    FROM user
                    WHERE id = ?");
                    
                $req->execute(array($verif_utilisateur->id));
                $verif_utilisateur = $req->fetch();
                
                $_SESSION['id'] = $verif_utilisateur->id;
                $_SESSION['prenom'] = $verif_utilisateur->prenom;
                $_SESSION['mail'] = $verif_utilisateur->mail;
 
                header('Location: user.php');
                exit;
            }
 
       }
   }
?>


Je pense que cette ligne de code est la cause d'un problème de la connexion:

if(!isset($utilisateur->id)){
   $valid = false;
   $er_mail = "Le mail est incorrecte";
}


Car les identifiants (mail et mot de passe) que j'avais créer sont bien enregistrés dans la base de données.


Je n'arrive pas à comprendre pourquoi ce message d'erreur s'affiche lorsque je me connecte alors que le mail et mot de passe d'utilisateur sont bien enregistrés dans la base de données.


Re @Epeny,


Il faut modifier toutes les array:

Par exemple :

if(!isset($utilisateur['id']))

En :

if(!isset($utilisateur->id))




Re @Flomir,


J'ai remplacé cette ligne code les variables de session :

$_SESSION['id'] = $verif_utilisateur['id'];
$_SESSION['prenom'] = $verif_utilisateur['prenom'];
$_SESSION['mail'] = $verif_utilisateur['mail'];


Par celles-ci


$_SESSION['id'] = $verif_utilisateur->id;
$_SESSION['prenom'] = $verif_utilisateur->prenom;
$_SESSION['mail'] = $verif_utilisateur->mail;


Mais je n'arrive pas toujours à me connecter, ça m'affiche le mêmes messages que le mail est incorrecte.


Voici le code :


<?php
    session_start();
    $msg = "";
 
    include("connexionDB.php");
 
    if(isset($_SESSION['id'])){
        header('Location: user.php');
        exit;
    }
 
    if(!empty($_POST)){
        extract($_POST);
        $valid = true;
 
        if(isset($_POST['connexion'])){
 
            $mail = (string) strtolower(trim($mail));
            $mdp = (string) strtolower(trim($mdp));
            
            if(empty($mail)){
                $valid = false;
                $er_mail = "Le mail est incorrecte";
            }else{
                $req = $DB->prepare("SELECT id
                    FROM user
                    WHERE mail = ?");
                    
                $req->execute(array($mail));
                $utilisateur = $req->fetch();
                
                if(!isset($utilisateur['id'])){
                    $valid = false;
                    $er_mail = "Le mail est incorrecte";
                }
            }
 
            if(empty($mdp)){
                $valid = false;
                $er_mdp = "Le mot de passe est incorrecte";
            }
 
            $req = $DB->prepare("SELECT id
                FROM user
                WHERE mail = ? AND mdp = ?");
                    
            $req->execute(array($mail, password_hash($mdp, PASSWORD_DEFAULT)));
            $verif_utilisateur = $req->fetch();
 
            if(!isset($verif_utilisateur['id'])){
                $valid = false;
                $er_mail = "Le mail est incorrecte";
            }
 
            if($valid){
                $req = $DB->prepare("SELECT *
                    FROM user
                    WHERE id = ?");
                    
                $req->execute(array($verif_utilisateur['id']));
                $verif_utilisateur = $req->fetch();
                
                $_SESSION['id'] = $verif_utilisateur->id;
                $_SESSION['prenom'] = $verif_utilisateur->prenom;
                $_SESSION['mail'] = $verif_utilisateur->mail;

                header('Location: user.php');
                exit;
            }
 
       }
   }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Connexion</title>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="css/styles.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <nav class="navbar navbar-expand-lg navbar-light fixed-top nav-green">
        
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
 
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav mr-auto">
                <div class="dropdown">
                    <button class="buttons-15 dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                        Espace membres
                    </button>
                    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                        <a class="dropdown-item" href="registration.php">Inscription</a>
                        <a class="dropdown-item" href="enseignant-2.php">Connexion</a>
                    </div>
                </div>
                
            </ul>
            <div class="nav-title">
                <a href="accueil.php">
                    <img class="image2" src="Images/logo.png">
                </a>
            </div>
          
        </div>
    </nav>
    <div id="content">
        <div class="container" style="margin-top: 55px;">
            <div class="row justify-content-md-center">
                <div class="col-sm-12 col-md-8 col-lg-6">
                    <div class="border">
                        
                        <div class="title">
                            <h4 class="under-title">SE CONNECTER</h4>
                        </div>
                        <form method="post">
                            <?php
                                if (isset($er_mail)){
                            ?>
                                <div class="er-message2"><?= $er_mail ?></div>
                            <?php   
                                }
                            ?>
                            <!--label for="mail1">Adresse mail</label>-->
                            <div class="form-group">
                                <input type="email" class="form-control"  id="mail1" placeholder="Adresse mail" name="mail" value="">
                            </div>
                            
                              <?php
                                if (isset($er_mdp)){
                            ?>
                                <div class="er-message2"><?= $er_mdp ?></div>
                            <?php   
                                }
                            ?>
                            <!--label for="mdp1">Mot de passe</label>-->
                            <div class="form-group">
                                <input type="password" class="form-control" id="mdp1" placeholder="Mot de passe" name="mdp" value="">
                            </div>
 
                            <div class="text">
                                <a class="under-link" href="#">Mot de passe oublié ?</a>
                            </div>
                            
                            
                            <button type="submit" class="btn-2"  name="connexion">Connexion</button>
                        
 
                            
                            <div class="er-message"><?php if ($msg != "") echo $msg . "<br><br>"; ?></div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <footer>
        <div class="under-footer">
            <p><a class="link-2" href="inscription.php">©</a></p>
            <p class="paragraph-10">Copyright 2021</a></p>
        </div>
    </footer>
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>
</html>

Re @Epeny,

Peux-tu m'en dire plus..

Re @Flomir,


J'ai remplacé cette ligne de code

$_SESSION['id'] = $verif_utilisateur['id'];


Par :

$_SESSION['id'] = $verif_utilisateur->id;
$_SESSION['prenom'] = $verif_utilisateur->prenom;
$_SESSION['mail'] = $verif_utilisateur->mail;



Mais ça ne fonctionne pas, je n'arrive pas toujours à me connecter.

Re @Epeny !


Replace:

$_SESSION['id'] = $verif_utilisateur['id'];

En

$_SESSION['id'] = $verif_utilisateur->id;


Pareillement pour tes autres variables de session..

Ça te donne quoi ?

Cette pub permet au site de vivre ...
1
2