Pdo bogué

Résolu
pdo renvoie l'erreur
"SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)"
alors que la base, l'hote, l'utilisateur et le mot de passe sont correct.
J'ai activé toutes les extensions pdo sauf pdo_firebird.
J'utilise un raspberrypi pour héberger mon site personnel.
Je suis sous raspbian, j'utilise php 7.4, mariadb-server et apache2.
Le code pour se connecter à mysql est :
$host = '127.0.0.1';
$dbname = 'chat';
$username = 'root';
$password = 'mon mdp';
if(isset($_POST['insert'])){
try {
// se connecter à mysql
$pdo = new PDO("mysql:host=$host;dbname=$dbname","$username","$password");
} catch (PDOException $exc) {
echo $exc->getMessage();
exit();
}

4 réponses

  1. Modérateur
    Bonjour,

    Déjà, merci d'utiliser les balises de code lorsque tu postes du code sur le forum.
    Explications ( à lire entièrement ! ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    Ensuite,
    ça ne sert à rien de placer le code de connexion à la bdd que si ton formuaire est envoyé..... place le directement au début de ton code.
    Pense aussi à activer l'affichage des erreurs PHP ainsi que l'affichage des erreurs PDO.

    <?php
    
    //Affichage des erreurs php 
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    
    //connexion à la bdd
    $host = '127.0.0.1';
    $dbname = 'chat';
    $username = 'root';
    $password = 'mon mdp'; 
    
    try{
      $bdd =new PDO('mysql:host='.$host.';dbname='.$dbname.'; charset=utf8', $username, $password);
      // Activation des erreurs PDO
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
      $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
    }
    
    if(isset($_POST['insert'])){
      
      
      /**
     //exemple d'utilisation d'une requête préparée en pdo:
    
     //préparation de la requête et des variables
     $sql = "INSERT INTO tatable (champ1,champ2)   VALUES (:valeur1,:autrevaleur)";
     $datas = array(':valeur1'=>$valeur1, ':autrevaleur'=>$toto);
    
      //Execution de la requete (il n'y a rien à toucher dans les lignes ci-dessous)
      try{
        $requete = $bdd -> prepare($sql) ;
        $requete->execute($datas) ;
      }catch(Exception $e){
        // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
         echo " Les datas : " ;
        print_r($datas);
      }
      
      */
    }
    
    


    Et puis,
    As tu d'autres fichiers php ? n'aurais tu pas écrit le code de connexion à la bdd ailleurs ? (que tu aurais laissé en "localhost" au lieu de "127.0.0.1" ? )

    Par contre, comment sais tu que le user et le password sont bons ?
    Tu arrives à te connecter à la bdd par un autre moyen avec ces identifiants ( en ligne de commande par exemple ? ) Il faudrait faire ce teste la en premier pour être certains que les infos sont bonnes.

    1. J'arrive à me connecter à la bdd via "sudo mysql" et avec mysqli.
      Si vous voulez le code complet est :
      <?php
       // Initialiser la session
       session_start();
       // Vérifiez si l'utilisateur est connecté, sinon redirigez-le vers la page de connexion
       if(!isset($_SESSION["username"])){
        header("Location: login.php");
        exit(); 
       }
      $host = '127.0.0.1';
      $dbname = 'chat';
      $username = 'root';
      $password = 'mon mdp';
      if(isset($_POST['insert'])){
        try {
        // se connecter à mysql
        $pdo = new PDO("mysql:host=$host;dbname=$dbname","$username","$password");
        } catch (PDOException $exc) {
          echo $exc->getMessage();
          exit();
        }
        // récupérer les valeurs 
        $pseudo = $_SESSION["username"];
        $message = htmlspecialchars($_POST['message']);
        // Requête mysql pour insérer des données
        $sql = "INSERT INTO `chatbox`(`pseudo`, `message`) VALUES (:pseudo,:message)";
        $res = $pdo->prepare($sql);
        $exec = $res->execute(array(":pseudo"=>$pseudo,":message"=>$message));
        // vérifier si la requête d'insertion a réussi
        if($exec){
         $alerte = 'Message envoyé !!!';
        }else{
          echo "Échec de l'opération d'insertion";
        }
      }
      header("refresh: 15;");
      ?>
      <!DOCTYPE html>
      <html>
       <head>
        <META NAME="ROBOTS" content="none">
        <title>Tableau de bord</title>
        <link rel="stylesheet" href="style.css" />
       </head>
       <body>
        <div class="sucess">
        <h1>Bienvenue <?php echo $_SESSION['username']; ?> !</h1>
        <p>C'est votre tableau de bord.</p>
        <a href="logout.php">Déconnexion</a>
        </div>
        <form action="" method="post" class="box">
        <?php if (! empty($message)) { ?>
            <p class="errorMessage"><?php echo $alerte; ?></p>
        <?php } ?>
              <textarea type="text" name="message" placeholder="message" class="textarea"></textarea>
              <input type="submit" name="insert" value="Envoyer" class="box-button">
         <p></br></p>
         <?php
         $host = 'localhost';
         $dbname = 'chat';
         $username = 'root';
         $password = 'mon mdp';
           try {
           // se connecter à mysql
           $pdo = new PDO("mysql:host=$host;dbname=$dbname","$username","$password");
           } catch (PDOException $exc) {
          echo $exc->getMessage();
          exit();
           }
         $req = $pdo->query("SELECT * FROM chatbox ORDER BY ID DESC LIMIT 20");
         while($msg = $req->fetch()){
         ?>
         <p align="center"><font color="#003cff"><b><?php echo $msg['pseudo'] ?> :</b> <?php echo $msg['message'] ?></font></p>
         <?php
         } 
         ?>
         </form>  
       </body>
      </html>
      

      EDIT : Ajout des BALISES DE CODE !!

      1. Modérateur
        Tu peux m'explilquer pourquoi tu essayes de REFAIRE une connexion aux lignes 58 -> 68 ... alors que tu en a déjà une aux lignes 14 à 20 ??

        Surtout que dans cette seconde connexion tu as utilisé 'localhost" ( ah tiens.. ça correspond à ton message d'erreur contrairement au premier code que tu nous as montré... )

        Bref.. il ne faut qu'une seule connexion... la première...
    2. Je refais une connexion pour récupérer les messages du tchat.
      La premiere connexion sert uniquement à envoyer les messages dans la bdd.
      1. Modérateur
        Une seule connexion par fichier php suffit..
    3. Mince, je viens de me rendre compte que je n'ai pas modifié le mot de passe de la 2eme connexion en installant le site sur le raspberrypi.