Probléme PDO

Suivre ce topic
Ce topic est suivi par : Personne...
Smveee

Smveee Le 9 avril 2016 à 19:35 (Édité le 25 janvier 2019 à 17:50)

Jai un autre problème, lorsque j'envoie mon message, cette erreur PDO apparait : 

[url=http://puu.sh/obieQ/c3b9826ba3.png]
http://puu.sh/obieQ/c3b9826ba3.png
[/url]
La ligne 28 et 29 : 

$ins = $dbh->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message) VALUES (?,?,?)');
$ins->execute(array($_SESSION['id_utilisateur'],$id_destinataire,$message));

ma table "messages" : http://puu.sh/oc4cf/e0cb837924.png

Cordialement
julienb

julienb Le 9 avril 2016 à 20:36

Salut,
les champs dans ta table sont définis comme étant non nuls, ça veut dire qu'il est impossible d'insérer un champ dans ta table si tu ne remplis pas tous les champs à par id_message. C'est à dire :
- message
- date_envoi
- date_lecture
- id_expediteur
- id_destinataire
Hors, tu essayes de faire un INSERT avec uniquement:
- id_expediteur
- id_destinataire
- message

Il manque donc :
- date_envoi
- date_lecture

Si tu souhaites pouvoir faire un insert avec uniquement 3 valeurs, il faut définir date_envoi et date_lecture comme étant null dans ta table. C'est à dire que le champ peut ne pas être remplit.
Smveee

Smveee Le 9 avril 2016 à 21:17

Merci ça marche ! 😄
Smveee

Smveee Le 9 avril 2016 à 22:20

Une autre question, dans le tuto pour envoyer des messages, il affiche le pseudo de la personne avant le "a envoyé" mais comment faire si je veux afficher le nom + prénom ? Je sais que ça se fais ici : 
        <?php
         while($m = $msg->fetch()) {
            $p_exp = $dbh->prepare('SELECT email FROM utilisateurs WHERE id_utilisateur = ?');
            $p_exp->execute(array($m['id_expediteur']));
            $p_exp = $p_exp->fetch();
            $p_exp = $p_exp['email'];
        ?>
Mais prenom et nom sont 2 variables distinctes, comment puis-je faire ? 

Cordialement
julienb

julienb Le 10 avril 2016 à 12:52 (Édité le 12 avril 2016 à 13:58)

Tu fais une requète sql qui récupère le nom et le prénom. En utilisant fetch, ça devient tableau exploitable ensuite tu utilises un echo + la concaténation php pour afficher nom + prenom, ça donne quelquechose de ce style:
echo "Nom :".$tab['nom']." Prenom :".$tab['prenom'];
Smveee

Smveee Le 10 avril 2016 à 16:17

ça donne ça pour la requête ? : 
  $destinataires = $dbh->query('SELECT nom,prenom FROM utilisateurs ORDER BY nom'); // Classer par ordre alphabétique tous les utilisateurs du site
  $destinataires->execute(array($_SESSION['id_utilisateur']));
  $user = $destinataires->fetch();

// dans le html :

<input id="icon_prefix" type="text" name="destinataire" <?php if(isset($r)) { echo 'value=" "Nom :".user['nom']." Prenom :".$user['prenom'];} ?> />

julienb

julienb Le 10 avril 2016 à 16:59

Si tu veux la totalité des utilisateurs c'est bon oui. Ensuire echo $user['nom'].$user['prenom'] et c'est bon
Smveee

Smveee Le 10 avril 2016 à 17:12

Je ne sais pas si tu as vue le tuto de prim sur les messages, mais lui fais ça avec les pseudos, mais moi j'aimerai faire ça avec le nom + prénom, du coup grâce à cette technique, ça fais bien ceci ? 
<input id="icon_prefix" type="text" name="destinataire" <?php if(isset($r)) { echo 'value= "Nom : " .$user['nom'] . $user['prenom'];'} ?> />
Avec ceci, j'ai cette erreur : http://puu.sh/od9Mh/fc3c909b1e.png
Smveee

Smveee Le 11 avril 2016 à 19:28

UP
Nobodief

Nobodief Le 12 avril 2016 à 13:00 (Édité le 12 avril 2016 à 13:02)

Salut, pour faire une concaténation il faut utiliser le même type de guillemet et en plus tu n'as pas besoin d'utiliser un ; voici ton code erroné :
<?php if(isset($r)) { echo 'value= "Nom : " .$user['nom'] . $user['prenom'];'} ?>
Voici mon code fonctionnel
<?php if(isset($r)) { echo 'value=Nom : '.$user['nom'].' '.$user['prenom'].' '; } ?>
Dans la théorie de la théorie de la logique théorique, cela fonctionne.
julienb

julienb Le 12 avril 2016 à 14:02

J'ai toujours mis des " pour les concaténations dans les echo mais ça revient peut-être à la même chose.
Nobodief

Nobodief Le 12 avril 2016 à 16:33 (Édité le 12 avril 2016 à 16:33)

Oui c'est la même chose avec les guillemets cela donnerais :
<?php if(isset($r)) { echo "value=Nom : ".$user['nom']." ".$user['prenom']." "; } ?>
Seulement ce que je te t'explique, c'est que tes concaténations sont mal placé regarde ton code :
<?php if(isset($r)) { echo 'value= "Nom : " .$user['nom'] . $user['prenom'];'} ?>
Smveee

Smveee Le 12 avril 2016 à 19:53 (Édité le 12 avril 2016 à 19:55)

J'ai un peu changé le code depuis, du coup je ne sais plus où le mettre (je suis un boulet oui)

Ligne 22 : La requête SQL a l'air bonne, par contre, 

J'ai ça : 
<?php
session_start();
$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}
if(isset($_SESSION['id_utilisateur']) AND !empty($_SESSION['id_utilisateur']))
{
  if(isset($_GET['id']) AND !empty($_GET['id']))
  {
    $id_message = intval($_GET['id']);
  $msg = $dbh->prepare('SELECT * FROM messages WHERE id = ? AND id_destinataire =  ?');
  $msg->execute(array($_GET['id'],$_SESSION['id_utilisateur']));
  $msg_nbr = $msg->rowCount();
  $m = $msg->fetch();
  $p_exp = $dbh->prepare('SELECT nom,prenom FROM utilisateurs WHERE id_utilisateur = ?');
  $p_exp->execute(array($m['id_expediteur']));
  $p_exp = $p_exp->fetch();
  $p_exp = $p_exp['email'];
?>
<!DOCTYPE html>
  <html>
    <header>
      <meta charset="utf-8" />
      <title>Lecture du message #<?= $id_message ?></title>
      <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
      <link href="footer.css" rel="stylesheet" media="all" type="text/css">
      <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    </header>
    <body>
      <main>
        <nav class ="blue darken-2">
          <div class=" nav-wrapper container">
            <a href="#!" class="brand-logo">TSN </a>
            <ul class="right">                    
              <li><a href="acceuil.php">Acceuil</a></li>
              <li><a href="<?php echo 'profil.php?id_utilisateur='.$_SESSION['id_utilisateur']?>">Profile</a></li>
              <li><a href="choixMessage.php">Messages</a></li>
              <li><a href="deconnexion.php">Deconnexion</a></li>
            </ul>
          </div>
        </nav>
        <h3 align ="center"> Lecture du message #<?= $id_message ?></h3>
        <div align="center">
          <br><br><br><br><br><br><br><br><br><br>
        <?php if($msg_nbr == 0) { echo "Erreur"; } else {  ?>
          <b><?= $p_exp ?></b>- vous a envoyé: <br> 
          <?= nl2br($m['message']) ?><br>
          <?php } ?>
        <br><br><br><br><br><br><br><br><br><br>
        <a class="waves-effect waves-light btn" href="envoie.php?r=<?= $p_exp ?>">Répondre</a>
                <a class="waves-effect waves-light btn" href="supprimer.php?id=<?= $m['id'] ?>">Supprimer</a>
      </div>
      </main>     
      <footer class ="page-footer blue darken-2">
        <div class="footer-copyright">
          Copyright © 2016 thesocialnetwork.com | All rights reserved
        </div>
      </footer>
      <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
      <script src="js/materialize.js"></script>
      <script src="js/init.js"></script>
    </body>
  </html>
<?php
  
  $lu = $dbh->prepare('UPDATE messages SET lu = 1 WHERE id = ?');
  $lu->execute(array($m['id']));
  } 
} 
?>
Smveee

Smveee Le 12 avril 2016 à 19:58

Je ne peux pas éditer mon message précédent je ne sais pas pourquoi, je voulais rajouter ça : 

Ligne 22 : La requête SQL a l'air bonne, par contre, ligne 25, je dois changer l'email par nom et prenom, je fais une concaténation ? Et ligne 53 je met ce que vous m'avez dis ?
Nobodief

Nobodief Le 16 avril 2016 à 02:21

Et bien non, je en vois pas pourquoi tu as mis $p_exp = $p_exp['email']; cela te retourne "null", puisque dans ta requête tu récupère uniquement le nom et prenom.

Donc du coup essaye avec ce code :
 $p_exp = $dbh->prepare('SELECT (nom, prenom, email) FROM utilisateurs WHERE id_utilisateur = ?');  
 $p_exp->execute(array($m['id_expediteur']));  
 $p_exp = $p_exp->fetch();  
Et pour récupérer les valeurs :

$p_exp['nom'];
$p_exp['prenom'];
$p_exp['email'];
Smveee

Smveee Le 19 avril 2016 à 18:19

J'ai pas très bien compris pour la 2eme partie de ton code, je dois les mettre où ? (pour ce qui est de la requête SQL, j'ai compris ^^)
Florian

Florian Le 19 avril 2016 à 21:45 (Édité le 19 avril 2016 à 21:50)

L'erreur est tout simplement, tu demandes l'email alors que dans le select tu lui demande pas alors remplace par ça 
$p_exp = $dbh->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ?');  
$p_exp->execute(array($m['id_expediteur'])); 
$p_exp = $p_exp->fetch();  / ça va
$p_exp = $p_exp['email'];
Smveee

Smveee Le 20 avril 2016 à 15:36

Oui, mais je veux les nom et prenoms, du coup 'jai fais ça : 
  $p_exp = $dbh->prepare('SELECT nom,prenom FROM utilisateurs WHERE id_utilisateur = ?');
  $p_exp->execute(array($m['id_expediteur']));
  $p_exp = $p_exp->fetch();
  $p_exp = $p_exp['email']; // sauf qu'ici je dois mettre nom et prenom a la place de l'email, mais comment ? Comme ça ? : $p_exp = $p_exp['nom']; $p_exp = $p_exp['prenom']; ??? 

Et Pour dire que c'est cette personne qui m'a envoyé le message,  j'ai ça :
        <?php if($msg_nbr == 0) { echo "Erreur"; } else {  ?>
          <b><?= $p_exp ?></b>- vous a envoyé: <br> 
          <?= nl2br($m['message']) ?><br>
          <?php } ?>

Florian

Florian Le 20 avril 2016 à 17:23 (Édité le 20 avril 2016 à 17:25)

<?php
$p_exp = $dbh->prepare('SELECT nom,prenom FROM utilisateurs WHERE id_utilisateur = ?');  
$p_exp->execute(array($m['id_expediteur']));  
$p_exp = $p_exp->fetch();
$nom = $p_exp['nom'];
$prenom = $p_exp['prenom'];

echo ''.$nom.'-'.$prenom.' Vous a envoyé un message: <br /> '.nl2br($m['message'].'';
?>


Smveee

Smveee Le 20 avril 2016 à 19:15 (Édité le 20 avril 2016 à 19:17)

ça marche ! Mais en bas de ceci, j'ai un bouton normalement pour répondre et ça m'affiche ça : http://puu.sh/optCC/ac9b9ac547.png

La ligne 77 : 
 <a class="waves-effect waves-light btn" href="envoie.php?r=<?= $p_exp ?>">Répondre</a>
Donc le problème vient de envoie.php je suppose.
J'ai suivis le tuto de prim pour envoyer un message, et j'ai fais en sorte que pour choisir son destinataire, on choisit l'email. Du coup j'aimerai faire en sorte qu'on prenne le nom et le prénom à la place (je pense qu'il faut faire ça pour résoudre le problème). Il faut simplement changer les requêtes SQL où l'on prends l'email et d'y ajouter nom et prénom ? 

Envoie.php : 

<?php
session_start();
$bdd = 'mysql:host=localhost;dbname=sitesocialnetwork';
$user = 'root';
$password2 = '';
try{
  $dbh = new PDO($bdd, $user,$password2, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} 
catch (PDOException $e) {
    echo 'Echec de la connexion : ' . $e->getMessage();
    exit;
}
if(isset($_SESSION['id_utilisateur']) AND !empty($_SESSION['id_utilisateur']))
{
  if(isset($_POST['envoi_message']))
  {
    if(isset($_POST['destinataire'],$_POST['message']) AND !empty($_POST['destinataire']) AND !empty($_POST['message']))
    {
      $destinataire = htmlspecialchars($_POST['destinataire']);
      $message = htmlspecialchars($_POST['message']);
      $id_destinataire = $dbh->prepare('SELECT id_utilisateur FROM utilisateurs WHERE email = ?');
      $id_destinataire->execute(array($destinataire));
      $dest_exist = $id_destinataire->rowCount(); // parcous id_destinataire
      if($dest_exist == 1) // si l'utisateur existe, alors 
      {
        $id_destinataire = $id_destinataire->fetch();
        $id_destinataire = $id_destinataire['id_utilisateur'];
        $ins = $dbh->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message) VALUES (?,?,?)');
        $ins->execute(array($_SESSION['id_utilisateur'],$id_destinataire,$message));
        $erreur = "Votre message a bien été envoyé !";
      }
      else
      {
        $erreur = "Cet utilisateur n'existe pas ";
      }
    }
    else
    {
      $erreur = "Veuillez completer tous les champs";
    }
  }
  $destinataires = $dbh->query('SELECT email FROM utilisateurs ORDER BY email'); // Classer par ordre alphabétique tous les utilisateurs du site
  $destinataires->execute(array($_SESSION['id_utilisateur']));
  $user = $destinataires->fetch();
  if(isset($_GET['r']) AND !empty($_GET['r']))
  {
    $r = htmlspecialchars($_GET['r']);
  }
  ?>
  <!DOCTYPE html>
  <html>
    <header>
      <meta charset="utf-8" />
      <title>Envoyer un message</title>
      <link href="materialize.css" rel="stylesheet" media="all" type="text/css"> 
      <link href="footer.css" rel="stylesheet" media="all" type="text/css">
      <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    </header>
    <body>
      <main>
        <nav class ="blue darken-2">
          <div class=" nav-wrapper container">
            <a href="#!" class="brand-logo">TSN </a>
          <ul class="right">                    
            <li><a href="acceuil.php">Acceuil</a></li>
            <li><a href="<?php echo 'profil2.php?id_utilisateur='.$_SESSION['id_utilisateur']?>">Profile</a></li>
            <li><a href="choixMessage.php">Messages</a></li>
            <li><a href="deconnexion.php">Deconnexion</a></li>
          </ul>
          </div>
        </nav>
          <form method="POST" class="col s12">
            <br><br>
            <div class="row">
              <div class="input-field col s2">
                <!--<select name="destinataire" class="browser-default" >
                  <option value="" disabled selected>Destinataire(s)</option>
                  <?php while($d = $destinataires->fetch()) { ?>
                  <option value=""><?php echo $d['nom']; echo " "; echo $d['prenom']; ?></option> 
                  <?php } ?> -->
                  <i class="material-icons prefix">account_circle</i>
                  <label for="icon_prefix">Destinataire</label>
                  <input id="icon_prefix" type="text" name="destinataire" <?php if(isset($r)) { echo 'value="'.$r.'"'; } ?>/> 
              </div>
                </select>
              </div>   
            </div>
            <br><br>
            <div class="row">
              <div class="input-field col s6">
                <i class="material-icons prefix">mode_edit</i>
                <textarea name="message" id="icon_prefix2" class="materialize-textarea" ></textarea>
                <label for="icon_prefix2">Votre message</label>
              </div>
            </div>
            <button name ="envoi_message" class="btn waves-effect waves-light" type="submit" >Envoyer
              <i class="material-icons right">send</i>        
            </button>
            <br><br>
            <?php if(isset($erreur)) { echo '<span style="color:red">'.$erreur.'</span>'; } ?>
        </form>
        
      </main>     
      <footer class ="page-footer blue darken-2">
        <div class="footer-copyright">
          Copyright © 2016 thesocialnetwork.com | All rights reserved
        </div>
      </footer>
      <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
      <script src="js/materialize.js"></script>
      <script src="js/init.js"></script>
    </body>
  </html>
<?php 
}
else
{
  header('Location: connexion.php');
}
?>
Smveee

Smveee Le 25 avril 2016 à 17:53

UP :(
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte