sql >> Databáze >  >> RDS >> Mysql

Jednoduché řešení problémů s přihlášením do PHP SQL

Za prvé, zpracování chyb během vývoje je velmi důležité, takže zkontrolujeme, zda jsou přítomny náš příspěvek, zkontrolujeme, zda jsme se připojili k databázi, zkontrolujeme, zda náš dotaz prošel a zda je v pořádku spustit, zkontrolujeme parametry, které dáváme dotaz a nakonec dotaz provedeme.

Poté můžete použít bind_result pojmenovat proměnnou pro příjem polí z vašeho dotazu, jako jsem to udělal já.

Všimněte si, jak na můj dotaz, který používám? to je připravený příkaz, který definujeme pomocí bind_param je to proto, aby se zabránilo vkládání SQL, ve vašem současném kódu je vkládání SQL stále možné, protože nedezinfikujete své proměnné.

Další chybou, kterou podle mě děláte, je ukládání hesel jako prostý text, což je VELMI VELMI ŠPATNÉ. Měli byste heslo vždy zašifrovat, abyste ochránili své uživatele i sebe. To je důvod, proč neuvádím heslo v mém dotazu MySQL, nejprve používám pouze uživatele, pokud je uživatel nalezen, pak použiji heslo, které zveřejnil, aby se shodovalo s heslem načteným z databáze, v tomto případě používám bcrypt k provedení úkolu, kterým je velmi bezpečná šifrovací knihovna.

Podívejte se zde jak používat bcrypt .

Teprve poté, co vidím, že heslo je platné, vložím data do relace a přesměruji uživatele.

Kromě všech chyb, na které jsem poukázal v dolní části své odpovědi, zde je návod, jak bych napsal váš kód.

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

POZNÁMKA:Výše ​​uvedený kód je pouze příklad a nebyl testován. Pokud si v něm všimnete nějaké chyby, dejte mi vědět.

Některé z chyb, které jsem zaznamenal v kódu, který jste zaslali:

Chybí vám koncovka ; tady:

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

Ve vašem dotazu máte také $Members ale nemáte žádné $Members proměnná definovaná kdekoli ve vašem kódu, možná jste chtěli říci Members místo toho, jako v:

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

Tohle by nemělo

$count = mysql_num_rows($result);

Buď

$count = mysqli_num_rows($result);‌

A

$result=mysqli_query($sql); 

Buď

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

Nemáte žádný dotaz na níže uvedenou část mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Jak získat každý N-tý řádek v MySQL

  2. Typy kurzoru SQL Server – pouze vpřed statický kurzor | Kurz SQL Server / Kurz TSQL

  3. Oracle Concurrent Manager – CP Analyzer pro E-Business Suite

  4. Nejste to vy, to jsem já (odstraňování problémů s I/O)