PROBLEMA Login in PHP con connessione PDO a mysql

Pubblicità

micpap

Nuovo Utente
Messaggi
60
Reazioni
1
Punteggio
26
Ciao a tutti, è la prima volta che mi occupo di queste cose: ho un problema con la schermata di login di questo sito sviluppato in locale con xampp, è per un progetto dell'università. Avrò fatto degli errori su come impostare il risultato della query, perchè non mi reindirizza alla pagina corretta.

PHP:
<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

$_SESSION['username'] = $username;

$dbh = new PDO("mysql:dbname=iotredbamboo;host=localhost", "root", "");
$stmt = $dbh->prepare( 'SELECT * FROM `utenti` WHERE Username = :username AND Password = :password' );
$stmt->execute( array(':username' => $username, ':password' => $password) );
$risultato = $stmt->fetch(PDO::FETCH_ASSOC);

$NumeroRighe = $stmt -> rowCount();
$privilegi = mysql_result ($stmt, $NumeroRighe, "Privilegi");


if($NumeroRighe==1 && $privilegi==1){
    header('location:../view/Admin/HomeAdmin.php');

} else if($NumeroRighe==1 && $privilegi==0){
    header('location:../view/Utente/HomeUtente.php');

} else {
    header('location:../view/ErrorLogin.html');
}

Non riesco a venirne a capo..Grazie per le risposte :)
 
La funzione mysql_result è deprecata dalla versione 5.0.0 di php e rimossa definitivamente dalla versione 7.
Che versione di php utilizzi??
La 5.6.30.
Nel frattempo ho trovato una soluzione funzionante, ti chiedo se sia corretta o se c'è qualcosa di meglio, anche perchè dovrei cambiare il codice a diversi altri file che usano il mysql_result. Ad esempio ho usato il fetch(PDO::FETCH_NUM); per fare il controllo su $risultato[0] == "admin" ma in altri casi in cui ci sono più valori sarebbe utile riportare il nome dell'attributo restituito dalla query.

PHP:
<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

$_SESSION['username'] = $username;

$dbh = new PDO("mysql:dbname=iotredbamboo;host=localhost", "root", "");
$stmt = $dbh->prepare( 'SELECT * FROM `utenti` WHERE Username = :username AND Password = :password' );
$stmt->execute( array(':username' => $username, ':password' => $password) );
$risultato = $stmt->fetch(PDO::FETCH_NUM);

if ($risultato[0] == "admin") {
    header('location:../view/Admin/HomeAdmin.php');

} else if($risultato[0] == null) {
    header('location:../view/ErrorLogin.html');

} else {
    header('location:../view/Utente/HomeUtente.php');
}
 
usa un'array associativo (PDO::FETCH_ASSOC).

NB. Il confronto della password dovrebbe essere effettuato confrontando gli hash (le password vanno tassativamente criptate) utilizzando ad esempio password_verify

esempio:
PHP:
$stmt = $dbh->prepare('SELECT * FROM users WHERE username = :username');
$stmt->bindParam(':username', $username);
$stmt->execute();
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() === 1) {
    if (password_verify($password, $res[0]['password'])) {
        // SEI LOGGATO
    } else {
        // PASSWORD ERRATA
    }
} else {
    //NOME UTENTE ERRATO
}
 
Grazie mille per le dritte, ti chiedo un ultimo chiarimento perchè non mi è chiaro come mai quest'altro codice non funziona anche seguendo la stessa logica..
Un file:
PHP:
$stmt = $dbh->prepare( 'SELECT * FROM `ambienti` ORDER BY `ambienti`.`Username`' );
$stmt->execute();
$RisultatoAmbientiAdmin = $stmt->fetchAll(PDO::FETCH_ASSOC);

Altro file che include il precedente
PHP:
$NumeroRigheAmbientiAdmin = '';
$NumeroRigheAmbientiAdmin = $RisultatoAmbientiAdmin -> rowCount();
for($i=0; $i<$NumeroRigheAmbientiAdmin; $i++){
                                                             
           $idAmbiente = $RisultatoAmbientiAdmin[$i]['idAmbiente'];
                                                             
echo '<option>'; echo $idAmbiente; echo'</option>';
}

Dovrebbe stampare i vari id ma non visualizza niente, ne da errore
 
La query a prima vista è errata..
Che cosa devi ottenere e come è costruita la tabella??

La seconda parte del codice si può scrivere molto meglio.
 
La query a prima vista è errata..
Che cosa devi ottenere e come è costruita la tabella??

La seconda parte del codice si può scrivere molto meglio.
L'istruzione è corretta perchè eseguendola direttamente in phpmyadmin non ho problemi, comunque allego immagini di tabella e risultato che sarebbe il risultato della tabella ordinato.
Devo visualizzare quei valori ordinati, al momento ho inserito solo la stampa di idAmbiente nel for per vedere se funziona, dopo inserirò anche gli altri
 

Allegati

  • Risultato.webp
    Risultato.webp
    15.1 KB · Visualizzazioni: 43
  • Tabella.webp
    Tabella.webp
    14.9 KB · Visualizzazioni: 37
Effettivamente la query è corretta, anche se personalmente preferisco scriverla così:
Primo File:
PHP:
$stmt = $dbh->prepare('SELECT * FROM ambienti ORDER BY Username');
$stmt->execute();
$RisultatoAmbientiAdmin = $stmt->fetchAll(PDO::FETCH_ASSOC);

L'errore stà nel secondo file: non puoi utilizzare la funzione rowCount() su un'array.

Il codice del secondo file può essere estremamente migliore/semplice così:
PHP:
foreach ($RisultatoAmbientiAdmin as $AmbientiAdmin) {
    echo "<option>" . $AmbientiAdmin['idAmbiente'] . "</option>";
}
 
Pubblicità
Pubblicità
Indietro
Top