PROBLEMA Login in PHP con connessione PDO a mysql

micpap

Nuovo Utente
60
1
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 :)
 

cdtux

Utente Èlite
1,829
911
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
HDD
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
GPU
Gigabyte GTX1060 6GB
Monitor
Dell U2412M
PSU
Seasonic Focus Plus 650
Case
Corsair Graphite 760T
OS
Debian / Ubuntu
La funzione mysql_result è deprecata dalla versione 5.0.0 di php e rimossa definitivamente dalla versione 7.
Che versione di php utilizzi??
 

micpap

Nuovo Utente
60
1
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');
}
 

cdtux

Utente Èlite
1,829
911
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
HDD
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
GPU
Gigabyte GTX1060 6GB
Monitor
Dell U2412M
PSU
Seasonic Focus Plus 650
Case
Corsair Graphite 760T
OS
Debian / Ubuntu
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
}
 
  • Mi piace
Reazioni: elvan2 e micpap

micpap

Nuovo Utente
60
1
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
 

cdtux

Utente Èlite
1,829
911
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
HDD
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
GPU
Gigabyte GTX1060 6GB
Monitor
Dell U2412M
PSU
Seasonic Focus Plus 650
Case
Corsair Graphite 760T
OS
Debian / Ubuntu
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.
 

micpap

Nuovo Utente
60
1
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.png
    Risultato.png
    32.9 KB · Visualizzazioni: 43
  • Tabella.png
    Tabella.png
    32.3 KB · Visualizzazioni: 37

cdtux

Utente Èlite
1,829
911
CPU
I7 3770
Scheda Madre
Asrock Z77 Extreme 4
HDD
Samsung 850 pro 250GB
RAM
Corsair Vengeance LP 16GB
GPU
Gigabyte GTX1060 6GB
Monitor
Dell U2412M
PSU
Seasonic Focus Plus 650
Case
Corsair Graphite 760T
OS
Debian / Ubuntu
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>";
}
 
  • Mi piace
Reazioni: micpap

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili