Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfache Fehlerbehebung bei der PHP-SQL-Anmeldung

Erstens ist der Umgang mit Fehlern während der Entwicklung sehr wichtig, also prüfen wir, ob unsere Beiträge vorhanden sind, wir prüfen, ob wir eine Verbindung zur Datenbank hergestellt haben, wir prüfen, ob unsere Abfrage erfolgreich war und ausgeführt werden kann, wir prüfen die Parameter, die wir an die übergeben Abfrage und wir führen schließlich die Abfrage aus.

Danach können Sie bind_result verwenden um eine Variable zu benennen, um die Felder aus Ihrer Abfrage zu erhalten, wie ich es getan habe.

Beachten Sie, wie ich bei meiner Abfrage ? das ist eine vorbereitete Anweisung, die wir mit bind_param definieren Dies dient dazu, SQL-Injection zu vermeiden. In Ihrem aktuellen Code ist SQL-Injection immer noch möglich, da Sie Ihre Variablen nicht bereinigen.

Ein weiterer Fehler, den Sie meiner Meinung nach machen, ist das Speichern von Passwörtern als Klartext, der SEHR SEHR FALSCH ist. Sie sollten das Passwort immer verschlüsseln, um Ihre Benutzer und sich selbst zu schützen. Deshalb füge ich das Passwort nicht in meine MySQL-Abfrage ein, ich verwende zuerst nur den Benutzer, wenn der Benutzer gefunden wird, verwende ich dann das von ihm gepostete Passwort, um mit dem aus der Datenbank abgerufenen Passwort übereinzustimmen, in diesem Fall verwende ich bcrypt um die Aufgabe zu erledigen, die eine sehr sichere Verschlüsselungsbibliothek ist.

Siehe hier wie man bcrypt verwendet .

Erst nachdem ich sehe, dass das Passwort gültig ist, platziere ich die Daten in der Sitzung und leite den Benutzer um.

Neben all den Fehlern, auf die ich unten in meiner Antwort hingewiesen habe, würde ich Ihren Code folgendermaßen schreiben.

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

HINWEIS:Der obige Code ist lediglich ein Beispiel und wurde nicht getestet. Wenn Sie einen Fehler feststellen, lassen Sie es mich wissen.

Einige der Fehler, die mir in dem von Ihnen geposteten Code aufgefallen sind:

Ihnen fehlt das abschließende ; hier drüben:

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

Auch bei Ihrer Abfrage haben Sie $Members aber Sie haben keine $Members irgendwo in Ihrem Code definierte Variable, wollten Sie vielleicht Members sagen stattdessen wie in:

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

Sollte das nicht

$count = mysql_num_rows($result);

Sei

$count = mysqli_num_rows($result);‌

Und

$result=mysqli_query($sql); 

Sei

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

Sie haben keine Abfrage zum unteren Teil von mysqli_query

if (!mysqli_query($sql_connection))