Mysql
 sql >> Database >  >> RDS >> Mysql

Semplice risoluzione dei problemi di accesso PHP SQL

In primo luogo, la gestione degli errori durante lo sviluppo è molto importante quindi controlliamo se i nostri post sono presenti, controlliamo se ci siamo collegati al database, controlliamo se la nostra query è andata a buon fine ed è a posto, controlliamo i parametri che stiamo dando al query e infine eseguiamo la query.

Dopodiché puoi usare bind_result per nominare una variabile per ricevere i campi dalla tua query, come ho fatto io.

Nota come sulla mia query sto usando? questa è una dichiarazione preparata che definiamo usando il bind_param questo per evitare l'iniezione di SQL, nel tuo codice attuale, l'iniezione di SQL è ancora possibile poiché non stai disinfettando le tue variabili.

Un altro errore che credo tu stia facendo è memorizzare le password come testo normale che è MOLTO MOLTO SBAGLIATO, dovresti sempre crittografare la password per proteggere i tuoi utenti e te stesso. Ecco perché non includo la password nella mia query MySQL, prima utilizzo solo l'utente, se l'utente viene trovato quindi uso la password che ha pubblicato per abbinare la password recuperata dal database, in questo caso sto usando bcrypt per eseguire l'attività che è una libreria di crittografia molto sicura.

Vedi qui come usare bcrypt .

Solo dopo aver visto che la password è valida, sto quindi inserendo i dati nella sessione e reindirizzando l'utente.

Oltre a tutti gli errori che ho segnalato in fondo alla mia risposta, ecco come scriverei il tuo codice.

<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';

if (!isset($_POST['Username']))
{
    echo 'Fill in the username...';
    exit;
}

if (!isset($_POST['Password']))
{
    echo 'Fill in your password...';
    exit;
}

$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
    die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}

$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
    die('Query failed: (' . $con->errno . ') ' . $con->error);
}

if (!$result->bind_param('s', $_POST['Username']))
{
    die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}

if (!$result->execute())
{
    die('Execute failed: (' . $result->errno . ') ' . $result->error);
}

$result->store_result();
if ($result->num_rows == 0)
{
    die('No username found...');
}

$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();

$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
    $_SESSION['Username'] = $db_username;
    header('location:login_success.php');
    exit;
}
else
{
    echo 'Wrong Username or Password';
}

NOTA:il codice sopra è solo un esempio e non è stato testato, se noti qualche errore fammi sapere.

Alcuni degli errori che ho notato sul codice che hai pubblicato:

Manca il ; di chiusura qui:

$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"

Anche sulla tua richiesta hai $Members ma non hai $Members variabile definita in un punto qualsiasi del tuo codice, volevi forse dire Members invece, come in:

$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";

Non dovrebbe

$count = mysql_num_rows($result);

Sii

$count = mysqli_num_rows($result);‌

E

$result=mysqli_query($sql); 

Sii

$result=mysqli_query($sql_connection, $sql);

Non hai domande sulla parte sottostante di mysqli_query

if (!mysqli_query($sql_connection))