Bloquer un compte membre après un certain temps d'inactivité [Résolu]

- - Dernière réponse :  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
Afficher la suite 

2 réponses

Messages postés
26713
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 novembre 2019
1869
0
Merci
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 :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
et ça
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

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 :)
Commenter la réponse de jordane45
Messages postés
8865
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 novembre 2019
446
0
Merci
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.
jordane45
Messages postés
26713
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 novembre 2019
1869 -
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.
Commenter la réponse de yg_be