Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Solução de problemas simples de login PHP SQL


Em primeiro lugar, lidar com os erros durante o desenvolvimento é muito importante, então verificamos se nosso post está presente, verificamos se nos conectamos ao banco de dados, verificamos se nossa consulta passou e está OK para executar, verificamos os parâmetros que estamos dando ao query e finalmente executamos a query.

Depois disso, você pode usar bind_result para nomear uma variável para receber os campos da sua consulta, como eu fiz.

Observe como na minha consulta estou usando? que é uma instrução preparada que definimos usando o bind_param isso é para evitar injeção de SQL, em seu código atual, a injeção de SQL ainda é possível, pois você não está higienizando suas variáveis.

Outro erro que acredito que você está cometendo é armazenar senhas como texto simples que é MUITO ERRADO, você deve sempre criptografar a senha para proteger seus usuários e você mesmo. É por isso que não incluo a senha na minha consulta MySQL, primeiro uso apenas o usuário, se o usuário for encontrado então uso a senha que ele postou para corresponder à senha recuperada do banco de dados, neste caso estou usando bcrypt para fazer a tarefa que é uma biblioteca de criptografia muito segura.

Veja aqui como usar bcrypt .

Somente depois de ver que a senha é válida estou colocando os dados na sessão e redirecionando o usuário.

Além de todos os erros que apontei na parte inferior da minha resposta, aqui está como eu escreveria seu código.
<?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';
}

OBSERVAÇÃO:o código acima é apenas um exemplo e não foi testado, se você notar algum erro, me avise.

Alguns dos erros que notei no código que você postou:

Você está perdendo o ; por aqui:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"

Também na sua consulta você tem $Members mas você não tem $Members variável definida em qualquer lugar em seu código, você talvez quis dizer Members em vez disso, como em:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";

Isso não deveria
$count = mysql_num_rows($result);

Ser
$count = mysqli_num_rows($result);‌

E
$result=mysqli_query($sql); 

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

Você não tem consulta na parte abaixo do mysqli_query
if (!mysqli_query($sql_connection))