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

Related Posts:

array push con keys php – php array
Pregunta: Buen día. Estoy tratando de crear un array con valores agrupados por categorías, mediante AJAX recibo dos variables una contiene un string con el nombre ...
Actualizar información con ajax php mysql – php jquery mysql
Pregunta: Tengo esta simple consulta que lo que simplemente me muestra las visitas de la web, pero quisiera que fuera automático con ajax ya que ...
¿Cómo insertar código en las entradas de WordPress? – php wordpress plugin
Pregunta: En algunos blogs de programación he visto algo como esto en las entradas: Me gustaría poder hacer lo mismo. Sin embargo, no solo quiero que ...
Como validar array checkbox – javascript php jquery
Pregunta: Que tal buen dia, alguien me podria decir como se puede hacer para que cuando presione el boton "BAJAR DATOS" si este esta vacio ...
Problema con UTF_8 – php sql sql-server
Pregunta: Buen día, mi problema es el siguiente, Php me lanza el siguiente Warning Warning: utf8_decode() expects parameter 1 to be string, object given ...
Obtener las fechas de los días Lunes dependiendo de un rango de fechas PHP – php datetime time
Pregunta: Dependiendo de un rango de fechas quiero obtener sólo las fechas de los días Lunes, tengo la siguiente función que funciona pero me trae ...
Customizar rutas de Login en Laravel 5.3 – php laravel laravel-5
Pregunta: Hola tengo un problema con el enrutado de Login con el metodo php artisan make:auth que te genera todo lo que se necesita Desde vamos ...
¿Cómo utilizar `count` para contabilizar la cantidad de registros para distintos valores de un campo en mysql? – php mysql sql
Pregunta: Resulta que tengo un campo llamado ESTADO en mi tabla. En este campo hay varias estados de pedido que son: LOGÍSTICA, PACKING, PICKING, CARTERA, ...
Precargar SOAP en PHP – php webservice soap
Pregunta: Estoy usando un webservice en el cual realizo la conexión por SOAP en PHP. El problema viene cuando en la primera llamada, a veces, no ...
Xampp no carga proyecto laravel – php laravel apache
Pregunta: Tengo el proyecto laravel en un mac con OSX el capitán con php artisan. El proyecto se ejecuta sin problema, pero por motivos personales ...
URLs absolutas con PHP – php pretty-urls
Pregunta: Explico mi problema, es sencillo, lo tengo solucionado, pero solamente de manera local, no me sirve lo que hice si yo uso esto en ...
Ejecutar función de otro controlador enviando parametros – php laravel laravel-5
Pregunta: Tengo a Controller1 el cual contiene una función llamada actualizarCartera($parametro1, $parametro2, $parametro3), desde Controller2 ¿Cómo hago para ejecutar esta función?, ¿Cómo debo incluír a ...
PHPExcel comentario en negro – php excel
Pregunta: Llevamos un tiempo usando PHPexcel para rellenar unas tablas desde la Base de Datos, lleva funcionando meses pero últimamente al escribir un comentario y ...
Update con MYSQL PHP – php mysql mysqli
Pregunta: Tengo este código, pero no hace el update, y no sé porque. <?php // if ($_POST == "" || $_POST == "" || $_POST == ""){ ...
alguien sabe porque no imprime el json – php json
Pregunta: $from $to = 20; $query = "SELECT idempleados,nombre,apellidos FROM empleados LIMIT ?,?"; $result = $mysqli->prepare($query); $result->bind_ param('ii', $from, $to); $result->execute(); /* bind result variables */ $result->bind_result($idempleados,$nombre,$apellidos); /* fetch values */ while ($result->fetch()){ ...
Tags:, ,

Add a Comment

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