0

Necesito hacer un formulario para poder dejar comentarios en mi web, que los usuarios puedan comentar y se publique automáticamente.

Este es el código que tengo pero no funciona...¿Me podéis ayudar? lo puse anteriormente pero no era el hilo correcto..

Aquí se muestran los comentarios:

<?PHP

    $conexion = mysqli_connect("servidor de la base de datos", 
    "usuario de la     base de datos", "contraseña del usuario");
    mysqli_select_db("base de datos", $conexion);

    if ($conexion)
    {
     $resultado = mysqli_query("SELECT id, usuario, fecha, 
     mensaje FROM   comentarios ORDER BY id DESC", $conexion);
    while ($fila = mysqli_fetch_row($resultado))
    {
        echo "<B>Mensaje</B> #" . $fila[0] . "; ";
        echo "<B>Escrito por:</B> " . $fila[1] . "; ";
        echo "<B>Fecha:</B> " . $fila[2] . "; ";
        echo "<BR>";
        echo $fila[3];
        echo "<HR>";
    }
    }

    mysqli_close($conexion);

    ?>
  </BODY>
  </HTML>

Y el fichero para dejar el mensaje:

<HTML>
<HEAD>
<TITLE>Deja un mensaje</TITLE>
</HEAD>
<BODY>

<FORM ACTION="procesar_mensaje.php" METHOD=POST>
<B>Nombre de usuario:</B>
<INPUT TYPE=text SIZE=20 NAME="usuario">
<BR>
<B>Escribe tu mensaje:</B>
<BR>
<TEXTAREA ROWS=10 COLS=70 NAME="mensaje"></TEXTAREA>
<BR>
<INPUT TYPE=submit VALUE="Enviar mensaje">
</FORM>

<HR>

<?PHP
mysqli_select_db($conexion, "dbxxxxxx");
$conexion = mysqli_connect("dbxxxxx.db.1and1.com", "dboxxxxxx", "xxxxxxx");


if ($conexion)
{
$resultado = mysqli_query($conexion,"SELECT id, usuario, fecha, mensaje FROM comentarios ORDER BY id DESC");
    while ($fila = mysqli_fetch_row($resultado))
    {
        echo "<B>Mensaje</B> #" . $fila[0] . "; ";
        echo "<B>Escrito por:</B> " . $fila[1] . "; ";
        echo "<B>Fecha:</B> " . $fila[2] . "; ";
        echo "<BR>";
        echo $fila[3];
        echo "<HR>";
    }
}
mysqli_close($conexion);

?>

</BODY>
</HTML>

Captura de la base de datos:

introducir la descripción de la imagen aquí

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
rolmo
  • 17
  • 5
  • 1
    Hola rolmo, ¿cómo no funciona el código? ¿recibes algún mensaje de error? ¿qué falla? – Alvaro Montoro Jan 22 '18 at 21:21
  • Aparte de eso, el código compartido parece vulnerable a ataques de inyección SQL. Deberías usar sentencias preparadas en lugar de usar sentencias dinámicas concatenando cadenas. – Alvaro Montoro Jan 22 '18 at 21:23
  • Hola @Alvaro. Gracias no funciona...lo relleno le doy enviar y se queda en blanco y a la base de datos no llega nada....no da ningún error de conexión. El archivo lo saque de un tutorial se encontré, me pareció sencillo por que lo entendi...habia otros que no entendia...no domino mucho el php ni la base de datos – rolmo Jan 22 '18 at 21:32
  • Hola @AlvaroMontoro he estado haciendo pruebas y este es el mensaje que me da: MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas). (La consulta tardó 0.0004 seg) – rolmo Jan 23 '18 at 19:47
  • Parecería que el problema es cuando se inserta, que no lo hace bien. Prueba a quitar la redirección con `header` y pon `error_reporting(E_ALL);` al principio de ese fichero. Prueba a insertar de nuevo a ver si te lanza algún error. Y prueba a poner un `mysqli_error($conexion)` para ver errores. – Alvaro Montoro Jan 23 '18 at 20:00
  • De hecho... haz eso, pero te puedo decir dónde están los problemas: estás haciendo `mysqli_query(consulta, conexion)` cuando debería ser [`mysqli_query(conexion, consulta)`](http://php.net/manual/en/mysqli.query.php). – Alvaro Montoro Jan 23 '18 at 20:02

1 Answers1

0

Tienes un problema al ejecutar las sentencias SQL, estás haciendo esto:

mysqli_query(sentencia, conexión);

Pero si vas a la documentación de PHP para mysqli_query verás que el formato es el siguiente:

mysqli_query(conexión, sentencia);

Entonces deberías cambiar el orden de los parámetros para que funcione. Recuerda en las funciones de MySQLi, el primer parámetro será siempre la conexión.


El primer fichero tiene ese problema para mysqli_select_db y mysqli_query. Aquí lo puedes ver con correcciones (comentadas):

<?PHP

    $conexion = mysqli_connect("servidor de la base de datos", 
    "usuario de la     base de datos", "contraseña del usuario");
    // $conexion debe ponerse primero
    mysqli_select_db($conexion,"base de datos");

    if ($conexion)
    {
     // $conexion debe ponerse primero
     $resultado = mysqli_query($conexion, "SELECT id, usuario, fecha, mensaje FROM   comentarios ORDER BY id DESC");
    while ($fila = mysqli_fetch_row($resultado))
    {
        echo "<B>Mensaje</B> #" . $fila[0] . "; ";
        echo "<B>Escrito por:</B> " . $fila[1] . "; ";
        echo "<B>Fecha:</B> " . $fila[2] . "; ";
        echo "<BR>";
        echo $fila[3];
        echo "<HR>";
    }
    }

    mysqli_close($conexion);

    ?>
  </BODY>
  </HTML>

Y el segundo fichero tiene el problema de que seleccionas la base de datos antes de que se haga la conexión, lo cual no debería funcionar. Mueve eso a después.

<HTML>
<HEAD>
<TITLE>Deja un mensaje</TITLE>
</HEAD>
<BODY>

<FORM ACTION="procesar_mensaje.php" METHOD=POST>
<B>Nombre de usuario:</B>
<INPUT TYPE=text SIZE=20 NAME="usuario">
<BR>
<B>Escribe tu mensaje:</B>
<BR>
<TEXTAREA ROWS=10 COLS=70 NAME="mensaje"></TEXTAREA>
<BR>
<INPUT TYPE=submit VALUE="Enviar mensaje">
</FORM>

<HR>

<?PHP    
$conexion = mysqli_connect("dbxxxxx.db.1and1.com", "dboxxxxxx", "xxxxxxx");
// debes seleccionar la base de datos DESPUÉS de conectarte
mysqli_select_db($conexion, "dbxxxxxx");

if ($conexion)
{
$resultado = mysqli_query($conexion,"SELECT id, usuario, fecha, mensaje FROM comentarios ORDER BY id DESC");
    while ($fila = mysqli_fetch_row($resultado))
    {
        echo "<B>Mensaje</B> #" . $fila[0] . "; ";
        echo "<B>Escrito por:</B> " . $fila[1] . "; ";
        echo "<B>Fecha:</B> " . $fila[2] . "; ";
        echo "<BR>";
        echo $fila[3];
        echo "<HR>";
    }
}
mysqli_close($conexion);

?>

</BODY>
</HTML>

PRECAUCIÓN: como te ponía en los comentarios, el código compartido es vulnerable a ataques de inyección SQL. Lee sobre inyección SQL y cómo evitarla en PHP.

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
  • Gracias!! voy a probar @AlvaroMontoro y te cuento. doy un vistazo a inyeccion SQL – rolmo Jan 23 '18 at 20:45
  • he puesto este codigo: Error al conectar con servidor MySQL: '.mysqli_connect_error().''); } else { echo '

    Se ha establecido la conexión al servidor MySQL con éxito.

    '; } if ($conexion) { mysqli_query($conexion,"INSERT INTO comentarios (usuario, mensaje) VALUES ('$usuario','mensaje')"); } mysqli_close($conexion); ?>
    – rolmo Jan 23 '18 at 20:58
  • me lanza este error: Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /homepages/45/d716967420/htdocs/php/procesar_mensaje.php on line 4 Se ha establecido la conexi�n al servidor MySQL con �xito. Notice: Undefined variable: usuario in /homepages/45/d716967420/htdocs/php/procesar_mensaje.php on line 13 – rolmo Jan 23 '18 at 20:58
  • @rolmo la variable de conexión siempre va la primera. Por eso recibes error al seleccionar la base de datos. Debería ser `mysqli_select_db(conexión, nombre)` – Alvaro Montoro Jan 23 '18 at 21:10
  • Gracias @AlvaroMontero por tu paciencia, pero sigue sin funcionar.....mysqli_select_db($conexion,"xxxxxxx"); $conexion = mysqli_connect("xxxxxxx", "xxxxxxx", "xxxxxx"); también he probado con este código que me da mi proveedor de hosting y nada....al final tendré que dejarlo por imposible.... $host_name = 'xxxxxx'; $database = 'xxxxx'; $user_name = 'xxxxxx'; $password = ''; $connect = mysqli_connect($host_name, $user_name, $password, $database); – rolmo Jan 23 '18 at 21:26
  • @rolmo edita la pregunta para añadir el código de las dos páginas. Y aparte, ¿alguna razón por la que no seleccionas la base de datos cuando vas a insertar? – Alvaro Montoro Jan 23 '18 at 21:30
  • @Alvaromontero esto es una plantilla que encontré en un tutorial https://www.youtube.com/watch?v=6-hFSB1bQTE y solo he cambiado mis datos por los suyos y mysql por mysqli, en el tutorial funciona y a mi no...voy a ver si consigo editar la pregunta para poner código . Muchas gracias – rolmo Jan 23 '18 at 21:39
  • @Alvaromontero he puesto captura de pantalla, conecta pero no carga datos...Esta es la ultima vez que pregunto por que me da apuro, agradezco la paciencia que estas teniendo. Si no puede ser ya buscaré otra opción. Muchas gracias. Buenas noches – rolmo Jan 23 '18 at 22:49
  • @rolmo no te preocupes. ¿Puedes poner el código del archivo que hace el `insert` en la pregunta? – Alvaro Montoro Jan 23 '18 at 22:50
  • @AlvaroMontero mysql_query("INSERT INTO comentarios (usuario, mensaje) VALUES ('".$_POST["usuario"]."', '".$_POST["mensaje"]."')", $conexion); – rolmo Jan 23 '18 at 22:58
  • @rolmo ponlo en la pregunta y no sólo esa sentencia sino todo el código. Aparte, no estás haciendo los cambios que te estoy diciendo que hagas en la respuesta: `$conexion` tiene que ir primero, y ser `mysqli_query` y no `mysql_query`. – Alvaro Montoro Jan 23 '18 at 23:00
  • Buenas noches @AlvaroMontoro. Al final es un problema del servidor y eso que me lo comprobaron supuestamente todo, independientemente que tuviese mal los archivos....lo están solucionando ya que han hecho pruebas y a ellos les funciona ;) . Muchas gracias por todo. Un saludo – rolmo Jan 24 '18 at 20:49