Problème requête SQL
Résolu
Marion-Slr
-
Marion-Slr -
Marion-Slr -
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 :
Ma page profil professionel :
N'hésitez pas à me poser des questions si c'est pas très claire, je suis débutante en programmation.
Merci d'avance.
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.
A voir également:
- Problème requête SQL
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Jointure sql ✓ - Forum MySQL
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
3 réponses
Bonjour,
Dans ta requête
Il manque un
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 :
Xavier
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_etancheuravec 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
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
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
Et ton fichier profil professionel :
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
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
Pour ma requête, j'ai changé comme tu me l'as dis.
Cela donne
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.
ça me change rien du tout, j'ai aucune information qui apparait, je pense que je dois avoir un problème après.
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.