Je suis débutant en programmation et j'aurai besoin d'aide sur le problème suivant que je rencontre et dont je cherche la solution depuis plus d'une semaine.
J'ai réalisé dans un premier temps un espace membre qui fonctionne parfaitement est dont le code est le suivant :
<?php
require_once 'inc/functions_04.php';
reconnect_from_cookie();
if(isset($_SESSION['auth'])){
header('Location: account_04.php');
exit();
}
// ### Vérification de connection ###
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/db_04.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
$user = $req->fetch();
if(password_verify($_POST['password'], $user->password)){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
// ### Se souvenir de moi ###
if($_POST['remember']){
$remember_token = str_random(250);
$pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'monaccia'), time() + 60 * 60 * 24 * 7);
}
// ### On va à la page du compte utilisateur ###
header('Location: account_04.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
}
}
?>
<?php
if(session_status() == PHP_SESSION_NONE){
session_start();
}
?>
Je souhaiterais ajouté une fonction d'abonnement à ce code. Cet abonnement sur 13 mois doit finir à une date fixe donné par ma base de données dans la colonne "abon_end"
J'ai donc réalisé la fonction suivante :
<?php
// Ajouter/soustraire une période à une date
function periode_date(){
$aujourdhui = new DateTime(); // Date du jour auto
$date_fin = new DateTime('31-03-2018'); // A remplacer par une donnée (abon_end) de la bdd ???????
$temps_abonnement = new DateInterval('P13M'); // L'abonnement à une validité de 13 mois
if($aujourdhui->sub($temps_abonnement) < $date_fin)
{
echo 'Votre abonnement est à jour'; // Si la date du jour est < à la date de lancement (Ne rien mettre pour que le programme continue)
}
else
{
echo 'Veuillez renouveller votre abonnement'; // Si la date du jour est > à la date de lancement
}
}
?>
Ce que je n'arrive pas à faire c'est d'incorporer cette fonction au système de login et de replacer la variable fixe $date_fin = new DateTime('31-03-2018'); par la donnée de la colonne (abon_end) correspondant à l'utilisateur de la bdd.
Ce serait beaucoup plus simple de mettre la date de début d'abonnement dans la BDD, et de vérifier directement en SQL dans la requête si la date d'aujourd'hui est supérieure à la date enregistrée + 13 mois.
je vais regarder ça, mais ouf !!! cela à été laborieux, je viens de résoudre l'un de mes problèmes, l'incorporation de ma fonction d'abonnement dans mon programme de login.
Il me reste le problème de la variable $date_fin = new DateTime('31-03-2018'); qui doit être appelé depuis la bdd et là je suis perdu. J'ai tenté plusieurs solutions mais rien à faire.
Voici mon nouveau code :
<?php
require_once 'inc/functions_04.php';
reconnect_from_cookie();
if(isset($_SESSION['auth'])){
header('Location: account_04.php');
exit();
}
// ### Vérification de connection ###
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/db_04.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
$user = $req->fetch();
// Variables d'abonnement
$aujourdhui = new DateTime(); // Date du jour auto
$date_fin = new DateTime('31-03-2017'); // A remplacer par une donnée (abon_end) de la bdd ???????
//$pdo->prepare(SELECT * FROM users WHERE (username = :username OR abon_end = :username) AND confirmed_at IS NOT NULL);
$temps_abonnement = new DateInterval('P13M');
// Vérification mot de passe et abonnement
if(password_verify($_POST['password'], $user->password) AND ($aujourdhui->sub($temps_abonnement) < $date_fin)){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
// ### Se souvenir de moi ###
if($_POST['remember']){
$remember_token = str_random(250);
$pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'monaccia'), time() + 60 * 60 * 24 * 7);
}
header('Location: account_04.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect. A moins que votre abonnement ne soit pas à jour !';
}
}
?>
J'ai étudié TIMESTAMPDIFF() function comme tu me l'avais conseillé. En fait si j'ai bien compris avec cette fonction on compare une date de départ à une date d'arrivée ou en cours et on peut calculer le nombre de mois écoulés en ajoutant MONTH dans la fonction.
Fonction au demeurant intéressante et que je retiens pour un prochain développement, mais qui quelque part revient au même à ce que je fais, en ce qui concerne le résultat, et demande, quoi qu'il en soit, qu'il y ait une date définie dans la base de données.
La dernière solution que tu m'as donnée pour récupérer une date de ma base de donnée comme variable
$date_fin = new DateTime($user['abon_end']);
me revoie :
Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php:18 Stack trace: #0 {main} thrown in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php on line 17
J'ai fait des recherches sur cette Fatal error et je n'ai rien trouvé pour résoudre ce problème.
J'ai donc essayé une autre façon d'écrire :
$date_fin = $user->abon_end;
Là le programme va jusqu'au résultat, mais il me renvoi, que la date soit valide ou pas, que celle-ci n'est pas valable.
Je me demande si cela ne viendrait pas du format de la date de la base de donnée qui est en anglais (année, mois, jour) et que ma date du jour serait au format français (jour, mois, année). Si c'est le cas je ne vois pas comment faire pour résoudre ce nouveau problème.
C'est un vrai casse tête cette histoire... Merci d'avance pour une réponse qui pourrait débloquer mon problème.
lol alors je n'ai pas bien compris le fonctionnement de TIMESTAMPDIFF().
Ça fait un mois que je développe en PHP alors je nage encore...
Pour l'appelle à la base de données
$date_fin = new DateTime($user->abon_end);
ou
$date_fin = new DateTime($user['abon_end']);
me renvoie
Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php:18 Stack trace: #0 {main} thrown in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php on line 17
Je ne comprends pas pourquoi
Vraiment désolé de te solliciter une fois de plus.
Tu dois fetcher par défaut tes résultat en objets, donc ça peut être logique pour la deuxième version, par contre, ça ne me paraît pas possible pour la première.
Par ailleurs et tu avais raison la première fonction, j'avais oublié de passer en commentaire la seconde
C'est super cool ça fonctionne parfaitement, je ne sais pas comment te remercier, mille merci(ssssss....)
Serait-il possible de pouvoir garder le contacte au cas où je rencontrerais de nouvelles difficultés ? en sachant que je cherche vraiment la solution au problème avant d'appeler au secours.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
Mais bon, à mon avis, comme j'ai dit précédemment, tu réinventes la roue.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.