Ajout d'informations de session dans une Base de données

Fermé
marcelpeju22 Messages postés 8 Date d'inscription samedi 10 octobre 2015 Statut Membre Dernière intervention 9 mars 2016 - 2 mars 2016 à 23:34
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 - 10 mars 2016 à 00:50
Bonjour,

J'essaie d'ajouter des infos d'une session dans ma base de données et comme je suis un peu débutant, je rencontre quelques difficultés. En fait, j'ai une table où les gens peuvent entrer des infos sur un service qu'ils pourraient donner (service_titre, service_categorie, service_description) et j'aimerais ajouter ID_user qui serait le champ "username" d'une autre table qui s'appelle "users" et qui comporte des infos personnelles des utilisateurs. Bref, je veux lier les deux tables et entrer le nom de l'utilisateur dans la table "services" au champ ID_user à partir d'une session ouverte de façon automatique, sans que l'usager aie à entrer son nom d'utilisateur.

J'arrive bien à entrer les services, mais ça bloque au ID_users. J'ai remis le code à zero, sans toutes mes tentatives à intégrer les infos de session. Auriez-vous des suggestions?

Voici le code :

<?php 
$reponse = $bdd->query("SELECT * FROM users WHERE username = '" . $_SESSION['username'] . "'");
while ($donnees = $reponse->fetch())
{
echo $donnees['prenom']." ". $donnees['nom']." ". $donnees['quartier']." ". $donnees['codepostal']." ". $donnees['ville'];
}

?>


<hr />


<?php
if(isset($_POST['submit']))
{
$service_titre = htmlspecialchars (trim($_POST['service_titre']));
$service_categorie = htmlspecialchars (trim($_POST['service_categorie']));
$service_description = htmlspecialchars (trim($_POST['service_description']));
$ID_users = htmlspecialchars (trim($_POST['ID_users']));


try {
$conn = new PDO('mysql:host=localhost;dbname=phpmembre;charset=utf8', 'root', '');
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO services(ID, service_titre, service_categorie, service_description, ID_users)
VALUES ('','$service_titre','$service_categorie','$service_description','$ID_users')";
// use exec() because no results are returned
$conn->exec($sql);
echo 'Votre nouveau service a été enregistré avec succès!</a>';
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}

$conn = null;

}
?>


<h1>Ajouter un service</h1>
<form method="post" action="editer-profil.php">

<table id="inscription">
<tr>
<td>
<p>*Votre service</p>
<input type="text" name="service_titre" />
</td>
<td>
<p>*Catégorie</p>
<select type="text" name="service_categorie" />
<option value="1">Choisir</option>
<option value="art">Art</option>
<option value="finances">finances</option>
<option value="manuel">Traveaux manuels</option>
</select>
</td>
</tr>
<tr>
<td>
<p>*Description</p>
<input type="textarea" name="service description" />
</td>
<td></td>
</tr>

</table>
<hr />


<br /><br />

<input type="submit" name="submit" value="Valider" />

</form>


Merci!

3 réponses

jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
3 mars 2016 à 10:40
Bonjour,

1 - Tu as le code de connexion à ta BDD au milieu du code ... alors que tu fais une requête SELECT au début du fichier ..... ??

2 - Ta varaible $ID_user provient de :
$ID_users = htmlspecialchars (trim($_POST['ID_users']));

Sauf que tu n'a aucun champ ID_user dans le formulaire HTML


3 - Pour valider le formulaire en restant sur la même page ... modifie
action="editer-profil.php">
par
action="">

0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
Modifié par jordane45 le 3/03/2016 à 12:05
Je suppose que $ID_user est en fait une variable que tu as en SESSION non ?

Essayes ce code :


Déjà.. place la connexion de ta BDD dans un fichier à part
que tu n'auras qu'à inclure dans les pages où tu en auras besoin.
<?php 
// Fichier cnxBDD.php
//-------------------------------//

//pour afficher les erreurs php:
error_reporting(E_ALL);

try {
  $conn = new PDO('mysql:host=localhost;dbname=phpmembre;charset=utf8, 'root, '');
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo $sql . "<br>" . $e->getMessage();
}





Ensuite, voici ton code corrigé :
<?php
//demarrage des SESSION
session_start();

//pour afficher les erreurs php:
error_reporting(E_ALL);

//connexion à la BDD en incluant le fichier cnxBDD.php
require_once "cnxBDD.php";


//récupération propre des variables POST :
$service_titre = isset($_POST['service_titre']) ? htmlspecialchars (trim($_POST['service_titre'])) : NULL;
$service_categorie = isset($_POST['service_categorie']) ? htmlspecialchars(trim($_POST['service_categorie'])) : NULL;
$service_description = isset($_POST['service_description']) ? htmlspecialchars(trim($_POST['service_description'])) : NULL;

$ID_users = isset($_SESSION['ID_users']) ? $_SESSION['ID_users'] : NULL;

//Traitement du submit
if(isset($_POST['submit'])){
  $sql = "INSERT INTO services(service_titre, service_categorie, service_description, ID_users)
        VALUES (:service_titre,:service_categorie,:service_description,:ID_users)";
  $a_datas = array(":service_titre"=>$service_titre 
                 ,":service_categorie"=>$service_categorie 
         ,":service_description"=>$service_description 
         ,":ID_users":=>$ID_users 
         );
 try{
    $prepare = $conn->prepare($sql); 
   $prepare->execute($a_datas);
  echo 'Votre nouveau service a été enregistré avec succès!</a>';
 }catch (PDOException $e) {
    echo "<br>Erreur : ".$e->getMessage();
 }
}
// fin du PHP
?>
<!-- debut code html -->


<h1>Ajouter un service</h1>
<form method="post" action="editer-profil.php">
 <table id="inscription">
  <tr>
   <td>
    <p>*Votre service</p>
    <input type="text" name="service_titre" value="<?php echo $service_titre;?>" />
   </td>
   <td>
    <p>*Catégorie</p>
    <select type="text" name="service_categorie" />
     <option value="1" <?php if($service_categorie == "1"){echo "selected='selected' ";}?>>Choisir</option>
     <option value="art" <?php if($service_categorie == "art"){echo "selected='selected' ";}?>>Art</option>
     <option value="finances"<?php if($service_categorie == "finances"){echo "selected='selected' ";}?> >finances</option>
     <option value="manuel" <?php if($service_categorie == "manuel"){echo "selected='selected' ";}?> >Traveaux manuels</option>
    </select>
   </td>
  </tr>
  <tr>
   <td>
    <p>*Description</p>
    <input type="textarea" name="service_description" value="<?php echo $service_description;?>">
   </td>
   <td></td>
  </tr>
 </table>
 <hr>
 <br><br>
 <input type="submit" name="submit" value="Valider">
</form>





Cordialement, 
Jordane                                                                 
0
marcelpeju22 Messages postés 8 Date d'inscription samedi 10 octobre 2015 Statut Membre Dernière intervention 9 mars 2016
6 mars 2016 à 22:41
Bonjour,

Désolé pour le délais. Ça ne fonctionne pas encore et je crois que j'aurais certains détails à spécifier.

D'abord, voici le code d'ouverture de ma session
<?php
session_start();
if(isset($_SESSION['username']))
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=phpmembre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}


Ici, 'username' correspond au courriel que l'usager doit entrer avec son mot de passe afin de se connecter. Il y a donc un champ 'username' dans la table 'users' de ma base de données. Ce que je cherche à faire, c'est un joint entre mes deux tables pour que le service corresponde à l'usager de la session. ID_users est un champ qui se trouve dans la table 'services' et c'est ce champ qui doit faire le pont. Je lui ai donné un type INT. Toutes les informations du formulaire entre bien dans la base de données, mais pas ce champ.

Aussi, j'ai essayé le code que vous m'avez proposé et je reçois le message d'erreur suivant : Fatal error: Call to a member function prepare() on null in /Applications/XAMPP/xamppfiles/htdocs/becsphp/editer-profil.php on line 126. La ligne 126 correspond à celle-ci :
try{
$prepare = $conn->prepare($sql);
$prepare->execute($a_datas);


Merci!
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704 > marcelpeju22 Messages postés 8 Date d'inscription samedi 10 octobre 2015 Statut Membre Dernière intervention 9 mars 2016
7 mars 2016 à 20:33
Dans un code tu as utilisé la variable $conn lors de la connexion à la BDD ... et maintenant .. tu nous dis utiliser $bdd ....
Faut te décider ... et adapter le code en conséquence !
0
marcelpeju22 Messages postés 8 Date d'inscription samedi 10 octobre 2015 Statut Membre Dernière intervention 9 mars 2016
6 mars 2016 à 23:45
Ok, je ne sais pas pourquoi je n'y ai pas pensé avant, mais en fait, ce que je dois faire, c'est faire une requête de jointure à ma base de données. Cependant, je ne sais pas trop comment et où intégrer cette requête. si j'ai bien compris, elle devrait ressembler à ça :
SELECT * 
FROM services
JOIN users
ON services.ID_users = users.ID


Mais bon, je m'approche je crois, mais ce n'est pas encore tout à fait ça. Aussi, il faut vraiment que le ID_users que je vais entrer soit le ID de la session en cours.

Des idées?
0
marcelpeju22 Messages postés 8 Date d'inscription samedi 10 octobre 2015 Statut Membre Dernière intervention 9 mars 2016
Modifié par jordane45 le 10/03/2016 à 00:37
Bonjour jordane45,

Après avoir changé $conn pour $bdd et $_SESSION['ID_users'] pour $_SESSION['username'] et deux autres ID_users, je suis finalement arrivé à ce que je voulais au départ. Comme on dit par chez nous, je vais me coucher moins niaiseux ce soir.

Mais je me dit qu'il serait peut-être mieux que j'entre plutôt le "id" de ma table users que le "username" J'imagine que rendu là, ça de doit pas être trop compliqué, mais comme mes connaissances sont encore un peu limitées, j'aurais encore besoin d'un peu d'aide sur ce dossier.

Voici mon code:
<?php 
$reponse = $bdd->query("SELECT * FROM users WHERE username = '" . $_SESSION['username'] . "'");
while ($donnees = $reponse->fetch()) 
{ 
echo $donnees['prenom']." ". $donnees['nom']." ". $donnees['quartier']." ". $donnees['codepostal']." ". $donnees['ville']; 
} 

?> 



<hr />



<?php
error_reporting(E_ALL);
?>

<?php
//récupération propre des variables POST :
$service_titre = isset($_POST['service_titre']) ? htmlspecialchars (trim($_POST['service_titre'])) : NULL;
$service_categorie = isset($_POST['service_categorie']) ? htmlspecialchars(trim($_POST['service_categorie'])) : NULL;
$service_description = isset($_POST['service_description']) ? htmlspecialchars(trim($_POST['service_description'])) : NULL;

$ID_users = isset($_SESSION['username']) ? $_SESSION['username'] : NULL;



//Traitement du submit
if(isset($_POST['submit'])){
  $sql = "INSERT INTO services(service_titre, service_categorie, service_description, username_users)
        VALUES (:service_titre,:service_categorie,:service_description,:username)";
  
  $a_datas = array(":service_titre"=>$service_titre 
                 ,":service_categorie"=>$service_categorie 
         ,":service_description"=>$service_description 
         ,":username"=>$ID_users 
         );
 try{
    $prepare = $bdd->prepare($sql); 
   $prepare->execute($a_datas);
  echo 'Votre nouveau service a été enregistré avec succès!</a>';
 }catch (PDOException $e) {
    echo "<br>Erreur : ".$e->getMessage();
 }
}
// fin du PHP
?>


Je ne sais pas si ça peux aider, mais voici ma connexion :
<?php
session_start();
if(isset($_SESSION['username']))
{
try
{
$bdd = new PDO('mysql:host=localhost;dbname=phpmembre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}



$reponse = $bdd->query("SELECT * FROM users WHERE username = '" . $_SESSION['username'] . "'");

?>

<?php
}else{
header('Location:login.php');
}

while ($donnees = $reponse->fetch())
{
echo "Bonjour " .$donnees['prenom'];
}

?>


Merci pour toute cette aide!
0
jordane45 Messages postés 38300 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 novembre 2024 4 704
Modifié par jordane45 le 10/03/2016 à 00:50
*
Commence par mettre la connexion à ta BDD dans un fichier à part que tu n'auras qu'à inclure
dans les page où tu en as besoin.
Par exemple :
<?php
// affichage des erreurs php
 error_reporting(E_ALL);
 
// Fichier de connexion à la BDD : cnxBDD.php
try{ 
  $bdd = new PDO('mysql:host=localhost;dbname=phpmembre', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
 } catch (PDOException $e) {
      echo "<br>".$e."<br>";
      printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
      exit('Impossible de se connecter à la base de données.');
  }
?>


Puis dans ton code de connexion de l'utilisateur

<?php
 // affichage des erreurs php
 error_reporting(E_ALL);
 
 //demarrage des sessions
 session_start();
 
 //connexion à la bdd
 require_once "cnxBDD.php";
 
 //récupération "propre" des variables AVANT de les utiliser
  $username = isset($_SESSION['username']) ? $_SESSION['username'] : NULL;
 
 if($username){

 //Utilisation des requêtes préparées
 // Ca protège, entre autres choses, contre les failles d'injection sql
 $sql = "SELECT * FROM users WHERE username = :username ";
 $a_datas = array(":username"=>$username );
 try{
      $prepare = $bdd->prepare($sql);
   $prepare->execute($a_datas);
   //on stocke le résultat dans un array
   $donnees = $prepare->fetchAll();
    } catch (Exception $e) { 
       echo 'Erreur : ' . $e->getMessage(); 
       exit();
    }
    
    //On boucle sur l'array de résultat
    foreach($donnees as $R) { 
       echo "Bonjour " .$R['prenom'];
    }
 
 }else{
   header('Location:login.php');
   exit(); //faire un exit après un header location.
 }
?>


Je te laisse corriger ton autre page en prenant celle là comme exemple.
0