8330 sujets

Développement web côté serveur, CMS

connecté
Bonjour,
Je butte depuis un moment sur un problème de récupération de données dans une base de données.
Le code suivant est en question :

<?php
$user_id = $_GET['id'];
$token = $_GET['token'];
require 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();
session_start();

if($user && $user_id->confirmation_token == $token ){
    $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]);
    $_SESSION['flash']['success'] = 'Votre compte a bien été validé';
    $_SESSION['auth'] = $user;
    header('Location: account.php');
}else{
    $_SESSION['flash']['danger'] = "Ce token n'est plus valide";
    header('Location: login.php');
}


C e code amène systématiquement le message d'erreur "Ce "token n'est plus valide"

Echo $user_id; me donne bien l'id transmise par l'URL
Par contre Echo $user me donne "array", je ne récupère donc pas un id.
Je ne vois pas l'erreur qui peut être commise dans la récupération de cette donnée, une erreur de syntaxe dans le code ?
La polarisation sur un problème doit finir par rendre aveugle!

Merci par avance pour votre aide
Patrick Mara
Bonjour, ce ne serait pas plutôt
if($user && $user->confirmation_token == $token ){
?
connecté
Bonjour,

Merci d'avoir prêté attention à mon sujet.

J'ai fait la correction mais le problème est toujours là.

Cordialement
Et tu as activé les erreurs PHP et SQL ? Tu as bien les bonnes données en GET ?
Modifié par comar91 (08 Apr 2021 - 13:53)
connecté
Bonjour,

Merci pour votre apport.

J'ai bien vérifier que les "get" sont corrects.
Qu'entendez-vous par activer les erreurs PHP-SQL? Mes compétences sur MySQL sont assez limitées.

Patrick Mara
pmara a écrit :
Bonjour,
Qu'entendez-vous par activer les erreurs PHP-SQL? Mes compétences sur MySQL sont assez limitées.

Patrick Mara


Bonjour,
lors de l'initialisation de ton objet pdo tu doit activer le rapport d'erreur pour que php te signal lorsqu'il y'aura des problèmes


<?php
ini_set('display_errors', 1);

$pdo = new PDO(...);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

...
...
connecté
Bonjour,

Merci.
Oui mais je met quoi dans PDO(...) ?

Je suis en début d'apprentissage, il faut bien me préciser les codes.

Cordialement
Patrick Mara
connecté
Bonjour,

Je crois que mon problème est dû a ce que je ne récupère pas dans la base données les données demandées :

$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');

  $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]);


dans :

<?php
$user_id = $_GET['id'];
$token = $_GET['token'];
require 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();
session_start();

if($user && $user->confirmation_token == $token ){
    $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]);
    $_SESSION['flash']['success'] = 'Votre compte a bien été validé';
    $_SESSION['auth'] = $user;
    header('Location: account.php');
}else{
    $_SESSION['flash']['danger'] = "Ce token n'est plus valide";
    header('Location: login.php');
}


Le recours à la base de données
require 'inc/db.php';


dont le code est :

 $host_name = 'xxxx.hosting-data.io';
  $database = 'xxxxx';
  $user_name = 'xxxxx';
  $password = 'xxxxxx';

$pdo = new PDO("mysql:host=$host_name; dbname=$database;", $user_name, $password); 

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);


A noter que l'écriture dans la base fonctionne parfaitement.

Je ne vois toujours pas où pourrait-être l'erreur.

Cordialement
Patrick Mara
Bonjour, donc pour moi c'est sur le résultat du fetch qu'il faut investiguer est-ce que $user a été récupéré ? Si c'est non, il faut vérifier $_GET['id']. Si c'est oui, il faut vérifier $_GET['token']. Dans tous les cas avec 2, 3 print_r tu devrais pouvoir debuguer
connecté
Bonjour,

N'arrivant pas à traiter le problème, j'ai développé un autre code pour récupérer dans la base de données les éléments d'un enregistrement.
En fait je lis la base de données jusqu'à l'enregistrement recherché.
Il y a certainement un PDO
($pdo->prepare("select * from users order by id")

plus "élégant" et rapide pour le faire, mais mes compétences en matière d'interrogation d'une BD sont assez limitées.

Voici le code développé qui fonctionne parfaitement :

<?php
    require_once 'inc/db.php';
	
	$demandeur_username = 'Nom Prenom';
	$demandeur_email = 'xxxx@yyyy.com';

   $ins = $pdo->prepare("select * from users order by id");
   $ins->setFetchMode(PDO::FETCH_ASSOC);
   $ins->execute();

$tab = $ins->fetchAll();

/*for($i=0;$i<count($tab);$i++){
      echo implode(" | ",$tab[$i])."<br />";
   }*/

   for($i=0;$i<count($tab);$i++){
/*
      echo $tab[$i]["id"]." | ".
      echo $tab[$i]["username"]." | ".
      echo $tab[$i]["email"]." | ".
      echo $tab[$i]["password"]." | ".
      echo $tab[$i]["remember_token"]." | ".
	  echo $tab[$i]["confirmation_token"]." | ".
	  echo $tab[$i]["confirmed_at"]." | ".
      echo $tab[$i]["reset_token"]." | ".	    
      echo$tab[$i]["reser_at"]."<br />";
*/

if( $demandeur_email == $tab[$i]["email"] ){ 

   $username = $tab[$i]["username"];
   $email = $tab[$i]["email"];
$confirmation_token = $tab[$i]["confirmation_token"];
 $confirmed_at = $tab[$i]["confirmed_at"]; 
break;} 

if( $demandeur_username == $tab[$i]["username"] ){ 

   $username = $tab[$i]["username"];
   $email = $tab[$i]["email"];
$confirmation_token = $tab[$i]["confirmation_token"];
 $confirmed_at = $tab[$i]["confirmed_at"]; 
break;} 

   } 
 
echo 'debut';
echo '<br>';
echo $username ;
echo '<br>';
echo $email ;
echo '<br>';
echo 'confirmation_token : ';
echo $confirmation_token ;
echo '<br>';
echo 'confirmed_at : ';
echo $confirmed_at ;
echo '<br>';

if(
($email == $demandeur_email)
&& 
($username == $demandeur_username)
&&
($confirmed_at != NULL)
)
{echo 'Tout est OK';}
else
{echo 'Ce n\'est pas OK';}

echo '<br>';
echo 'fin';
echo '<br>';

?>


Merci pour votre aide.
Patrick Mara