Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: jamatbar en 28 Octubre 2020, 17:46 pm



Título: Duda con PHP y base de datos
Publicado por: jamatbar en 28 Octubre 2020, 17:46 pm
Buenas, tengo un par de formularios, uno hace la conexión a la base de datos y otro la desconexión, pero tengo un problema y es que en la desconexión no se "encuentra" los datos para realizarla. Aquí tengo el código:

Código:
        <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" method="POST">
            <label for="equipo">Equipo</label>
            <input type="text" value="Equipo" name="equipo">
            <label for="usuario">Usuario</label>
            <input type="text" value="Usuario" name="usuario">
            <label for="contrasena">Password</label>
            <input type="password" value="Contraseña" name="password">
            <label for="basededatos">Base de datos</label>
            <input type="text" value="Nombre BD" name="bd">
            <input type="submit" value="Conectar" name="conectar">
        </form>
        <br>
        <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" method="POST">
            <input type="submit" value="Desconectar" name="desconectar">
        </form>
            <?php
            //Comprobamos que hayamos pulsado el botón Conectar
            if (isset($_POST['conectar'])) {
                Conectar($_POST["equipo"], $_POST["usuario"], $_POST["password"], $_POST["bd"]);
                $conec = Conectar($_POST["equipo"], $_POST["usuario"], $_POST["password"], $_POST["bd"]);
 
            }
         
            if (isset($_POST['desconectar'])) {
                Desconectar($conec);
                }

            function Conectar($equipo, $usuario, $password, $bd)
            {   
                //Conectar a BD
                $conexion = mysqli_connect($equipo, $usuario, $password, $bd);

                if (!$conexion) {
                    die("Error de conexión, has introducido algún dato mal");
                } else {
                    echo "<script>alert('Te has conectado correctamente a la base de datos {$bd} con el usuario {$usuario}');</script>";
                }
                return $conexion;
            }
           
            function Desconectar($conec){
                echo "<script>alert('El usuario {$_POST["usuario"]} se ha desconectado de la base de datos {$_POST["bd"]}');</script>";
                mysqli_close($conec);
            }
            ?>

¿Alguna solucion?

Gracias y un saludo


Título: Re: Duda con PHP y base de datos
Publicado por: #!drvy en 28 Octubre 2020, 18:08 pm
No te "encuentra" datos para realizarla porque cuando envias el POST ya está terminada.

En PHP el código se ejecuta y termina antes de la presentación. Es decir, para cuando tú ves el formulario, PHP ya se ha conectado a la base de datos y se ha desconectado.

Realmente en muy pocos casos, necesitas cerrar la conexión a la base de datos (porque ya se cierra sola gracias al recolector de basura).

Saludos


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 28 Octubre 2020, 18:11 pm
Es por un tema del profesor, que quiere que haya un formulario para desconectar. ¿No hay posibilidad de hacerlo?

Gracias


Título: Re: Duda con PHP y base de datos
Publicado por: #!drvy en 28 Octubre 2020, 18:14 pm
¿Y cual es el enunciado de tu tarea? Porque una de dos, o piden otra cosa o tu profesor no sabe nada de PHP.

Saludos


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 28 Octubre 2020, 18:18 pm
La tarea es hacer un formulario para conectarte a una base de datos y otro formulario para desconectarte. Más adelante quiere más formularios para otras cosas (incluir tablas, eliminarlas, etc...)

Que el profesor no tenga ni idea es una opción.


Título: Re: Duda con PHP y base de datos
Publicado por: MinusFour en 28 Octubre 2020, 18:40 pm
La tarea es hacer un formulario para conectarte a una base de datos y otro formulario para desconectarte. Más adelante quiere más formularios para otras cosas (incluir tablas, eliminarlas, etc...)

Que el profesor no tenga ni idea es una opción.


Yo creo que tu o el profesor se ha confundido. Los formularios realizarían dos peticiones por separado. La primera petición tiene que abrir la conexión al servidor SQL pero no la retiene para que la segunda petición la termine. Al finalizar la ejecución del script en la primera petición, automáticamente se cierra la conexión. Cada petición tiene su propio entorno de ejecución y no comparten nada entre ellos. Puedes tener una conexión de MySQL persistente pero tu no controlas como liberar la conexión (hasta donde yo tengo entendido). El caso de uso que tu profesor te plantea simplemente no tiene sentido.

¿Quizás el profesor te ha pedido que crearas un sistema con sesiones y le has entendido mal?


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 28 Octubre 2020, 18:59 pm
Yo creo que tu o el profesor se ha confundido. Los formularios realizarían dos peticiones por separado. La primera petición tiene que abrir la conexión al servidor SQL pero no la retiene para que la segunda petición la termine. Al finalizar la ejecución del script en la primera petición, automáticamente se cierra la conexión. Cada petición tiene su propio entorno de ejecución y no comparten nada entre ellos. Puedes tener una conexión de MySQL persistente pero tu no controlas como liberar la conexión (hasta donde yo tengo entendido). El caso de uso que tu profesor te plantea simplemente no tiene sentido.

¿Quizás el profesor te ha pedido que crearas un sistema con sesiones y le has entendido mal?

Él ha hablado de formularios, no de inicio de sesiones. De todas formas hoy tengo clase con él así que le expondré la duda de nuevo a ver si se explica mejor o directamente es que no tiene ni idéa.


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 12:50 pm
Al final le comenté el problema y dijo que ante la imposibilidad de hacerlo todo en la misma página, lo hicieramos en varias, ya que el control de sesiones aún no lo hemos dado.

EDITO: Ya lo he podido solucionar


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 13:35 pm
Bueno, tengo un problema creo que pequeño, pero no consigo solucionarlo.

Código
  1. <?php
  2.  
  3. include('conectar.php');
  4.  
  5. $pruebaconexion = Conectar($_POST['equipo'], $_POST['usuario'], $_POST['password'], $_POST['bd']);
  6.  
  7. print mysqli_get_server_info($pruebaconexion);
  8.  
  9. if ($pruebaconexion) {
  10.    echo "Te has conectado";
  11. } else {
  12.    echo "Ha habido un error";
  13. }
  14. ?>
  15.  
  16.  
  17. <html>
  18.    <head>
  19.        <title></title>
  20.        <meta charset="UTF-8">
  21.        <meta name="viewport" content="width=device-width, initial-scale=1.0">
  22.        <link rel="stylesheet" href="main.css">
  23.    </head>
  24.    <body>
  25.        <form action="index.php" method="POST">
  26.            <input type="submit" value="Desconectar" name="desconectar">
  27.                <?php
  28.                if (isset($_POST['desconectar'])) {
  29.                    echo "<script>alert('El usuario {$_POST["usuario"]} se ha desconectado de la base de datos {$_POST["bd"]}');</script>";
  30.                    mysqli_close($pruebaconexion);
  31.                }
  32.                ?>
  33.        </form>
  34.    </body>
  35. </html>

Una vez conectado, me he creado el botón "desconectar", para cerrar la conexión y volver al inicio, el problema es que no me sale el mensaje de "el usuario se ha desconectado...", simplemente me lleva a la pagina "index.php" y ya. ¿Alguna solución?

Gracias de antemano


Título: Re: Duda con PHP y base de datos
Publicado por: #!drvy en 30 Octubre 2020, 13:44 pm
Las comillas en tu mensaje están rotas y por tanto se rompe el javascript entero. O las escapas o usas combinación de comillas simples y dobles.

Lo ideal también es que se usen funciones como printf/sprintf que están hechas para estas cosas.


Código
  1.    '<script>alert("El usuario %s se ha desconectado de la base de datos %s");</script>',
  2.    htmlentities($_POST['usuario'], ENT_QUOTES), // Recuerda escapar para prevenir XSS.
  3.    htmlentities($_POST['bd'], ENT_QUOTES)
  4. );

o

Código
  1. $usuario = htmlentities($_POST['usuario'], ENT_QUOTES);
  2. $bd      = htmlentities($_POST['bd'], ENT_QUOTES);
  3. echo "<script>alert('El usuario {$usuario} se ha desconectado de la base de datos {$bd}');</script>";


Saludos


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 14:04 pm
Las comillas en tu mensaje están rotas y por tanto se rompe el javascript entero. O las escapas o usas combinación de comillas simples y dobles.

Lo ideal también es que se usen funciones como printf/sprintf que están hechas para estas cosas.


Código
  1.    '<script>alert("El usuario %s se ha desconectado de la base de datos %s");</script>',
  2.    htmlentities($_POST['usuario'], ENT_QUOTES), // Recuerda escapar para prevenir XSS.
  3.    htmlentities($_POST['bd'], ENT_QUOTES)
  4. );

o

Código
  1. $usuario = htmlentities($_POST['usuario'], ENT_QUOTES);
  2. $bd      = htmlentities($_POST['bd'], ENT_QUOTES);
  3. echo "<script>alert('El usuario {$usuario} se ha desconectado de la base de datos {$bd}');</script>";


Saludos

Antes que nada gracias de nuevo.

¿Dónde se rompen las comillas de mi echo?, y he probado ambas soluciones que me has dado y sigue sin salir ningún mensaje, sólo salta a index.php

Código
  1.                <?php
  2.                if (isset($_POST['desconectar'])) {
  3.                    //echo "<script>alert('El usuario {$_POST["usuario"]} se ha desconectado de la base de datos {$_POST["bd"]}');</script>";
  4.                printf(
  5.                    '<script>alert("El usuario %s se ha desconectado de la base de datos %s");</script>',
  6.                    htmlentities($_POST['usuario'], ENT_QUOTES), // Recuerda escapar para prevenir XSS.
  7.                    htmlentities($_POST['bd'], ENT_QUOTES)
  8.                );
  9.                    mysqli_close($pruebaconexion);
  10.                }
  11.                ?>


Título: Re: Duda con PHP y base de datos
Publicado por: #!drvy en 30 Octubre 2020, 14:14 pm
Mmmm perdona no se porque me hice la idea que se romperían las comillas dobles entre los corchetes. Supongo que por el syntax highlight que se ve xD De todos modos, está bien que se escapen.

¿Cuándo dices que "te lleva" o "salta a" index.php, te refieres a que ese formulario de desconectar NO está en index.php? ¿Es decir, no es que se esté recargado la página sino que te lleva a otra diferente?

Si es el caso, es normal porque el formulario con los datos se envía directamente a index.php el PHP nunca tiene oportunidad de ejecutarse. En todo caso, la comprobación de si existe POST "desconectar" tendrias que hacerla en el index.

Saludos


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 14:20 pm
Mmmm perdona no se porque me hice la idea que se romperían las comillas dobles entre los corchetes. Supongo que por el syntax highlight que se ve xD De todos modos, está bien que se escapen.

¿Cuándo dices que "te lleva" o "salta a" index.php, te refieres a que ese formulario de desconectar NO está en index.php? ¿Es decir, no es que se esté recargado la página sino que te lleva a otra diferente?

Si es el caso, es normal porque el formulario con los datos se envía directamente a index.php el PHP nunca tiene oportunidad de ejecutarse. En todo caso, la comprobación de si existe POST "desconectar" tendrias que hacerla en el index.

Saludos

Así es, el formulario desconectar te redirige a index.php para que puedas volver a conectarte. El código de index.php es el siguiente:

Código
  1. <!DOCTYPE html>
  2. <!--
  3. To change this license header, choose License Headers in Project Properties.
  4. To change this template file, choose Tools | Templates
  5. and open the template in the editor.
  6. -->
  7. <html>
  8.    <head>
  9.        <title>Colección Videojuegos</title>
  10.        <meta charset="UTF-8">
  11.        <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12.        <link rel="stylesheet" href="main.css">
  13.    </head>
  14.    <body>
  15.  
  16.        <form action="conectado.php" method="POST">
  17.            <label for="equipo">Equipo</label>
  18.            <input type="text" value="Equipo" name="equipo">
  19.            <label for="usuario">Usuario</label>
  20.            <input type="text" value="Usuario" name="usuario">
  21.            <label for="contrasena">Password</label>
  22.            <input type="password" value="Contraseña" name="password">
  23.            <label for="basededatos">Base de datos</label>
  24.            <input type="text" value="Nombre BD" name="bd">
  25.            <input type="submit" value="Conectar" name="conectar">
  26.            <?php
  27.            //Incluímos los métodos
  28.            include('conectar.php');
  29.            //Comprobamos que hayamos pulsado el botón Conectar
  30.            if (isset($_POST['conectar'])) {
  31.                Conectar($_POST['equipo'], $_POST['usuario'], $_POST['password'], $_POST['bd']);
  32.            }
  33.            ?>
  34.        </form>
  35.    </body>
  36. </html>

¿Ahí tendría que colocar el isset?


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 15:23 pm
He colocado el isset en index.php (usando echo que por ahora estoy más familiarizado), pero sin argumentos, ya que si le pongo $usuario y $bd no me los encuentra.

Código
  1.            <?php
  2.            //Incluímos los métodos
  3.            include('conectar.php');
  4.            //Comprobamos que hayamos pulsado el botón Conectar
  5.            if (isset($_POST['conectar'])) {
  6.                Conectar($_POST['equipo'], $_POST['usuario'], $_POST['password'], $_POST['bd']);
  7.            }
  8.  
  9.            if (isset($_POST['desconectar'])) {
  10.                    //echo "<script>alert('El usuario {$_POST["usuario"]} se ha desconectado de la base de datos {$_POST["bd"]}');</script>";
  11.                echo(
  12.                    '<script>alert("El usuario se ha desconectado de la base de datos");</script>');
  13.                    mysqli_close($pruebaconexion);
  14.                }
  15.            ?>

El problema es que ahora no encuentra $pruebaconexion, me salen los siguientes fallos:

Notice: Undefined variable: pruebaconexion in C:\xampp\htdocs\ProyBD\index.php on line 38

Warning: mysqli_close() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\ProyBD\index.php on line 38


Título: Re: Duda con PHP y base de datos
Publicado por: jamatbar en 30 Octubre 2020, 15:53 pm
Ya lo conseguí, al final lo arreglé con un onclick en el botón de desconectar.