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))