En primer lugar, el manejo de los errores durante el desarrollo es muy importante, por lo que verificamos si nuestra publicación está presente, verificamos si nos conectamos a la base de datos, verificamos si nuestra consulta pasó y está bien para ejecutarse, verificamos los parámetros que estamos dando al consulta y finalmente ejecutamos la consulta.
Después de eso puedes usar bind_result
para nombrar una variable para recibir los campos de su consulta, como lo he hecho.
Observe cómo en mi consulta estoy usando ? esa es una declaración preparada que definimos usando el bind_param
esto es para evitar la inyección de SQL, en su código actual, la inyección de SQL aún es posible ya que no está desinfectando sus variables.
Otro error que creo que está cometiendo es almacenar contraseñas como texto sin formato que es MUY MUY INCORRECTO, siempre debe cifrar la contraseña para proteger a sus usuarios y a usted mismo. Es por eso que no incluyo la contraseña en mi consulta de MySQL, primero uso solo el usuario, si se encuentra el usuario, luego uso la contraseña que publicó para que coincida con la contraseña recuperada de la base de datos, en este caso estoy usando bcrypt
para hacer la tarea que es una biblioteca de cifrado muy segura.
Solo después de ver que la contraseña es válida, coloco los datos en la sesión y redirijo al usuario.
Además de todos los errores que he señalado al final de mi respuesta, así es como escribiría su 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';
}
NOTA:El código anterior es simplemente un ejemplo y no se probó, si nota algún error, hágamelo saber.
Algunos de los errores que he notado en el código que has publicado:
Te estás perdiendo el cierre ;
aquí:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
También en su consulta tiene $Members
pero no tienes $Members
variable definida en cualquier parte de su código, ¿quizás quiso decir Members
? en cambio, como en:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
¿No debería esto
$count = mysql_num_rows($result);
Ser
$count = mysqli_num_rows($result);
Y
$result=mysqli_query($sql);
Ser
$result=mysqli_query($sql_connection, $sql);
No tiene ninguna consulta en la parte inferior de mysqli_query
if (!mysqli_query($sql_connection))