Pb erreur pages blanche !

Fermé
Profil bloqué - Modifié par jordane45 le 19/08/2016 à 16:45
jordane45 Messages postés 38366 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 1 janvier 2025 - 19 août 2016 à 16:49
Voilà le code de ma page internet : pages de message privé le résultat

<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', 'xxx');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_POST['envoi_message'])) {
      if(isset($_POST['destinataire'],$_POST['message'],$_POST['objet']) AND !empty($_POST['destinataire']) AND !empty($_POST['message']) AND !empty($_POST['objet'])) {
         $destinataire = htmlspecialchars($_POST['destinataire']);
         $message = htmlspecialchars($_POST['message']);
         $objet = htmlspecialchars($_POST['objet']);
         $id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
         $id_destinataire->execute(array($destinataire));
         $dest_exist = $id_destinataire->rowCount();
         if($dest_exist == 1) {
            $id_destinataire = $id_destinataire->fetch();
            $id_destinataire = $id_destinataire['id'];
            $ins = $bdd->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message,objet) VALUES (?,?,?,?)');
            $ins->execute(array($_SESSION['id'],$id_destinataire,$message,$objet));
            $error = "Votre message a bien été envoyé !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');
   if(isset($_GET['r']) AND !empty($_GET['r'])) {
      $r = htmlspecialchars($_GET['r']);
   }
   if(isset($_GET['o']) AND !empty($_GET['o'])) {
      $o = urldecode($_GET['o']);
      $o = htmlspecialchars($_GET['o']);
      if(substr($o,0,3) != 'RE:') {
         $o = "RE:".$o;
      }
   }
   ?>
   <!DOCTYPE html>
   <html>
   <head>
      <title>Envoi de message</title>
      <meta charset="utf-8" />
   </head>
   <body>
      <form method="POST">
         <!-- <select name="destinataire">
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['pseudo'] ?></option>
            <?php } ?>
         </select> -->
         <label>Destinataire:</label>
         <input type="text" name="destinataire" <?php if(isset($r)) { echo 'value="'.$r.'"'; } ?> />
         <br /><br />
         <label>Objet :</label>
         <input type="text" name="objet" <?php if(isset($o)) { echo 'value="'.$o.'"'; } ?> />
         <br /><br />
         <textarea placeholder="Votre message" name="message"></textarea>
         <br /><br />
         <input type="submit" value="Envoyer" name="envoi_message" />
         <br /><br />
         <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?>
      </form>
      <br />
      <a href="reception.php" rel="nofollow" target="_blank">Boîte de réception</a>
   </body>
   </html>
<?php
}
?>


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
19 août 2016 à 15:58
Salut,

Vérifie la valeur de $_SESSION['id'] : si celle-ci est vide ou non définie, ta première condition n'est pas validé et donc tout le reste du code n'est pas exécuté, d'où la page blanche.

Plusieurs remarques sur ton code :
- Active le rapport d'erreur de PDO en développement pour voir les éventuelles erreurs sql : https://www.php.net/manual/fr/pdo.error-handling.php
- la fonction empty() permet de tester si la variable existe et n'est pas vide, il n'est donc pas nécessaire de tester avant si la variable existe avec isset(), empty() suffit.
- htmlspecialchars() ne doit pas être utilisée sur les données utilisées dans une requête sql car elle ne protège en rien contre les injections sql. L'utilisation des requêtes préparées suffit pour contrer les injections sql. htmlspecialchars(), comme son nom l'indique, doit être utilisée lors de l'affichage de données dans le document html pour éviter les failles xss.
- rowCount() fonctionne sur les requêtes de type INSERT, UPDATE ou DELETE et n'est pas garantie pour les requête de type SELECT. La solution est de faire une requête SELECT COUNT(*) puis d'utiliser fetchColumn sur le résultat de cette requête comme expliqué ici : https://www.php.net/manual/fr/pdostatement.rowcount.php#example-1065
- Concernant les opérateurs logiques, on recommande d'utiliser && à la place de AND et || à la place de OR à cause de la précédence des opérateurs : https://www.php.net/manual/fr/language.operators.precedence.php

Bonne journée,
1
Merci beaucoup du temps passé pour me répondre mais je n'ai pas très bien compris pour session id
0
jordane45 Messages postés 38366 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 1 janvier 2025 4 720
19 août 2016 à 16:49
Bonjour Player,

je n'ai pas très bien compris pour session id

Il te suffit de faire un print de la variable $_SESSION['id'] pour voir ce qu'elle contient


Par exemple, place ce bout de code au début de ta page ( sous le session_start(); ):
//Affiche le contenu de la variable $_SESSION
print_r($_SESSION);



Et pour ce qui est d'activer les erreurs PDO, je t'invite à lire ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

De plus, pense à placer au début de ton script php la ligne suivante :
error_reporting(E_ALL);

Afin d'afficher les erreurs PHP de ta page.

Pour le reste... je valide la réponse de Pitet (A qui je passe un petit bonjour au passage :-) )






0