Simple solución de problemas de inicio de session PHP SQL

Intento crear un inicio de session de PHP muy básico recuperando un nombre de usuario / contraseña registrado de una database. Esto no va a funcionar nunca y soy consciente de que no hay validation de input. Todo lo que trato de hacer es seleccionar datos de una database en un inicio de session.

Aquí está el formulario de inicio de session en index.html:

<table width="250" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> <tr> <form name="form1" method="post" action="checklogin.php"> <td> <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> <tr> <td colspan="3"><strong>Member Login </strong></td> </tr> <tr> <td width="78">Username</td> <td width="6">:</td> <td width="294"><input name="Username" type="text" id="Username"></td> </tr> <tr> <td>Password</td> <td>:</td> <td><input name="Password" type="text" id="Password"></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td><input type="submit" name="Submit" value="Login"></td> </tr> </table> </td> </form> </tr> </table> 

Y aquí está el PHP checklogin.php:

  <?php $sql_connection = mysqli_connect ("localhost:8889","root","root","derek_website_tmp"); if (mysqli_connect_errno()) { echo "failed to connect" . mysqli_connect_error(); } $Username=$_POST['Username']; $Password=$_POST['Password']; $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'" $result=mysqli_query($sql); $count = mysql_num_rows($result); if ($count==1) { $_SESSION['Username'] = $Username; $_SESSION['Password'] = $Password; header('location:login_success.php'); } else { echo 'Wrong Username or Password'; } if (!mysqli_query($sql_connection)) { die('Error : ' . mysqli_error($sql_connection)); } mysqli_close ($sql_connection); ?> 

Cuando bash esto obtengo un error al recuperar checklogin.php Cualquier ayuda sería muy apreciada.

En primer lugar, es muy importante manejar los errores durante el desarrollo, así que verificamos si nuestra publicación está presente, comprobamos si nos conectamos a la database, comprobamos si nuestra consulta pasó y está bien que se ejecute, verificamos los parameters que le damos al consulta y finalmente ejecutamos la consulta.

Después de eso, puede usar bind_result para nombrar una variable para recibir los campos de su consulta, como he hecho.

Observe cómo en mi consulta estoy usando? esa es una statement preparada que definimos usando bind_param esto es para evitar la inyección de SQL, en su código actual, SQL Injection aún es posible ya que no está desinfectando sus variables.

Otro error que creo que está haciendo es almacenar passwords como text sin formatting que es MUY MUY INCORRECTO, siempre debe encriptar la contraseña para proteger a sus usuarios y a usted mismo. Es por eso que no incluyo la contraseña en mi consulta MySQL, primero uso solo al usuario, si se encuentra el usuario, entonces uso la contraseña que publicó para que coincida con la contraseña recuperada de la database, en este caso estoy usando bcrypt para hacer la tarea que es una biblioteca de encryption muy segura.

Vea aquí cómo usar bcrypt .

Solo después de ver que la contraseña es válida, entonces estoy colocando los datos en la session y networkingirigiendo al usuario.

Además de todos los errores que he señalado en la parte inferior de mi respuesta, aquí es cómo 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 solo un ejemplo y no fue probado, si nota algún error con él hágamelo saber.

Algunos de los errores que he notado en el código que ha publicado:

Te estás perdiendo el cierre ; aqui:

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

También en su consulta tiene $Members pero no tiene definida la variable $Members en ningún lugar de su código, ¿quiso decir Members lugar, 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 consulta en la parte inferior de mysqli_query

 if (!mysqli_query($sql_connection))