Bloquer un compte membre après un certain temps d'inactivité

Résolu/Fermé
TUCS - 8 nov. 2019 à 18:34
 TUCS - 8 nov. 2019 à 21:13
Bonjour,

Je souhaiterai que les membres du site qui ne se sont pas connecté depuis un certain temps (3mois) soit temporairement bloqué. Un mail leur serait envoyé au moment du blocage pour qu'il puisse le débloquer.

Mon but est de faire une page qui réalise une boucle dans ma bdd où se trouve la date de la dernière connexion de chaque personne, fasse la différence entre auj et sa dernière connexion. Si ça fait plus que 100jours, ça change un chiffre dans la même bdd qui bloque le compte lors de la connexion.
Les codes ci-dessous calcule bien la différence mais je n'ai pas réussi à faire modifier l'information dans ma bdd. Si vous savez m'aider, je serais reconnaissant :)

PS: Lorsque j'ouvre la page comme elle est, je vois les jours d'inactivité mais rien ne se passe dans la bdd et pas d'erreur.

Voici mes codes:

<?php
    $host = 'db770114383.hosting-data.io';
    $database = 'db770114383';
    $username = 'dbo770114383';
    $password = '';
    try {
        $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }
?>
<?php 
 function dateDiff($date1, $date2){
    $host = 'db770114383.hosting-data.io';
    $database = 'db770114383';
    $username = 'dbo770114383';
    $password = '';
    try {
        $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }
   
    $diff = abs($date1 - $date2);
    $retour = array();
 
    $tmp = $diff;
    $retour['second'] = $tmp % 60;
 
    $tmp = floor( ($tmp - $retour['second']) /60 );
    $retour['minute'] = $tmp % 60;
 
    $tmp = floor( ($tmp - $retour['minute'])/60 );
    $retour['hour'] = $tmp % 24;
 
    $tmp = floor( ($tmp - $retour['hour'])  /24 );
    $retour['day'] = $tmp;
   	
    return $retour;
}   
  

$query = 'SELECT * FROM users WHERE autorisation="50" AND actif="0";';
    try {
    $reponse = $dbh->prepare($query);
    $reponse->execute();
    $NbreData = $reponse->rowCount();  // nombre d'enregistrements (lignes)
    $rowAll = $reponse->fetchAll();
    } catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
// --------------------------------
// affichage
if ($NbreData != 0) 
{
?>
  <table border=1 width=70% align="center" cellspacing=0 cellpadding=1>
  <thead>
    <tr><th colspan="3"><h2 class="partie2">Les membres:</h2></th></tr>
    <tr>
      <th><h3>ID</h3></th>
      <th><h3>Connexion</h3></th>
      <th><h3>Différence</h3></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
<?php
  // pour chaque ligne (chaque enregistrement)
  foreach ( $rowAll as $row ) 
  {
    // DONNEES A AFFICHER dans chaque cellule de la ligne
?>
    <tr>
      <td><?php echo $row['identifiant']; ?></td>
      <td><?php echo $row['connexion']; ?></td>
      <td><?php  $now = time();
				 $date2 = strtotime($row['connexion']);
				 print_r( dateDiff($now, $date2) );    			
	  ?></td>
      <td><?php if ($retour['day'] > 100) {
    echo 'Inactif  ';
    $actif = '1';	
    $ide = $row['identifiant'];
	$stmt = $dbh->prepare("UPDATE users SET actif=:actif WHERE identifiant=:identifiant");
    $stmt->bindParam(':actif', $actif);
    $stmt->bindParam(':identifiant', $ide);
    $stmt->execute();  
        }?></td>
    </tr>
<?php
  } } // fin foreach
?>
  </tbody>
  </table>


Configuration: Windows / Firefox 70.0
A voir également:

2 réponses

jordane45 Messages postés 38201 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 juin 2024 4 675
8 nov. 2019 à 19:13
Bonjour,

Il y a plus simple qu'une boucle....
Tu peux simplement faire ta requête UPDATE sur TOUS les utilisateurs qui ont leur date ''connexion''
inférieur à Aujourd'hui - 100 Jours

UPDATE `users` SET actif= 1
WHERE connexion <= NOW() - INTERVAL 100 DAY


Et au passage, vu que tu fais du PDO, active la gestion des erreurs PDO
Ainsi que l'affichage des erreurs PHP
et place CHAQUE requête dans un bloc TRY/CATCH

Je t'invite à lire ceci :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
et ça
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

0
Merci Jordane, si j'avais su qu'il y avait si simple... J'ai passé des heures avec une solutions tordues ahaha merci à toi, ça fonctionne à merveille :)
0
yg_be Messages postés 22853 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 5 juin 2024 1 473
8 nov. 2019 à 20:24
bonjour,
tu as négligé de nous indiquer si la ligne 85 affichait "inactif", ou pas.
il me semble que ton code calcule bien la différence, mais ne l'utilise pas.
ta ligne 84 est incorrecte, j'espère que tu auras un message d'erreur clair dès que tu auras appliqué les conseils de jordane45.
ajoute un
print_r($retour);
juste avant la ligne 84.
0
jordane45 Messages postés 38201 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 juin 2024 4 675
8 nov. 2019 à 20:55
Hello,
La ligne 84 n'existera plus dès lors qu'il appliquer la mise à jour en une seule requête au lieu de faire une boucle en php.
0