[PHP] login con la classe medoo.in

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
43
Massa, Italy
Salve, ho scritto semplice script per autenticazione utente..
Mi da solo un errore essendo che sto convertendo un codice scritto in mysql, con la classe medoo.in che è fantastica.. l'unico che mi da un errore se provo ad sbagliare password e nome..

PHP:
<?php include($_SERVER["DOCUMENT_ROOT"] . '/inc.php'); ?>
<?php include("theme/header.php"); ?>
  <table align="center" bgcolor="#CCCCCC" border="0" cellpadding="0"
  cellspacing="1" width="300">
  <tr>
    <td>
      <form method="post" name="">
        <table bgcolor="#FFFFFF" border="0" cellpadding="3"
        cellspacing="1" width="100%">
        <tr>
          <td align="center" colspan="3"><strong>User
            Login</strong></td>
          </tr>
          <tr>
            <td width="78">Username</td>
            <td width="6">:</td>
            <td width="294"><input id="username" name=
              "username" type="text"></td>
            </tr>
            <tr>
              <td>Password</td>
              <td>:</td>
              <td><input id="password" name="password" type=
                "password"></td>
              </tr>
              <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td><input name="submit" type="submit" value=
                  "Login"> <input name="reset" type="reset" value=
                  "reset"></td>
                </tr>
              </table>
            </form>
          </td>
        </tr>
      </table>
      <?php
      if (isset($_POST['submit']))
      {
        session_start();
        $username=$_POST['username'];
        $password=$_POST['password'];


          $datas = $db->select("login", [
            "username",
            "password"
        ], [
            "username" => $username,
          "password" => $password
        ]);
            foreach($datas as $data)
          {
              $_SESSION['login_user']=$data["username"];
          }
        if ($data != 0)
        {
          echo "<script language='javascript' type='text/javascript'> location.href='home.php' </script>";
        }
        else
        {
          echo "<script type='text/javascript'>alert('User Name Or Password Invalid!')</script>";
        }
      }
?>
<?php include("theme/footer.php"); ?>

Mi da l'errore su $data != 0

PHP:
 foreach($datas as $data)
          {
              $_SESSION['login_user']=$data["username"];
          }
        if ($data != 0)
        {
          echo "<script language='javascript' type='text/javascript'> location.href='home.php' </script>";
        }
        else
        {
          echo "<script type='text/javascript'>alert('User Name Or Password Invalid!')</script>";
        }
      }

avete idea come posso risolvere il problema? Grazie mille ..

sto usando xampp windows 7.1.15 php.

grazie e buona settimana.
 
if ($data != 0)
{
echo
"<script language='javascript' type='text/javascript'> location.href='home.php' </script>";
}
Non è definita in quanto l'hai utilizzata dinamicamente all'interno del foreach e non fuori; quindi invece di scrivere $data!=0 dovresti scrivere la logica di login in modo un pò differente, del tipo:
  • Salvare la password con un qualche algoritmo d hashing (va bene anche md5 sha1 sha256 etc...)
  • Effettui la select solo sull'username e non sulla tupla username-password
  • Recuperi la password dal db, elabori la password inviata $_POST['password']
  • Confronti le password, se ok continui, altrimenti hai sbagliato qualcosa.
Devi prevedere:
  1. Username non trovato
  2. Username vuoto
  3. Username valido
  4. Password vuota
  5. Password errata
  6. Password corretta
Per essere elegante controllerei anche le sessioni, in caso di login da più dispositivi. Tornando al tuo problema potresti scrivere così:
PHP:
 $datas = $db->select("login", [
            "username",
            "password"
        ], [
            "username" => $username
        ]);

$result=['status'=>'no_login','code'=>401];

//verifico se esiste l'username cercato
//ipotizzo che al massimo con la stessa user esista un solo utente, quindi per forza maggiore dovrò
//avere un solo risultato in posizione $datas[0]
if(isset($datas[0]['password'])){
//confronto le password
    if($datas[0]['password']==$password){
//se sono uguali ok
        $result=['status'=>'success','code'=>200];
    }else $result=['status'=>'error','code'=>401,'reason'=>'password errata'];

}else{
 //username non trovato
$result=['status'=>'error','code'=>401,'reason'=>'username errata'];
}

//per le sessioni::::::

if($result['status']=='success'){
//sessione utente ok
}else{
//sessione utente not ok
}
 
ok, ti ringrazio molto.. ma come faccio ad settare le sessioni ? vorrei login_user etc.. ora sto provando poi dopo metto sicurezza etc.. solo che con medoo.in , non si trova tanti esempi .. ma c'è solo la documentazione online. Grazie mille e buona giornata.

EDIT: E poi come posso fare stampare gli errori?
Grazie
 
solo che con medoo.in , non si trova tanti esempi ..
Se vedi nella documentazione di medoo ci sono tutti i metodi che servono

PHP:
//errori
$conn->error();

//se vuoi fare il debug
$conn->debug()->select();

//log azioni etc..
$conn->log();
Hai tutto il materiale nella documentazione, per errori inerenti a PHP
PHP:
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
 
Scusa se rispondo solo oggi, per comodità io lavoro con risposte asincrone, quindi eredito spesso questa scrittura....
Nel tuo sistema di template dovrai prevedere dei break-point per eventuali messaggi così da dare feedback visivo all'utente.
tipo
HTML:
<tr>
    <td>
      <form method="post" name="">
        <table bgcolor="#FFFFFF" border="0" cellpadding="3"
        cellspacing="1" width="100%">
        <tr>
          <td align="center" colspan="3"><strong>User
            Login</strong></td>
          </tr>
          <tr>
            <td width="78">Username</td>
            <td width="6">:</td>
            <td width="294"><input id="username" name=
              "username" type="text">
              <?php
                if($status['code']!=200){
                      echo $status['reason']['username']
                 }
               ?>
</td>
            </tr>
            <tr>
              <td>Password</td>
              <td>:</td>
              <td><input id="password" name="password" type=
                "password">
                  
<?php
                if($status['code']!=200){
                      echo $status['reason']['password']
                 }
               ?>
</td>
              </tr>
              <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td><input name="submit" type="submit" value=
                  "Login"> <input name="reset" type="reset" value=
                  "reset"></td>
                </tr>
Più o meno quella è la risposta dell'elaborazione e quindi dovresti modificare il form più o meno in questo modo!
Visto che hai utilizzato medoo.in (cosa che non può altro che farmi piacere), ti invito a darti una letta al pattern mvc, e/o quantomeno all'utilizzo di un Template Engine, così da separare Viste (pagine html) dai modelli (connessione / elaborazione dati). Ti segnalo Smarty o Blade, e una piccola spiegazione qui con l'utilizzo di Smarty.
 

Discussioni simili