Problème requête SQL

Résolu/Fermé
Marion-Slr - 6 mars 2020 à 14:51
 Marion-Slr - 9 mars 2020 à 09:20
Bonjour à tous,

J'aurai besoin d'un petit coup de main svp.

Je vous explique mon but, je travaille pour une entreprise qui vendent des produits à des professionnels et c'est professionnels en question vendent mes produits à leur clients.

J'ai créer une page permettant au professionnel de se connecter à leur espace membre.
Dans cette espace membre, ils ont accès à tout les chantier qu'ils ont réalisés avec nos produits.

Ils ont différentes informations comme, le nom du responsable chantier, l'adresse du chantier, le nombre de produit installé, ...

Mon problème est que lorsque je me connecte à l'espace professionnel, la société 1 peut voir les chantier réalisé par la société 2, je n'arrive pas à trouver mon erreur me permettant simplement d'avoir les informations correspondant à une seul société et pas à toute les sociétés ayant un compte.

Je vous mets mon code pour être un peu plus claire peut être

Ma page de connexion :

<?php
/* Connexion */
try{
$connect = new PDO('mysql:host=localhost;dbname=gestion_toiture', 'root', '');
}
catch (PDOException $e){
exit('problème de connexion à la base');
}
if(isset($_POST['mail']) AND isset($_POST['mdp'])) {

if(!empty($_POST['mail']) AND !empty($_POST['mdp'])) {
$mail = $_POST['mail'];
$mdp= $_POST['mdp'];
/* Requête pour récupérer les enregistrements répondant à la clause : champ du pseudo et champ du mdp de la table = pseudo et mdp posté dans le formulaire */
$requete = $connect->prepare('SELECT * FROM etancheur WHERE mail= :mail AND mdp= :mdp ');
$requete ->execute(array(
'mail' => $mail,
'mdp' => $mdp));

if ($row = $requete->fetch(PDO::FETCH_ASSOC)){
session_start();
$_SESSION['prenom_nom'] = $row['prenom_nom'];
$_SESSION['mail'] = $mail;
$_SESSION['mdp'] = $mdp;
$_SESSION['id_etancheur'] = $id_etancheur;
'Vous êtes connecté ! <br/>';
header("Location: profiletancheur.php?id_etancheur=".$_SESSION['prenom_nom']);
}
else {
$erreur ="Identifiant ou Mot De Passe incorrect.";
}
$requete->closeCursor();
} else {
$erreur = "Tous les champs doivent être complétés !";
}
}
?>
<html>
<head>
<meta charset="utf-8">
<!-- importer le fichier de style -->
<link rel="stylesheet" href="styleconnexionetancheur.css" media="screen" type="text/css" />
</head>
<body>
<div id= "container">
<form method="POST" action="">
<h1>Connexion</h1>
<label><b>Mail : </b> </label>
<input type="text" placeholder="Entrer votre mail" name="mail" /></p>
<label> <b>Mot de passe :</b> </label>
<input type="password" placeholder="Entrer votre mot de passe" name="mdp" /></p>
<input type="submit" name='formconnexion' value="Se connecter" /></p>
</form>
<?php
if(isset($erreur)){
echo '<font color="red">'.$erreur."</font>";
}
?>
</div>
</body>
<form>
<button type="submit" formaction="http://localhost/accueil.php";">Retour accueil</button>
</form>
</html>



Ma page profil professionel :


<?php
//inclusion de fichier de configuration
include('config.php');
?>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="styleprofiladministrateur.css" media="screen" type="text/css" />
</head>
<body>

<?php
if(!isset($_SESSION['mail']) || !isset($_SESSION['mdp'])){
//l'utilisateur n'est pas connecté
echo '<p>Vous n\'êtes pas encore connecté
<a class = "btn btn-sm btn-primary" href = "connexionetancheur.php"><i class = "glyphicon glyphicon-off"></i> Connexion</a></p>';
}
else{
// il est connecté on recupere ses infos
$id_etancheur = $_SESSION['id_etancheur'];
$prenom_nom = $_SESSION['prenom_nom'];
$mail = $_SESSION['mail'];
$mdp = $_SESSION['mdp'];
$requete = $bdd->prepare('SELECT * FROM etancheur WHERE mail= :mail AND mdp= :mdp ') or die('Erreur de la requête SQL');
//les donnees sous forme de tableau
$requete->execute(array(
'mail' => $mail,
'mdp' => $mdp));
$userinfo = $requete->fetch();



?>
<div align="center">
<h2>Profil de l'étancheur <?php echo $userinfo['prenom_nom'];?></h2>
<br/>
<br/>
Mail : <?php echo $userinfo['mail'];?>
<br/>
<br/>
<?php

$buffer = "<table border=3>";
$sql = $bdd->query('SELECT `responsable`, chantier.`societe`,`adresse_toiture`,`nombre_capteur`,`adresse_bluetooth`,`nom_box`,`date_installation` FROM `chantier` JOIN etancheur ON chantier.societe = etancheur.societe');
$nb_champs = $sql->columnCount();
$buffer .= "<td>Responsable</td>";
$buffer .= "<td>Société d'étanchéité</td>";
$buffer .= "<td>Adresse toiture</td>";
$buffer .= "<td>Nombre capteur</td>";
$buffer .= "<td>Adresse bluetooth</td>";
$buffer .= "<td>Nom de la Box</td>";
$buffer .= "<td>Date d'installation</td>";
while($fetch = $sql->fetch()){
$buffer .= "<tr>";
for($i=0;$i<$nb_champs;$i++){
$buffer .= "<td>$fetch[$i]</td>";
}
$buffer .= "</tr>";
}
$buffer .= "</table>";
echo $buffer;


?>

<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>

<a href="deconnexion1.php">Se déconnecter</a>

</div>
</body>
</html>
<?php
}
?>



N'hésitez pas à me poser des questions si c'est pas très claire, je suis débutante en programmation.

Merci d'avance.

3 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
6 mars 2020 à 16:10
Bonjour,

Dans ta requête
$sql = $bdd->query('SELECT `responsable`, chantier.`societe`,`adresse_toiture`,`nombre_capteur`,`adresse_bluetooth`,`nom_box`,`date_installation` FROM `chantier` JOIN etancheur ON chantier.societe = etancheur.societe');

Il manque un
WHERE etancheur.id_etancheur = :id_etancheur
avec ton $id_etancheur (et en faisant prepare puis execute, comme tu faisais pour les requêtes de mot de passe).

J'aurais quand même une remarque à faire concernant la sécurité : tes mots de passe sont stockés en clair en base de données. Personnellement je trouve que c'est une rupture de confiance franche.
Tu peux utiliser password_hash (https://www.php.net/password_hash) et password_verify (https://www.php.net/password_verify) pour sécuriser ces données.

Attention aussi à cette ligne :
header("Location: profiletancheur.php?id_etancheur=".$_SESSION['prenom_nom']);
: on dirait bien qu'il y a un mélange entre nom_prenom et id_etancheur.

Xavier
0
Merci pour ta réponse.

Pour ma requête, j'ai changé comme tu me l'as dis.
Cela donne
$sql = $bdd->prepare('SELECT `responsable`, chantier.`societe`,`adresse_toiture`,`nombre_capteur`,`adresse_bluetooth`,`nom_box`,`date_installation` FROM `chantier` JOIN etancheur WHERE id_etancheur= :id_etancheur');
$sql->execute(array(
'id_etancheur' => $id_etancheur));
$userinfos = $sql->fetch();


Sauf que du coup maintenant j'ai plus aucun résultat dans mon tableau.


Oui, c'est vrai je ne me suis pas du tout chargé de la partie sécurité, merci j'y ferai un tour.


Tout à fait je me suis emmelée les pinceaux.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > Marion-Slr
6 mars 2020 à 16:53
Tu as perdu la partie
 ON chantier.societe = etancheur.societe
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
6 mars 2020 à 16:54
SELECT `responsable`, chantier.`societe`,`adresse_toiture`,`nombre_capteur`,`adresse_bluetooth`,`nom_box`,`date_installation`
FROM `chantier`
JOIN etancheur ON chantier.societe = etancheur.societe
WHERE id_etancheur= :id_etancheur
0
Marion-Slr > Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
6 mars 2020 à 17:05
Je viens de voir que je le mette ou pas

ON chantier.societe = etancheur.societe 


ça me change rien du tout, j'ai aucune information qui apparait, je pense que je dois avoir un problème après.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > Marion-Slr
Modifié le 6 mars 2020 à 17:10
Fais
echo "id_etancheur = $id_etancheur";
pour voir quelle est sa valeur dans ta page, si elle est cohérente (il faudra enlever cette ligne ensuite).

Est-ce que tu utilises un outil externe pour faire des requêtes, comme phpMyAdmin ?
Si oui, essaie de copier cette requête en mettant un id_etancheur pour voir si tu obtiens quelque chose.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 6 mars 2020 à 23:21
Bonjour,

Beaucoup d'erreurs dans ton code.
Que ça soit dans le html, le css (que je ne traiterai pas ici), le php...

Voici ce que je te propose :
Déjà, au lieu de recopier X fois le code de connexion à ta bdd... place le dans un fichier à part
que tu n'auras qu'à inclure dans tes autres page.
Je t'invite, au passage, à activer les erreurs PDO
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

<?php
/**
* cnxBdd.php
*/

try{
  $bdd =new PDO('mysql:host=localhost; dbname=gestion_toiture; charset=utf8', 'root', '');
  // 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());
}
?>


Ensuite, histoire de sécuriser ton code, je te conseille de lire et d'appliquer les informations fournies ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Pour ton fichier de connexion
<?php

/* démarrage des sessions */
session_start(); // A PLACE AVANT TOUT AUTRE CODE PHP/HTML...

//activation de l'affichage des erreurs php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


/* Connexion */
require_once "cnxBdd.php";

//récupération PROPRE des variables AVANT de les utiliser
$mail = !empty($_POST['mail']) ? $_POST['mail'] : NULL;
$mdp = !empty($_POST['mdp']) ? $_POST['mdp'] : NULL;

if($mail && $mdp ){
 //préparation de la requête et des variables
 $sql = "SELECT * FROM etancheur WHERE mail= :mail AND mdp= :mdp";
 $datas = array(':mail'=>$mail, ':mdp'=>$mdp);
 //Execution de la requete
 try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
  
  if ($row = $requete->fetch(PDO::FETCH_ASSOC)){
   $_SESSION['prenom_nom'] = $row['prenom_nom'];
   $_SESSION['mail'] = $mail;
   $_SESSION['mdp'] = $mdp;
   $_SESSION['id_etancheur'] = $id_etancheur;
   header("Location: profiletancheur.php");

  }else {
   $erreur ="Identifiant ou Mot De Passe incorrect.";
  }  
 }catch(Exception $e){
  // en cas d'erreur :
  echo " Erreur ! ".$e->getMessage();
  echo " Les datas : " ;
  print_r($datas);
 }
} else {
 $erreur = "Tous les champs doivent être complétés !";
}

?>
<html>
 <head>
  <meta charset="utf-8">
  <!-- importer le fichier de style -->
  <link rel="stylesheet" href="styleconnexionetancheur.css" media="screen" type="text/css" />
 </head>
 <body>
  <div id= "container">
   <form method="POST" action="">
    <h1>Connexion</h1>
    <label><b>Mail : </b> </label>
    <input type="text" placeholder="Entrer votre mail" name="mail" value="<?php echo $mail;?>"/></p>
    <label> <b>Mot de passe :</b> </label>
    <input type="password" placeholder="Entrer votre mot de passe" name="mdp" /></p>
    <input type="submit" name='formconnexion' value="Se connecter" /></p>
    <button type="submit">Retour accueil</button>
    <div class="error">
     <?php
     if(!empty($erreur)){
      echo '<font color="red">'.$erreur."</font>";
     }
     ?>
    </div>
   </form>
  </div>
 </body>
</html>


Et ton fichier profil professionel :
<?php
/* démarrage des sessions */
session_start(); // A PLACE AVANT TOUT AUTRE CODE PHP/HTML...

//activation de l'affichage des erreurs php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


/* Connexion */
require_once "cnxBdd.php";

//inclusion de fichier de configuration
include('config.php'); // ?? qu'est-ce que c'est ??

//récupération PROPRE des variables AVANT de les utiliser
$mail = !empty($_SESSION['mail']) ? $_SESSION['mail'] : NULL;
$mdp = !empty($_SESSION['mdp']) ? $_SESSION['mdp'] : NULL;
$id_etancheur =  !empty($_SESSION['id_etancheur']) ? $_SESSION['id_etancheur'] : NULL;
$prenom_nom = !empty($_SESSION['prenom_nom']) ? $_SESSION['prenom_nom'] : NULL;

// si non connecté... retour à l'écran de connexion
if(!$mail){
  header('Location:accueil.php');
}

//récupération des ifnos chantiers
$sql = 'SELECT `responsable`
                   , chantier.`societe`
                   ,`adresse_toiture`
                   ,`nombre_capteur`
                   ,`adresse_bluetooth`
                   ,`nom_box`
                   ,`date_installation` 
           FROM `chantier` C
           JOIN etancheur E ON C.societe = E.societe
           WHERE E.id_etancheur = :id';

 $datas = array(':id'=>$id_etancheur);

 //Execution de la requete
 try{
    $requete = $bdd -> prepare($sql) ;
    $requete->execute($datas) ;
    $chantiers = $requete->fetchAll() // on stocke dans un array
 }catch(Exception $e){
    // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ;
    print_r($datas);
 }
?>
<html>
 <head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="styleprofiladministrateur.css" media="screen" type="text/css" />
  <style>
   #footer {
    position: absolute;
    botom: 0;
   }
  </style>
 </head>
 <body>  
  <div align="center">
   <h2>Profil de l'étancheur <?php echo $prenom_nom;?></h2>
   <br/>
   <br/>
   Mail : <?php echo $mail;?>
   <br/>
   <br/>
   <div class="table">
    <table border="3">
     <tr>
      <th>Responsable</th>
      <th>Société d'étanchéité</th>
      <th>Adresse toiture</th>
      <th>Nombre capteur</th>
      <th>Adresse bluetooth</th>
      <th>Nom de la Box</th>
      <th>Date d'installation</th>
     </tr>
    <?php
     if(!empty($chantiers)){
       foreach($chantiers as $C){
         echo "<tr>";
         foreach($C as $cellule){
            echo "<td>" . $$cellule . "</td>";
         }
         echo "</tr>";
       }
     }
    ?>
    </table>
   </div>
  </div>
  <div id="footer">
   <a href="deconnexion1.php">Se déconnecter</a>
  </div>
 </body>
</html>



Pour finir, à l'avenir, merci de poster ton code correctement en utilisant les balises de code ET en y précisant le langage
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
Bonjour,

Merci pour tes remarques.

Je vais modifier tout ça
0
Merci beaucoup mon problème est résolu.
0