No funciona SELECT a una base de datos con PHP – php mysqli php5

Pregunta:


Estoy intentando hacer un login sencillo. La idea es que busque en la base de datos el usuario y la contraseña.

El caso es que tengo puesto un SELECT que debería coger las filas con nombre y usuario que coinciden con las que ha introducido el usuario previamente.

El SELECT no me coge ninguna fila, es decir, no es culpa del SELECT sino de la sentencia para conectarse a la base de datos.

Codigo validar.php, donde ocurre el fallo:

<?php
        include 'serv.php';
        if(isset($_POST['login'])){
            $usuario = $_POST['user'];
            $pw = $_POST['pw'];
            $log = mysqli_query("SELECT * FROM noticiasBD WHERE user='$usuario' AND pw='$pw'");
            echo "tenemos: $log";
            echo '<script> alert("tenemos: $log");</script>';

            if (mysqli_num_rows($log)>0) {
                $row = mysql_fetch_array($log);
                $_SESSION["user"] = $row['user']; 
                echo 'Iniciando sesión para '.$_SESSION['user'].' <p>';
                echo '<script> window.location="panel.php"; </script>';
            }
            else{
                echo '<script> alert("Usuario o contraseña incorrectos.");</script>';
                echo '<script> window.location="index.php"; </script>';
            }
        }
    ?>

Aquí tengo el formulario donde llamo a validad.php. Se llama index.php:

<?php
session_start();
include 'serv.php';
if(isset($_SESSION['user'])){
echo '<script> window.location="panel.php"; </script>';
}
?>

<h1 class="h1" style="color:white">Login</h1>
        <form method="post" action="validar.php">
            <input type="text" class="form-control" name="user" autocomplete="off" required><br><br>
            <input type="password" class="form-control" name="pw" autocomplete="off" required><br><br>
            <input type="submit" class="btn btn-success" name="login" value="Entrar">
        </form>

Y me conecto a la base de datos a partir de serv.php, el cual no da fallo:

<?php
$conect = mysqli_connect('localhost', '--', '--', 'c1jormacolBD')
  or die('Error: ' . mysqli_connect_error());

Imagen de phpMyAdmin:

introducir la descripción de la imagen aquí

Se conecta bien a la base de datos pero no a la tabla en cuestión.

Preguntado por: CMorillo

OscarGarcia

El principal problema que estás sufriendo es no pasar la conexión obtenida con mysqli_connect a la función mysqli_query():

$log = mysqli_query($conect, "
  SELECT *
  FROM noticiasBD
  WHERE user='$usuario' AND pw='$pw'
");

Además, estás olvidando usar session_start para iniciar las sesiones, sin embargo tratas de usarlas para almacenar el usuario logueado en:

$_SESSION["user"] = $row['user'];

Según el error que comentas en tu edición es probable que en otra parte del código (no coinciden los números de línea, es probable que hayas omitido código) se haya iniciado sesión, así que podemos usar session_status para saber si se hizo o no:

if (session_status() === PHP_SESSION_DISABLED) {
  session_start();
} 

Estás obteniendo el resultado con la función mysql_fetch_array en vez de mysqli_fetch_array y, además, obtendrías valores con índice numérico ($row[0], $row[1]), no asociativos ($row['user'], $row['pw']):

$row = mysql_fetch_array($log);

Por último, recordarte LA IMPORTANCIA DE PROTEGERTE CONTRA INYECCIÓN SQL haciendo uso de mysqli_real_escape_string.

Éste sería tu código arreglado:

<?php
/* Si vamos a usar sesiones debemos iniciarlas aquí también */
if (session_status() === PHP_SESSION_DISABLED) {
  session_start();
} 
include 'serv.php';
if (isset($_POST['login'])) {
    /* ¡¡NO OLIVIDES hacer esto para evitar inyección SQL!!! */
    $usuario = mysqli_real_escape_string($conect, $_POST['user']);
    $pw = mysqli_real_escape_string($conect, $_POST['pw']);
    $log = mysqli_query($conect, "
      SELECT *
      FROM noticiasBD
      WHERE user='$usuario' AND pw='$pw'
    ");
    /* Debemos comprobar si hubo un fallo en la consulta */
    if ($log === false) {
        die('ERROR SQL: ' . mysqli_error($conect));
    }
    $row = mysqli_fetch_assoc($log);
    if ($row !== false) {

        /* Esto no funciona sin el "session_start()" inicial */
        $_SESSION["user"] = $row['user'];
        echo '<p>Iniciando sesión para ' .
          htmlspecialchars($_SESSION['user']) . '</p>';
        echo '<script> window.location="panel.php"; </script>';
        /* Probablemente esto sea mejor que javascript */
        header('Location: panel.php');
    } else {
        echo '<script> alert("Usuario o contraseña incorrectos.");</script>';
        echo '<script> window.location="index.php"; </script>';
    }
}

Además, he agregado control de error para gestionar errores SQL en la consulta y he detectado si el usuario existe o no obteniendo el resultado de la consulta con mysqli_fetch_assoc (valdrá true si se encontró o false, no hay más registros, si no fue así).

Por último, es una mala práctica guardar claves en texto plano en la base de datos. Si alguien consigue acceder a esos datos (por lo pronto ya estabas permitiendo que lo hicieran por sufrir un bug de inyección SQL) expondrías los datos de acceso y pondrías muy fácil suplantar las identidades de tus clientes.

Fuente

Tags:, ,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *