Stergere cont dupa 24 ore in script inregistrare - logare

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
marosanadi
Mesaje:10

Stergere cont dupa 24 ore in script inregistrare - logare

Salutare nu stiu daca am postat unde trebuia vreau sa ma ajuti si pe mine daca se poate cu o problema am luat scriptul de logare membri de la tine si l-am editat dupa cum mi-a trebuit mie insa mai am nevoie de o optiune si anume vreau ca dupa ce s-a logat cineva sa i se streaga contul dupa 24 de ore automat din baza de date mai exact sa se stearga campul nume din tabela utilizatori.

Astept un raspuns multumesc pentru timpul acordat!

MarPlo Mesaje:4343
Incearca asa, in fisierul "class.Users.php", imediat sub aceste linii de cod:

Cod: Selectaţi tot

// deletes rows in the 'logattempt' table, older than 10 minutes
$sql = "DELETE FROM `logattempt` WHERE `dt`<$timexpir";
$this->sqlExecute($sql);
Adauga si pe acestea:

Cod: Selectaţi tot

// deletes rows in the 'users' table, older than 24 hours (24*3600 sec.)
$sql = "DELETE FROM `users` WHERE `dtreg`<".(time() - 86400);
$this->sqlExecute($sql);
 

marosanadi Mesaje:10
multumesc mult pentru raspuns

eu nu am fisierul "class.user.php" si am incercat sa pun acest cod in fiserul login.php dar nu functioneaza.

Codul din fiserul login.php este urmatorul:

Cod: Selectaţi tot

<?php
// De la https://marplo.net" target="_blank
/**
 * Urmatoarea functie sterge randurile din tabelul user_temp mai vechi de 10 min
 * verifica daca utilizatorul a incercat de mai multe ori autentificarea
 * daca a incercat deja de 3 ori fara nume-parola confirmate
 * solicita incercarea unei noi autentificari dupa 10 min
 */
 function temp_user($nume) {
  GLOBAL $conn;
  $data = time();
  $data_expir = $data-601;
  $ip = $_SERVER['REMOTE_ADDR'];

  /* Sterge randurile din tabelul user_temp mai vechi de 10 min */
  $sql = "DELETE FROM `user_temp` WHERE `data`<$data_expir";
  mysql_query($sql,$conn);

  /* Adauga slashuri (pentru nume), daca PHP nu e setat sa adauge implicit */
  if(!get_magic_quotes_gpc()) { $nume = addslashes($nume); }

  /* Verifica daca numle este in tabelul user_temp */
  $sql1 = "SELECT `nume`, `incercari`, `data` FROM `user_temp` WHERE `nume`='$nume'";
  $result = mysql_query($sql1,$conn);

  if(!$result || (mysql_numrows($result)<1)) {
    $sql1 = "INSERT INTO `user_temp` (nume, ip, data) VALUES ('$nume', '$ip', '$data')";
    mysql_query($sql1,$conn);
    return 'continua'; 
  }
  else {
    /* Gaseste nr. incercari asociata numelui */
    $tbarray = mysql_fetch_array($result);
    $incercari = $tbarray['incercari'];
    if ($incercari<3) {
      $incercari++;
      // incrementeaza nr. incercari cu 1 si actualizeaza data
      $sql1 = "UPDATE `user_temp` SET `incercari`='$incercari', `data`='$data' WHERE `nume`='$nume'";
      $result = mysql_query($sql1);
      return 'continua';
    }
    else if ($incercari>=3) {
      $timp = 600 - ($data - $tbarray['data']);
      return $timp;        // Indica nr. incercari depasit si returneaza timpul pt. calculare asteptare
    }
  }
}
 
/**
 * Urmatoarea functie verifica daca numele exista in baza de date
 * daca da, verifica daca parola se potriveste cu cea din baza de date
 * daca numele sau parola nu sunt corecte, returneaza eroarea (1 sau 2).
 * pentru nume si parola confirmate returneaza 0.
 */
function confirmUser($nume) {
 GLOBAL $conn;
  /* Adauga slashuri daca este necesar (pentru query) */
  if(!get_magic_quotes_gpc()) {
    $nume = addslashes($nume);
  }

  /* Verifica daca numle este in baza de date */
  $q = "SELECT nume, aprobat from `utilizatori` WHERE `nume`='$nume'";
  $result = mysql_query($q,$conn);
  if(!$result || (mysql_numrows($result)<1)) {
    return 1; //Indica nume neconfirmat
  }
    
    // Verifica daca utilizatorul este confirmat (aprobat 1)
    if ($dbarray['aprobat']==0) {
      return 3;    // Inregistrarea nu a fost aprobata
    }
    /* Verifica daca parola scrisa este aceeasi cu cea gasita in baza de date */
    else {
      return 2; // indica parola neconfirmata
    }
}

/**
 * Verifica autentificarea prin sesiune - daca utilizatorul este deja autentificat
 * verifica daca utilizatorul a fost memorat in cookie 
 * adaug o sesiune ca utilizatoru este logat
 * Apeleaza functia ce verifica daca datele din sesiune sunt corecte cu cele din baza de date
 * returneaza TRUE daca utilizatorul este autentificat.
 */
function checkLogin() {
  /* verifica daca utilizatorul este memorat in cookie */
  if(isset($_COOKIE['cookname'])) {
    $_SESSION['nume'] = $_COOKIE['cookname'];
  }

  /* verifica daca exista in sesiune numele si parola setate */
  if(isset($_SESSION['nume'])) {
    /* Confirma daca numele si parola sunt valide */
    if(confirmUser($_SESSION['nume'])) { $result = 'logat'; }
    else {
      /* daca variabilele sunt incorecte, sterge sesiunea, utilizatorul nu este logat */
      unset($_SESSION['nume']);
      $result = 'nelogat';
    }
    return $result;
  }
  /* Utilizatorul nu este logat */
  else { return 'nelogat'; }
}

/**
 * Determina daca va fi sau nu afisat formularul de autentificare
 * arata ca utilizatorul este autentificat, bazat pe variabilele din sesiune, sau mesajele de eroare
 */
function displayLogin($mesaj) {
  if(isset($_SESSION['nume']) && $mesaj=='logat') {
    $result = '<center>Codul dumneavoastra este: <b>'.$_SESSION['nume'].'</b>.<br /> <a href="logare/logout.php">Iesire cod</a></center>';
  }
  else if($mesaj=='nelogat') {
    // Afiseaza formularul
    $result = '<script src="logare/verific.js"></script><!--/ https://marplo.net" target="_blank /-->
<form action="'. $_SERVER['PHP_SELF']. '" method="post" onsubmit="return regcheck(this)">
<table align="center" border="0" cellspacing="0" cellpadding="1" width="270" style="border:1px solid #888888; padding:1px;">
  <tr><th colspan="2" align="center">Introduceti codul pe care l-ati primit prin sms!</th></tr>
  <tr><td><label for="nume">Cod SMS:&nbsp; </label><input type="text" name="nume" size="14" maxlength="30" id="nume" /></td>
  <td align="center"> &nbsp; <input type="submit" name="sublogin" value="Trimite cod" /></td></tr>
</table>
</form>';
  }
  else {
    $result = '<table align="center" bordercolor="red" border="1" cellspacing="0" cellpadding="2" width="270"><tr><td align="center">'. $mesaj. '</td></tr></table>';
  }
  return $result;
}

/**
 * Verifica daca numele si parola au fost trimise prin formularul de logare
 * daca da, verifica lungimea numelui si parolei, 
 * apoi datele in baza de date si creaza sesiunea
 */
if(isset($_POST['sublogin']) && isset($_POST['nume'])) {
  // Retinerea adresei (preluata din form) pt. revenire la pagina anterioara
  $inapoi = '<br/><b><a href="#" onClick="history.back()">Reveniti</a></b> la pagina anterioara.';

  // Elimina spatiile din marginile numelui si parolei
  $_POST['nume'] = trim($_POST['nume']);
  

  /* verifica daca toate campurile au fost completate */
  if(!$_POST['nume']){
    $eroare='Nu ati completat toate campurile'. $inapoi;
  }

  /* verifica lungimea numelui */
  else if(strlen($_POST['nume'])<3 || strlen($_POST['nume'])>32) {
    $eroare='Numele trebuie sa contina intre 3 si 32 caractere'. $inapoi;
  }

  else {
    // Verifica si adauga incercarea de logare in tabelul user_temp
    $continua = temp_user($_POST['nume']);

    if ($continua=='continua') {
            // Cripteaza parola
      /* verifica daca numele este in baza de date si parola este corecta */
      $result = confirmUser($_POST['nume']);

      /* Seteaza mesajul in cazul in care nume sau parola sunt incorecte */
      if($result==1) {
        $eroare='Codul <b>'. stripslashes($_POST['nume']). '</b> nu exista in baza de date.'. $inapoi. '<a href="logare/recuper.php">';
      }
      else if($result==0) {
        $eroare='Parola incorecta.'. $inapoi. '<br/>Daca ati uitat parola -> <a href="logare/recuper.php">Recuperare parola</a>';
      }
      else if($result==0) {
        die('<center><br /><br /><font color="red"><h3>Inregistrarea pt. <u>'. stripslashes($_POST['nume']). '</u> este neconfirmata.</h3></font> Verificati contul de e-mail folosit la inregistrare (inclusiv in Spamm) pt. mesajul cu link-ul de confirmare.<br /><br /> Daca doriti sa solicitati un nou e-mail de confirmare, <a href="logare/recuper.php?confirm=1">Click Aici</a></center>');
      }
      else {
        /* daca numele si parola sunt corecte, inregistreaza variabilele in sesiune */
        $_SESSION['nume'] = $_POST['nume'];
        

        /** Aici utilizatorul alege sa fie retinute datele pt.urmatoarea vizita
        * seteaza doua cookie-uri, unul care pastreaza numele si al doilea pt. parola
        * acestea expira in 100 de zile */
        if(isset($_POST['remember'])) {
          setcookie("cookname", $_SESSION['nume'], time()+60*60*24*1, "/");
          setcookie("cookpass", $_SESSION['parola'], time()+60*60*24*1, "/");
        }

        /* Auto redirect pentru a evita retrimiterea datelor cand da inapoi sau la refresh */
        echo '<meta http-equiv="Refresh" content="1;url='.$_SERVER['PHP_SELF'].'">';
        exit;
      }
    }
    else {
      // Seteaza mesajul cu timpul ramas pana la o noua incercare de autentificare
      $continua = floor($continua/60). ' minute, '. ($continua%60). ' secunde';
      $eroare = 'Ati depasit nr. incercari permise pt. a introduce codul. Puteti reincerca dupa <br /><b>'. $continua. '</b>'. $inapoi. '<br /><font color="blue"><a href="logare/recuper.php"></a></font>';
    }
  }
}

/* Seteaza variabila logged_in, care poate fi folosita in site pt. afisearea 
 * valoarea ei reprezinta ce va afisa in pagina, prin apelarea functiei displayLogin()
 * Daca exista vreo eroare, apeleaza functia cu acea eroare, altfel, o apeleaza cu rezultatul altei functii checkLogin(), care verifica autentificarea */
$logged_in = (isset($eroare)) ? displayLogin($eroare) : displayLogin(checkLogin());

@mysql_close();
?>

MarPlo Mesaje:4343
Codul pe care l-ai pus e dintr-o versiune mai veche a script-ului de inregistrare logare. Daca-l folosesti pe acela, incearca asa:
Imediat sub aceste linii de cod:

Cod: Selectaţi tot

/* Sterge randurile din tabelul user_temp mai vechi de 10 min */
$sql = "DELETE FROM `user_temp` WHERE `data`<$data_expir";
mysql_query($sql,$conn);
Adauga aceste linii:

Cod: Selectaţi tot

// Sterge randurile din tabelul utilizatori mai vechi de 24 ore
$sql = "DELETE FROM `utilizatori` WHERE cast( `data` AS unsigned )<".(time() - 86400);
mysql_query($sql,$conn);
 
Sau daca nu merge, incearca cu acestea:

Cod: Selectaţi tot

// Sterge randurile din tabelul utilizatori mai vechi de 24 ore
$sql = "DELETE FROM `utilizatori` WHERE `data`<".(time() - 86400);
mysql_query($sql,$conn);
 

marosanadi Mesaje:10
Salut multumesc inca odata pentru tot efortul pe care l-ai facut am incercat ambele coduri si nu functioneaza am schimbat doar timpul pentru test sa nu astept 24 de ore dar nu a functionat in phpmyadmin din tabela nu s-a sterg campul nume si in continuare se poate loga.
multumesc oricum pentru toate raspunsurile si daca crezi ca ar mai fi o metoda as vrea sa o stiu .

MarPlo Mesaje:4343
Nu stiu de ce nu merge, tocmai am testat pe un tabel de proba comanda:

Cod: Selectaţi tot

DELETE FROM `test` WHERE cast( `str` AS unsigned )<123456782
Si a sters toate randurile in care in coloana "str" era o valoare mai mica de 123456782.
- Alta metoda nu am.

marosanadi Mesaje:10
ai putea sa imi pui un pic codul care functioneaza la tine sau cum e construita baza de date
daca se poate desigur.

MarPlo Mesaje:4343
Deci, din phpMyAdmin a functionat comanda de mai sus, pe un tabel de test in care coloana 'str' e de tip VARCHAR(32), restul nu conteaza fiindca doar asta e pusa in conditia WHERE.
Din cate stiu, la acel script de logare, coloana 'data' e la fel, VARCHAR(32).

marosanadi Mesaje:10
salutare din nou
m-am uitat mai atent si scriptul functioneaza perfect pentru tabela "user_temp" insa in tabela "utilizatori" eu nu am campul "data" si am incercat sa modific fiserul "creaza_tabel.php" si sa pun sa creeze si campul "data " insa dupa aceea nu se alimenteaza cu date. Am incercat sa fac asa :

Cod: Selectaţi tot

$sql = "SELECT `nume`, `data` FROM `user_temp` WHERE `nume`='$nume'";
  $result = mysql_query($sql1,$conn);
  if(!$result || (mysql_numrows($result)<1)) {
 $sql = "DELETE FROM `utilizatori` WHERE cast( `data` AS signed )<".(time() -5);
mysql_query($sql,$conn);
insa tot nu mi-a mers sterge numai din tabela user_temp si din utilizatori nu.

MarPlo Mesaje:4343
Vezi ce tip e coloana 'data' in "utilizatori", sau in ce coloana din acest tabel e adaugata data inregistrarii, si ce tip are.
Poate tipul coloanei e problema.

marosanadi Mesaje:10
Acesta este codu dincreaza_tabel.php:

Cod: Selectaţi tot

<?php
header("Content-type: text/html; charset=utf-8");

include("bazadb.php");		// Include fisierul pt. conectare-selectare baza de date

// Creaza tabelul utilizatori
$sql = "CREATE TABLE `utilizatori` (nume VARCHAR(32), aprobat DECIMAL(1,0) DEFAULT 1, data VARCHAR(32),id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) CHARACTER SET utf8 COLLATE utf8_general_ci"; 
if (mysql_query($sql))
    echo '<br /><br /><br /><center><h4>Tabelul <u>utilizatori</u> a fost creat.</h4></center><br />'; 
else 
  echo '<br /><br /><br /><center><h4>Tabelul <u>utilizatori</u> nu a putut fi creat deoarece - '. mysql_errno(). ' : '. mysql_error(). '</h4></center>'; 

// Creaza tabelul user_temp
$sql2 = "CREATE TABLE `user_temp` (nume VARCHAR(32), incercari DECIMAL(1,0) DEFAULT 0, ip VARCHAR(18), data VARCHAR(32), id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) CHARACTER SET utf8 COLLATE utf8_general_ci"; 
if (mysql_query($sql2))
    echo '<br /><br /><br /><center><h4>Tabelul <u>user_temp</u> a fost creat.</h4></center><br />'; 
else 
  echo '<br /><br /><br /><center><h4>Tabelul <u>user_temp</u> nu a putut fi creat deoarece - '. mysql_errno(). ' : '. mysql_error(). '</h4></center>'; 
  
mysql_close(); 
?>
Timpul este VARCHAR(32) insa nu situ de ce nu se alimenteaza automat cu data si ramane null.

MarPlo Mesaje:4343
Data e adaugata in coloana 'data' cand se face inregistrarea.
Nu stiu de ce adauga null, daca ai facut modificari, tu stii. Ai formula de Delete si cum trebuie aplicata, mai departe o poti testa, vezi unde merge, unde nu, pana functioneaza.
Scriptul e facut de mult, nu ma mai bag pe el, este deja o alta versiune mai noua.
Ca sa nu mai adauge null, poti face coloana cu aceste date: data VARCHAR(32) NOT NULL DEFAULT '0' .