• User Attivo

    Forse si è accesa la lampadina... però mi potresti spiegare il codice che hai fatto... Intanto posto il mio lavoro e vedi se cosa c'è da modificare 🙂 Il codice nn da errore, ma viene visualizzata la pagina errore.php... Credo sia il fatto che nel database vi sia un valore nullo o 0 😕

    [PHP]
    $sql="SELECT ora_utilizzo_script FROM ore_utilizzo_script WHERE id='$id'";
    $query = @mysql_query ($sql) or die (mysql_error());

    while ($row = mysql_fetch_array($query)) {

    $ora_ultimo_inserimento="$row[ora_utilizzo_script]";
    Function calcolaOre($prima,$seconda)
    {
        $vettore1=explode(":",$prima);
        $vettore2=explode(":",$seconda);
        $diff=mktime($vettore2[0], $vettore2[1], 0,1,1,2000) - mktime($vettore1[0], $vettore1[1],0,1,1,2000);
        $minuti=floor($diff/60);
        return $minuti;
    }
    $ora_attuale=date("G:i");
    $differenza=calcolaOre($ora_ultimo_inserimento,$ora_attuale);
    if($differenza<60)
    {
    
    $deposito_aggiungivo = 3 * 2;
    
    $sql="UPDATE ore_utilizzo_script SET ora_utilizzo_script=$ora_attuale WHERE id='$id'";
        $query = @mysql_query ($sql) or die (mysql_error());
    
    $sql="UPDATE soldi_utente SET deposito_soldi=$deposito_aggiungivo WHERE id='$id'";
        $query = @mysql_query ($sql) or die (mysql_error());
    }
    else
    {
    	header('Location: ../errore.php');
    	exit;
    }[/PHP]

  • ModSenior

    Perche fai un while?
    Non ti basta sapere solo se l'ultimo inserimento (ordinato per data di inserimento) messo in confronto con l'ora attuale ti ritorna un valore in minuti maggiore di 60?

    Per quanto riguarda il codice.
    L'explode serve per trasformare l'ora in formato ore:minuti in un vettore.
    Si calcola poi la differenza in ore delle due date.
    Si divide per 60 e si ottengono i minuti.

    Ora io nel tuo script (se ho capito bene quello che vuoi fare, toglierei il while, e metterei una opportuna query di selezione.
    L'else resta cosi come è.
    Mentre l'if non deve mostrare il link a cui cliccando si va alla pagina di inserimento? (Cosa centra l'update? Sto capendo male?)


  • User Attivo

    Io sto seguendo una strada che è quella di impedire il caricamento del codice... cioè, il link viene visualizzato, e se lo premo esegue la pagina php ma, se non è passata l'ora o il tempo richiesto, vengo indirizzato a una pagina di errore...

    Il select iniziale e l'update finale li uso per salvare l'ora di inserimento e confrontarla a ogni click 🙂


  • ModSenior

    Ma l'inserimento in database non dovrebbe avvenire a script inserito?
    Cosi come è mi sembra venga sempre inserito.


  • User Attivo

    No... invece mi butta sempre sulla pagina di errore... Quindi prende l'ora sul database che è di standard 0 meno l'ora attuale (viene un numero negativo) e quindi da errore perché è nettamente minore di 0 😕

    Quindi il problema ora è il seguente:
    Come bisogna impostare il valore nel database al primo click?


  • User Attivo

    Ok... ho riletto il codice e ho sostituito il "<" con il ">"...
    E ora il database da questo errore...

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':34 WHERE id='3'' at line 1 ... Il valore 34 è il minuto dell'esecuzione del codice...


  • ModSenior

    Bene sembra allora che i minuti li stia prendendo no?


  • User Attivo

    Si, la definizione della differenza in minuti avviene, ho provato anche a modificare a mano il valore nel database e funziona come dovrebbe. Ma il problema è che quando va a scrivere il nuovo orario da quell'errore. Forse non accetta un carattere...

    comunque il database è configurato così:

    CREATE TABLE ore_utilizzo_script (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    ora_utilizzo_script TEXT NOT NULL
    ) ENGINE = MYISAM ;

    CREATE TABLE soldi_utente (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    deposito_soldi TEXT NOT NULL
    ) ENGINE = MYISAM ;


  • User Attivo

    Uppo in cerca di risposte 😕


  • ModSenior

    Il valore che tu scrivi direttamente ed è corretto come è scritto?


  • User Attivo

    Ricapitoliamo...

    Codice usato:

    [PHP]$sql="SELECT ora_utilizzo_script FROM ore_utilizzo_script WHERE id='$id'";
    $query = @mysql_query ($sql) or die (mysql_error());

    while ($row = mysql_fetch_array($query)) {

    $ora_ultimo_inserimento="$row[ora_utilizzo_script]"; 
    Function calcolaOre($prima,$seconda) 
    { 
        $vettore1=explode(":",$prima); 
        $vettore2=explode(":",$seconda); 
        $diff=mktime($vettore2[0], $vettore2[1], 0,1,1,2000) - mktime($vettore1[0], $vettore1[1],0,1,1,2000); 
        $minuti=floor($diff/60); 
        return $minuti; 
    } 
    $ora_attuale=date("G:i"); 
    $differenza=calcolaOre($ora_ultimo_inserimento,$ora_attuale); 
    if($differenza>60) 
    { 
     
    $deposito_aggiungivo = 3 * 2; 
    
    $sql="UPDATE ore_utilizzo_script SET ora_utilizzo_script=$ora_attuale WHERE id='$id'"; 
        $query = @mysql_query ($sql) or die (mysql_error()); 
    
    echo "
    $deposito_aggiungivo
    $ora_attuale";
     
    $sql="UPDATE soldi_utente SET deposito_soldi=$deposito_aggiungivo WHERE id='$id'"; 
        $query = @mysql_query ($sql) or die (mysql_error()); 
    } 
    else 
    { 
        header('Location: ../errore.php'); 
        exit; 
    } [/PHP]
    

    L'echo lo ho inserito per sapere che valori mi andava a scrivere... Ed ecco cosa mi dava la pagina internet dopo l'esecuzione del codice:

    6 14:48You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':48 WHERE id='3'' at line 1
    

  • User Attivo

    Grazie, consultando altri topic ho trovato risposta al problema... Bastava mettere delle ' '... Ringrazio il forum perché si rivela sempre una grande fonte di informazione 🙂


  • ModSenior

    Mannaggia era colpa degli apici?


  • User Attivo

    Si... pultroppo si... Però ora facendo girare lo script ho notato una cosa... E' difficile da spiegare e quindi faccio un esempio...

    Ora sono le 12:35...
    Se l'orario precedente è 11:00 (quindi 1 ora e 25 minuti prima) lo script viene eseguito...
    Se l'orario precedente è 14:00 (quindi 1 ora e 25 minuti dopo [quindi è del giorno prima]) lo script mi invia alla pagina di errore..

    Quindi se il salvataggio è del giorno prima, non esegue la differenza in modo corretto. Se il salvataggio è dello stesso giorno viene eseguito correttamente.


  • ModSenior

    Purtroppo non ho fatto i test quindi non saprei... visto che nel campo del database ci potresti salvare la data in formato now quindi estesa.
    Potresti effettuare il controllo di restrizione solo se il giorno in cui si fa la richiesta è diverso da quello salvato in database.
    In caso sia lo stesso giorno allora controlli i minuti di differenza.


  • User Attivo

    Il codice che mi hai fornito fa una vera e propria sottrazione (orario attuale - orario ultimo inserimento) e se l'orario precedente è minore di quello attuale la differenza sarà positiva mentre al contrario sarà negativa... Quindi basta mettere che che la differenza in valore assoluto deve essere maggiore di 60... Ora come ora l'if considera vero solo se la differenza è maggiore di 60 e è positiva... Ora la domanda è... Come si fa a considerare il 60 come un valore assoluto??


  • ModSenior

    In che senso valore assoluto?
    Se è negativo diventa positivo?


  • User Attivo

    Nel senso che guardiamo cosa facciamo fare all'"if"

    if($differenza>60)

    Se la differenza è un numero negativo darà errore...
    Se la differenza è un numero positivo e maggiore di 60 farò eseguire lo script...


  • ModSenior

    Beh ma questo accade solo quando il giorno è diverso o sbaglio?


  • User Attivo

    Allora... Per capire cosa nn va ho messo un echo di tutte le variabili...

    [PHP]
    echo "$differenza";
    [/PHP]

    Con varie prove ho visto che assume valori negativi... e nonostante maggiori di 60 l'if non lo riconosce perché vede un - prima del 60... Basta mettere che l'if non legga il possibile - prima del numero e il codice dovrebbe funzionare 🙂