sql >> Database >  >> RDS >> Mysql

Eenvoudige PHP SQL-aanmeldingsproblemen oplossen

Ten eerste is het afhandelen van de fouten tijdens de ontwikkeling erg belangrijk, dus we controleren of onze post aanwezig is, we controleren of we verbinding hebben met de database, we controleren of onze query is geslaagd en goed kan worden uitgevoerd, we controleren de parameters die we aan de query en we voeren de query uiteindelijk uit.

Daarna kunt u bind_result . gebruiken om een ​​variabele een naam te geven om de velden van uw zoekopdracht te ontvangen, zoals ik heb gedaan.

Merk op hoe ik op mijn vraag gebruik? dat is een voorbereide verklaring die we definiëren met behulp van de bind_param dit is om SQL-injectie te voorkomen, in uw huidige code is SQL-injectie nog steeds mogelijk omdat u uw variabelen niet opschoont.

Een andere fout die je volgens mij maakt, is het opslaan van wachtwoorden als platte tekst. Dat is HEEL HEEL VERKEERD. Je moet het wachtwoord altijd versleutelen om je gebruikers en jezelf te beschermen. Daarom neem ik het wachtwoord niet op in mijn MySQL-query, ik gebruik eerst alleen de gebruiker, als de gebruiker wordt gevonden, gebruik ik het wachtwoord dat hij heeft gepost om overeen te komen met het opgehaalde wachtwoord uit de database, in dit geval gebruik ik bcrypt om de taak uit te voeren die een zeer veilige coderingsbibliotheek is.

Zie hier hoe bcrypt te gebruiken .

Pas nadat ik zie dat het wachtwoord geldig is, plaats ik de gegevens in de sessie en stuur ik de gebruiker door.

Naast alle fouten die ik onderaan mijn antwoord heb genoemd, zou ik uw code als volgt schrijven.

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

OPMERKING:de bovenstaande code is slechts een voorbeeld en is niet getest, laat het me weten als je een fout opmerkt.

Enkele van de fouten die ik heb opgemerkt in de code die je hebt gepost:

Je mist de afsluitende ; hier:

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

Ook op uw vraag heeft u $Members maar je hebt geen $Members variabele ergens in je code gedefinieerd, bedoelde je misschien Members in plaats daarvan, zoals in:

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

Zou dit niet

$count = mysql_num_rows($result);

Wees

$count = mysqli_num_rows($result);‌

En

$result=mysqli_query($sql); 

Wees

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

U heeft geen vraag over het onderstaande deel van de mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Hoe het MySQL-rootwachtwoord opnieuw in te stellen

  2. Wat is het verschil tussen utf8_general_ci en utf8_unicode_ci?

  3. Anatomie van een rol bij softwareontwikkeling:gegevenswetenschapper

  4. Geen geldige maand tijdens het invoegen van gegevens in oracle