[Problema] OOP e PHP

  • Pagine ({1}):
  • 1
  • 2
  • »
Il php indemoniato è tornato Soso

Allora, da un po' di giorni mi sono interessato all'OOP di php, e arrivando dall'API di Bukkit non ho mai avuto l'occasione di approfondire la programmazione ad oggetti, avendo tutto già pronto... Quindi, ho deciso di convertire i miei script php da stile procedurale ad oggetti. Ho già fatto il login in procedurale, ma adesso che provo a trasformarlo in oop trovo alcune difficoltà... Ho 3 file:

  1. login_class.php , dove è contenuta la classe e i metodi per il login. 
  2. newlogin.php , dove elaboro con i metodi creati nel file precedente i file provenienti dal form di login.
  3. login.php , la pagina dove è presente il form.
login_class.php:

Codice:
<?php
    // Classe di login
    class Login {
        
        // Parametri utilizzabili
        public $username = "";
        public $password = "";
        
        // Metodo di controllo del login. Richiede username e password (non criptata)
        public function log_ver($username , $password) {
            // Rimozione dei caratteri pericolosi (SQL)
            $this->$username = mysql_real_escape_string($username);
            $this->$password = mysql_real_escape_string($password);
            // Criptazione della password
            $this->$password = sha1($password);
            // Query di ricerca per record con username e password uguali a quelli inseriti
            $result = mysql_query("SELECT * FROM users WHERE USERNAME='$username' AND PASSWORD='$password'");
            // Conta i risultati della query
            $riga = mysql_num_rows($result);
            // Crea un array con i risultati della query
            $fetch = mysql_fetch_array($result);
            // Se trova corrispondenze
            if ($riga > 0){
                
                // Recupero dell'ip
                $ip = $_SERVER['REMOTE_ADDR'];
                // Prende l'ID dell'utente da trasferire alla variabile di sessione
                $id = $fetch["ID_USER"];
                // Query di update, che modifica i campi desiderati
                mysql_query("UPDATE users SET last_login = '".time()."', last_ip = '$ip', accesso = '1' WHERE ID_USER = '$id'");
                // Variabile di sessione, è l'id dell'utente loggato
                $_SESSION["id"] = $id;
                // Restituisce true
                return true;
            } else {
                
                // Se non trova corrispondenze, restituisce false
                return false;
            }
        }
    }
?>

newlogin.php:

Codice:
<?php
    session_start();
    include 'login_class.php';
    // Recupero di username e password tramite POST
    $username = htmlentities($_POST['username']); 
    $password = htmlentities($_POST['password']);
    $connessione = mysql_connect("*******", "*****", "******");
    mysql_select_db("login", $connessione);
    // Creazione dell'istanza della classe Login
    $login = new Login;
    // Eseguo il metodo log_ver
    $login->log_ver($username , $password);
    // Reindirizzamenti
    if($login->log_ver){
        header("location: private.php");
    } else {
        echo $username ;
        echo $password ;
        //header("location: login.php?msg=".urlencode("error"));
    }
?>

Quando provo a loggarmi, innanzitutto restituisce false, perchè mi stampa username e password(non criptata, quindi non passata nel metodo). in più, da questo errore:
Citazione:Notice: Undefined property: Login::$log_ver in C:\xampp\htdocs\test\newlogin.php on line 14

Non so cosa dire, a me sembra tutto giusto, voi riuscite a trovare il problema ?? Ho dei dubbi sul modo in cui ho gestito il true/false... non va bene vero ? Help !

P.S: La riga 14 è questa:
Codice:
if($login->log_ver){
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
log_ver è un metodo della tua classe non è una variabile e richiede 2 parametri, pertanto devi usarla in questo modo:

Codice:
if($login->log_ver($var1, $var2)){
25/01/2014, 20:21Krongrah ha scritto: log_ver è un metodo della tua classe non è una variabile e richiede 2 parametri, pertanto devi usarla in questo modo:

Codice:
if($login->log_ver($var1, $var2)){

ma por.... è vero, che stupido .-. Lo sapevo e non l'ho fatto.... 

Ok, adesso quella parte va bene, ma c'è ancora un altro problema. Continua a restituirmi false, anche se username e password sono corretti... Il codice è lo stesso del procedurale, ma non funziona... hai qualche idea ? (la query è giusta, testata su phpmyadmin)
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
25/01/2014, 20:33MCinemaGamer ha scritto:
25/01/2014, 20:21Krongrah ha scritto: log_ver è un metodo della tua classe non è una variabile e richiede 2 parametri, pertanto devi usarla in questo modo:

Codice:
if($login->log_ver($var1, $var2)){

ma por.... è vero, che stupido .-. Lo sapevo e non l'ho fatto.... 

Ok, adesso quella parte va bene, ma c'è ancora un altro problema. Continua a restituirmi false, anche se username e password sono corretti... Il codice è lo stesso del procedurale, ma non funziona... hai qualche idea ? (la query è giusta, testata su phpmyadmin)



Fai un echo della query prima di farla per sicurezza.

Poi secondo me puoi sostiture:

Codice:
$this->$password = mysql_real_escape_string($password);
// Criptazione della password
$this->$password = sha1($password);

Con solo:

Codice:
// Criptazione della password
$this->$password = sha1($password);

tanto quando fai lo sha1 non ci sono più caratteri strani.

E in ogni caso stavi sbagliando perché avresti dovuto fare:

Codice:
$this->$password = mysql_real_escape_string($password);
// Criptazione della password
$this->$password = sha1($this->$password);
@Krongrah , non capisco, per qualche oscuro motivo non cripta la password... ecco perchè non trova corrispondenze, cerca la password in chiaro ma trova solo hash criptati... hai qualche idea ?
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
@Krongrah non devi usare $this->$password!!!
Se la password fosse foobar salverebbe la roba crittata in $this->foobar Wink
25/01/2014, 21:36pietro98th ha scritto: @Krongrah non devi usare $this->$password!!!
Se la password fosse foobar salverebbe la roba crittata in $this->foobar Wink

Ti aspettavo <3 Quindi come devo criptare ? 

Io direi di fare una roba simile:
Codice:
$this->$password = sha1($this->$password);
$pass_query = $this->$password;

Provo e vi informo !
-------------------------------------------------------------------------------------------------

Ok ragazzi, risolto !! Era:
Codice:
$password = sha1($this->$password)
(Modificato 25/01/2014, 21:44 da MCinemaGamer.)
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
@MCinemaGamer sono da cell...
Comunque non devi usare $this->$password, ma $this->password!
Come ho detto prima, se la password è foobar con il tuo codice verrà salvata in $this->foobar...
25/01/2014, 21:50pietro98th ha scritto: @MCinemaGamer sono da cell...
Comunque non devi usare $this->$password, ma $this->password!
Come ho detto prima, se la password è foobar con il tuo codice verrà salvata in $this->foobar...

Non ho idea del perchè ma... se provo a fare $password = sha1($this->password); non funziona... metre se faccio $password = sha1($this->$password) funziona...
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
Dipende da come l'hai inizializzata la variabile, se l'hai inizializzata con $this->$password è ovvio che non funziona...
Magari posta la classe...
25/01/2014, 21:59pietro98th ha scritto: Dipende da come l'hai inizializzata la variabile, se l'hai inizializzata con $this->$password è ovvio che non funziona...
Magari posta la classe...

E' tutto nel primo messaggio Smile
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
Anche nell'assegnazione delle variabili non devi usare $this->$password...
Ricordati che la sintassi equivale a chiamare una variabile $$nome...
25/01/2014, 22:18pietro98th ha scritto: Anche nell'assegnazione delle variabili non devi usare $this->$password...
Ricordati che la sintassi equivale a chiamare una variabile $$nome...

Capito, grazie del chiarimento Smile Domani ci lavoro ancora, a mente lucida, se ho ancora problemi uppo il post !
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
@pietro98th, copia-incollato male Asd

Scusate, ho letto velocemente perché stavo uscendo di casa e l'errore è qui:

$result = mysql_query("SELECT * FROM users WHERE USERNAME='$username' AND PASSWORD='$password'");

Nella query  stai usando le variabili "non trattate" dalle funzioni di escape e dallo sha1 per questo ti ritorna FALSE, la query darà 0 righe.

Ecco @MCinemaGamer http://pastebin.com/sVV4tgFa
@Krongrah e @pietro98th , vorrei capire se le variabili vengono passate al metodo per valore o per riferimento... Quando eseguo il metodo sull'istanza della classe, esso userà i valori che ho immesso no ? quindi non basta scrivere $password = sha1($password) ? 

P.S: @Krongrah , ho visto il codice, ma vorrei togliermi questo dubbio.
"È come se ci fossimo dimenticati chi siamo, Donald: esploratori, pionieri. Non dei guardiani."

"Un tempo per la meraviglia alzavamo al cielo lo sguardo sentendoci parte del firmamento, ora invece lo abbassiamo preoccupati di far parte del mare di fango."

- Cooper (Interstellar)
  • Pagine ({1}):
  • 1
  • 2
  • »
Discussioni simili
Risposta di Topo4321
15/02/2016, 23:29
 
[Problema] Hosting PHP
Risposta di Fedisse
24/06/2015, 12:23
Risposta di HAlexTM
08/04/2015, 16:52
 
[Problema] OwnCloud for php 5.2
Risposta di RealFantasy
26/12/2014, 16:44

Utente(i) che stanno guardando questa discussione: 1 Ospite(i)