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

Simpel PHP SQL login fejlfinding

For det første er det meget vigtigt at håndtere fejlene under udviklingen, så vi tjekker om vores indlæg er til stede, vi tjekker om vi har oprettet forbindelse til databasen, vi tjekker om vores forespørgsel bestod og er OK at køre, vi tjekker de parametre vi giver til forespørgsel, og vi udfører endelig forespørgslen.

Derefter kan du bruge bind_result at navngive en variabel for at modtage felterne fra din forespørgsel, som jeg har gjort.

Bemærk, hvordan på min forespørgsel jeg bruger? det er en forberedt sætning, som vi definerer ved hjælp af bind_param dette er for at undgå SQL-injektion, i din nuværende kode er SQL-injektion stadig mulig, da du ikke renser dine variabler.

En anden fejl, jeg tror, ​​du laver, er at gemme adgangskoder som almindelig tekst, der er MEGET MEGET FORKERT. Du bør altid kryptere adgangskoden for at beskytte dine brugere og dig selv. Det er derfor, jeg ikke inkluderer adgangskoden på min MySQL-forespørgsel, jeg bruger først kun brugeren, hvis brugeren bliver fundet, bruger jeg så den adgangskode, han postede for at matche den hentede adgangskode fra databasen, i dette tilfælde bruger jeg bcrypt at udføre opgaven, som er et meget sikkert krypteringsbibliotek.

Se her hvordan man bruger bcrypt .

Først efter at jeg kan se, at adgangskoden er gyldig, placerer jeg dataene i sessionen og omdirigerer brugeren.

Udover alle de fejl, jeg har påpeget i bunden af ​​mit svar, er her, hvordan jeg ville skrive din kode.

<?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';
}

BEMÆRK:Ovenstående kode er kun et eksempel og blev ikke testet. Hvis du bemærker nogen fejl i den, så lad mig det vide.

Nogle af de fejl, jeg har bemærket på den kode, du har indsendt:

Du mangler den afsluttende ; herovre:

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

Også på din forespørgsel har du $Members men du har ingen $Members variabel defineret hvor som helst i din kode, mente du måske at sige Members i stedet som i:

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

Burde dette ikke

$count = mysql_num_rows($result);

Vær

$count = mysqli_num_rows($result);‌

Og

$result=mysqli_query($sql); 

Vær

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

Du har ingen forespørgsel på den nedenstående del af mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Jobkø som SQL-tabel med flere forbrugere (PostgreSQL)

  2. Hvordan henter man den aktuelle version af et MySQL-databasestyringssystem (DBMS)?

  3. Hvordan kan jeg løse ORA-00911:ugyldig tegnfejl?

  4. Hvad betyder <> i Oracle