sql >> Databasteknik >  >> RDS >> Mysql

Enkel PHP SQL-inloggningsfelsökning

För det första är det mycket viktigt att hantera felen under utvecklingen så vi kontrollerar om vårt inlägg finns, vi kontrollerar om vi anslutit till databasen, vi kontrollerar om vår fråga gick igenom och är OK att köra, vi kontrollerar parametrarna vi ger till fråga och vi kör äntligen frågan.

Efter det kan du använda bind_result att namnge en variabel för att ta emot fälten från din fråga, som jag har gjort.

Lägg märke till hur på min fråga jag använder ? det är en förberedd sats som vi definierar med bind_param detta är för att undvika SQL-injektion, i din nuvarande kod är SQL-injektion fortfarande möjligt eftersom du inte sanerar dina variabler.

Ett annat misstag jag tror att du gör är att lagra lösenord som vanlig text som är VÄLDIGT VÄLDIGT FEL, du bör alltid kryptera lösenordet för att skydda dina användare och dig själv. Det är därför jag inte inkluderar lösenordet på min MySQL-fråga, jag använder först bara användaren, om användaren hittas använder jag sedan lösenordet han postade för att matcha det hämtade lösenordet från databasen, i det här fallet använder jag bcrypt för att utföra uppgiften som är ett mycket säkert krypteringsbibliotek.

Se här hur man använder bcrypt .

Först efter att jag ser att lösenordet är giltigt lägger jag in data i sessionen och omdirigerar användaren.

Förutom alla fel jag har påpekat längst ner i mitt svar, så här skulle jag skriva din kod.

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

OBS:Ovanstående kod är bara ett exempel och testades inte. Om du märker något fel med den, låt mig veta det.

Några av felen jag har lagt märke till på koden du har lagt upp:

Du saknar den avslutande ; här borta:

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

Även på din fråga har du $Members men du har inga $Members variabel definierad var som helst i din kod, menade du kanske att säga Members istället, som i:

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

Borde inte detta

$count = mysql_num_rows($result);

Vara

$count = mysqli_num_rows($result);‌

Och

$result=mysqli_query($sql); 

Vara

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

Du har ingen fråga på den nedanstående delen av mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Skapa tabellnamn som är reserverade ord/sökord i MS SQL Server

  2. Följ med mig tisdagen den 9 april för de senaste Microsoft Access-nyheterna

  3. Hur kan jag räkna antalet ord i en sträng i Oracle?

  4. MySQL vs MongoDB 1000 läser