domande su php/mysql

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
Premetto che probabilmente dopo questa avrai l'istinto di menarmi... se supero la soglia fammi sapere che smetto di tartassarti di domande... (e magari mi risparmio le botte 0:) :gun: :eek:) comunque dalla tua stupenda guida (GUIDA PHP E MYSQL PRATICA):

Codice:
<?php
// inizializzazione della sessione
session_start();
// se la sessione di autenticazione 
// è già impostata non sarà necessario effettuare il login
// e il browser verrà reindirizzato alla pagina di scrittura dei post
if (isset($_SESSION['login']))
{
 // reindirizzamento alla homepage in caso di login mancato
 header("Location: gestisci.php");
} 
// controllo sul parametro d'invio
if(isset($_POST['submit']) && (trim($_POST['submit']) == "Login"))
{ 
  // controllo sui parametri di autenticazione inviati
  if( !isset($_POST['username']) || $_POST['username']=="" )
  {
    echo "Attenzione, inserire la username.";
  }
  elseif( !isset($_POST['password']) || $_POST['password'] =="")
  {
    echo "Attenzione, inserire la password.";
  }else{
    // validazione dei parametri tramite filtro per le stringhe
    $username = trim(filter_var($_POST['username'], FILTER_SANITIZE_STRING));
    $password = trim(filter_var($_POST['password'], FILTER_SANITIZE_STRING));
    $password = sha1($password);
    // inclusione del file della classe
    include "funzioni_mysql.php";
    // istanza della classe
    $data = new MysqlClass();
    // chiamata alla funzione di connessione
    $data->connetti();
    // interrogazione della tabella
    $auth = $data->query("SELECT id_login FROM login WHERE username_login = '$username' AND password_login = '$password'");
    // controllo sul risultato dell'interrogazione
        if(mysql_num_rows($auth)==0)
    {
        // reindirizzamento alla homepage in caso di insuccesso
          header("Location: index.php");
    }else{
          // chiamata alla funzione per l'estrazione dei dati
      $res =  $data->estrai($auth);
          // creazione del valore di sessione
      $_SESSION['login'] = $res-> id_login;
          // disconnessione da MySQL
          $data->disconnetti();
        // reindirizzamento alla pagina di amministrazione in caso di successo
          header("Location: gestisci.php");
    }
  } 
}else{
  // form per l'autenticazione
  ?>
<h1>Accesso all'amministrazione:</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Username:<br />
<input name="username" type="text"><br />
Password:<br />
<input name="password" type="password" size="20"><br />
<input name="submit" type="submit" value="Login">
</form>
  <?
}
?>


Ora vorrei sapere se ho ben capito;

Inizi una sessione in modo che se l'utente è già stato autentificato (tramite $_SESSION['login']) questo non ha bisogni di rifare il procedimento...(poiché $_SESSION['login'] sarebbe già "risultato" all'interno di isset.

Se $_SESSION['login'] ha valore (tramite l'oggetto prelevato da
$res->login) allora l'utente va nella pagina protetta della gestione (gestisci.php)

Controlli se i parametri inviati hanno valore ...altrimenti fai la loro validazione applicando il filtro contro un eventuale codice pericoloso all'interno di essi (in questo caso ad esempio <?php rcho 'prova' ?> non sarebbe riconosciuto - e la password viene criptata tramite la funzione sha1(valore) il quale restituisce una stringa di 40 caratteri e rende incodificabile la password dal database

A questo punto istanzi la classe contenente tutti i metodi precedentemente creati (ovviamente non presenti qui)

Richiami il metodo query (che precedentemente hai creato per istruire il db mysql) nel quale ti da come risultato tutti gli username che hanno quel $username AND come password quella $password
Domanda: Perchè SELECT id-login anziché SELECT id_login, password_login?

poiché il metodo query sopra citato lo hai messo all'interno di mysql_fetch_rows se questo non ti restituisce righe significa che non è stato autentificato e lo rispedisci alla home

altrimenti applichi mysql_fetch_object tramite il metodo estrai($auth) e quindi valorizzi con $res->id_login la $_SESSION['login'] che a questo punto ha valore e risponde true all'isset iniziale

Se $username e $password non sono stati inviati allora mostra il form per l'inserimento dei dati

altra domanda:

perché nel controllo sul parametro di invio hai messo
trim($_POST['submit']) //che senso togliere gli spazi e all'inizio della stringa del pulsante di invio?

Ti ringrazio di una tua eventuale risposta... se nn rispondi capisco di aver esagerato e grazie lo stesso

:book:
 
Credo che tu sia lo stesso Emanuele che mi ha contattato, dubbioso su quale linguaggio studiare :)
Comunque, in effetti, non ha senso (non sarebbe utile neanche controllarne il valore) però immagino che lo abbia scritto per abitudine mentale ;)
 
Domanda: Perchè SELECT id-login anziché SELECT id_login, password_login?
Perché come valore di sessione ho appunto l'id dell'utente, come puoi vedere successivamente
PHP:
$_SESSION['login'] = $res-> id_login;
Nella select non ho bisogno di estrarre altri campi, quello che mi interessa è effettuare un confronto tramite la clausola WHERE.

perché nel controllo sul parametro di invio hai messo
trim($_POST['submit']) //che senso togliere gli spazi e all'inizio della stringa del pulsante di invio?

Il controllo è molto più sensato di quanto non si creda, le clausole vincolano infatti l'accettazione degli altri parametri inviati per post ad una sola tipologia d'invio che deve essere effettuata tramite $_POST['submit'] il cui valore deve essere identico a "Login".
 
x alessandro 97: si si sono proprio io. Infatti ti volevo un po di cose ma rimando a un'altra volta(tra circa due settimane)....

x claudio... grazie delle risposte
 

Discussioni simili