8330 sujets

Développement web côté serveur, CMS

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 ){
?
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)
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);

...
...
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
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
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
Bonjour Patrick, je veux bien essayer d'aider mais tu ne réponds pas aux questions, tu changes de code. Que veux-tu pour finir ?
Bonjour,

Veuillez accepter mes excuses, mais j'ai déjà répondu que les "get" étaient corrects.
echo $user donne "array" ?

Est ce que cela vous aide à cerner le problème ?

Merci
Patrick Mara
Donc as-tu vérifié que pour id = $_GET['id'] dans la table users, confirmation_token = $_GET['token'] comme je te l'ai suggéré ?
Bonjour,

J'ai vérifié que les données utilisées sont bien dans la base de données, que je récupère bien

$user_id = $_GET['id'];
$token = $_GET['token'];

Quels contrôles supplémentaires pourrais-je faire ?

Cordialement
Patrick Mara
Bonjour, comme déjà évoqué faire un print_r de $user et non un echo ?
Bonjour Patrick,

Je me permets une petite intervention en complément de ce qu'indique @comar91.

Il faut faire preuve de méthode lorsqu'on débogue son code PHP, et cette petite playlist de Grafikart m'avais donné un petit coup de pouce à l'époque. Elle date de 2017 mais elle reste toujours valable en 2021 Smiley smile

Lors du débogage en PHP, tes meilleurs alliés seront les fonctions var_dump() et die(). Si le problème de base est qu'une condition ne semble pas respectée, il faut comprendre pourquoi cette fameuse condition ne fonctionne pas comme attendu. L'idée, c'est donc d'afficher les valeurs des variables de la condition en amont.

Un simple var_dump() d'une variable suivi d'un die() permet généralement de comprendre pourquoi la condition renvoie false, et donc de corriger son code en conséquence.

Cette façon de procéder doit même devenir un automatisme, autant lors du développement d'un script que lors du débogage, ça évite bien des soucis.

Bon courage Smiley smile