El formulario PHP no se escribe en la base de datos mySQL

Estoy aprendiendo PHP y estoy intentando lo más básico: capturar información de un formulario y pegarla en una tabla en una base de datos mySQL. Me avergüenza hacer una pregunta de novato tan estúpida, pero después de revisar dos libros, varias publicaciones de Stack Overflow y 7 tutoriales diferentes, todavía no puedo hacer que mi código patético escriba algunas métricas pésimas en mi base de datos.

Aquí está la última versión del código. ¿Podría alguien decirme qué estoy haciendo mal?

* Formulario HTML básico *

<form method="post" action="post_metrics_stack.php" >
<p>Date<br />
<input name="date" type="text" /></p>

<p>Metric1<br />
<input name="metric1" type="text" /></p>

<p>Metric2<br />
<input name="metric2" type="text" /></p>

<input type="submit" name="submit" value="Submit" />
</form>

* Archivo de procesador *

<?php 

$date=$_POST['date'];
$metric1=$_POST['metric1'];
$metric2=$_POST['metric2'];

$con = mysql_connect("localhost", "root", "mypassword");
if (!$con)
  {die('Could not connect to mysql: ' . mysql_error());} 

$mydb = mysql_select_db("mydatabasename");
if (!$mydb)
  {die('Could not connect to database: ' . mysql_error());} 

mysql_query("INSERT INTO my_metrics VALUES ('$date', '$metric1', '$metric2')"); 
 Print "Your metrics have been successfully added to the database."; 

mysql_close($con);
?> 

preguntado el 16 de mayo de 11 a las 18:05

Lo que muestras se ve bien hasta ahora. ¿Qué sale mal, qué errores obtienes? Para depurar, intente print_r($_POST); en el archivo del procesador. ¿Que muestra? Además, debes lanzar un mysql_error() también después de la consulta (si falla) para que pueda detectar si algo sale mal allí. -

Por cierto, su código es vulnerable a inyección SQL -

¿Qué error estás recibiendo? ¿Cuál es su esquema de base de datos? Es posible que desee enumerar sus campos en la consulta de inserción de la siguiente manera: INSERT INTO my_metrics (date, metric1, metric2) VALUES ('$ date', '$ metric1', '$ metric2') -

¿Puede mostrarnos algo de su salida / error? -

Además, si no recibe ningún error, coloque este código en la parte superior: ini_set ('display_errors', 1); error_reporting (E_ALL); -

5 Respuestas

Su sintaxis de mysql es incorrecta.

Trata

INSERT INTO my_metrics
SET
date = '$date',
metric1 = '$metric1',
metric2 = '$metric2'

contestado el 16 de mayo de 11 a las 23:05

Su sintaxis es para actualizar, no para insertar. Siempre que los únicos campos que tenga sean fecha, métrica1 y métrica2, debería funcionar. - Shauna

Esta respuesta muestra alternativa válida INSERT sintaxis para mysql pero OP es Además, utilizando la sintaxis correcta. - webbiedave

Tenga en cuenta también que solo está usando una sintaxis válida SI son los únicos tres campos. Si tiene un campo de identificación o algo al principio, está mal. - captainclam

@captainclam: No quiero entrar en un debate de semántica, pero su declaración es sintácticamente correcto independientemente de si tiene el número incorrecto de campos;) - webbiedave

Muchas gracias por los comentarios. Esta es una versión simplificada del formulario y el procesador; el original tiene alrededor de 10 métricas. Sin embargo, ninguno de los dos funciona. - Katherine Chalmers

Dependiendo de cómo se vea la tabla, su código puede o no funcionar,

"INSERT INTO my_metrics VALUES ('$date', '$metric1', '$metric2')"

asume que los campos están en ese orden y que no hay campos antes de este.

"INSERT INTO my_metrics (date, metric1, metric2) VALUES ('$date', '$metric1', '$metric2')"

sería más a prueba de futuro y también puede resolver su problema, ya que se insertarán en los campos correctos.

También es posible que obtenga algunos datos incorrectos para las definiciones de campo, intente hacer la inserción en phpmyadmin o en la línea de comando en lugar de en php, luego trabaje hacia atrás desde allí.

contestado el 16 de mayo de 11 a las 23:05

Probé este formato en algunas versiones anteriores. Lo intentaré de nuevo. ¡Gracias! - Katherine Chalmers

En cuanto a la vulnerabilidad a la inyección de SQL, debe alimentar sus cadenas de entrada a mysql_real_escape_string () ;. Esto evitará los caracteres no deseados.

Al conectarse a la base de datos, escribe

$con = mysql_connect("localhost", "root", "mypassword");
if (!$con)
  {die('Could not connect to mysql: ' . mysql_error());}

Puede simplificar esto y hacerlo más legible escribiendo

mysql_connect('localhost','root','mypassword') or die('Could not connect to mysql:<hr>'.mysql_error());

Para resolver su problema, vea si los nombres de columna específicos ayudan. Si no lo hace, mysql asumirá que ingresa valores en el orden de las columnas, es posible que tenga algún problema con un campo de ID o algo así. Su consulta podría verse así:

"INSERT INTO my metrics (date,metric1,metric2) VALUES ('$data','$metric1','$metric2'))"

Y finalmente, aquí hay una consideración de velocidad.

Hay dos formas de escribir cadenas: usando comillas simples ('cadena') y usando comillas dobles ("cadena"). en el caso de 'cadena' y "cadena", funcionarán exactamente igual, pero hay una diferencia. Mira el siguiente código

$age=3
echo 'the cat is $age years old.';
//prints out 'the cat is $age years old.'

echo "the cat is $age years old.";
//prints out 'the cat is 3 years old'

echo 'the cat is '.$age.' years old';
//prints out 'the cat is 3 years old'.

Como puede ver en este ejemplo, cuando usa comillas simples, PHP no verifica la cadena en busca de variables y otras cosas para analizar dentro de la cadena. Hacer eso lleva a PHP más tiempo que concatinar la variable a la cadena. así que aunque

echo "the cat is $age years old"

es más corto de escribir que

echo 'el gato es'. $ edad '. años';

aumentará la carga de su página cuando escriba aplicaciones más grandes.

contestado el 16 de mayo de 11 a las 23:05

'date','metric1','metric2' ¿No deberían ser comillas invertidas? Por lo general, los dejo fuera cuando escribo SQL a mano, pero no creo que las comillas simples funcionen allí. - SeanJA

Aparentemente no puedo editar ... ; or die debería ser: `or die` sin punto y coma o rompe la línea y probablemente arroja un error del analizador - SeanJA

+1 por un buen consejo, pero -1 por perpetuar el mito de que las comillas simples tienen cualquier efecto sobre el rendimiento. El beneficio es microsegundos - ¡millonésimas de segundo! Cada llamada a la base de datos tardará cientos o miles de veces más. - Pekka

-1 por olvidarse de echo 'the cat is ',$age,' years old'; al preocuparse por las microoptimizaciones: P - SeanJA

Gracias por las aclaraciones sobre los apóstrofos y las comillas. ¡Este matiz finalmente tiene sentido ahora! ¡Impresionante! - Katherine Chalmers

¡Hurra! ¡Hurra! ¡Hurra!

¡Gracias a todos por este útil consejo! ¡Finalmente funciona! Aquí está el código actualizado en caso de que otros novatos tengan el mismo problema. (Espero no haber arruinado nada más).

El formulario

<form method="post" action="post_metrics_stack.php" >
  <p>Date<br />
  <input name="date" type="text" /></p>

  <p>Metric1<br />
  <input name="metric1" type="text" /></p>

  <p>Metric2<br />
  <input name="metric2" type="text" /></p>

<input type="submit" name="submit" value="Submit" />
</form>

Procesador

<?php 

  ini_set('display_errors', 1); error_reporting(E_ALL); 

  // 1. Create connection to database

  mysql_connect('localhost','root','mypassword') or die('Could not connect to mysql: <hr>'.mysql_error());

  // 2. Select database

  mysql_select_db("my_metrics") or die('Could not connect to database:<hr>'.mysql_error());


  // 3. Assign variables (after connection as required by escape string)

    $date=mysql_real_escape_string($_POST['date']);
    $metric1=mysql_real_escape_string($_POST['metric1']);
    $metric2=mysql_real_escape_string($_POST['metric2']);


  // 4. Insert data into table

  mysql_query("INSERT INTO my_metrics (date, metric1, metric2) VALUES ('$date', '$metric1', '$metric2')"); 

  Echo 'Your information has been successfully added to the database.';  

  print_r($_POST);

  mysql_close()

?> 

contestado el 17 de mayo de 11 a las 16:05

Genial, asegúrate de volver y marcar esta como la respuesta correcta en un par de días. - SeanJA

Aquí tienes amor :) prueba W3c es un buen lugar para nuevos pepps

 <?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO my_metrics (date, metric1, metric2)
    VALUES
    ('$_POST[date]','$_POST[mertric1]','$_POST[metric2]')";

    if (!mysql_query($sql,$con))
      {
      die('Error: ' . mysql_error());
      }
    echo "Your metrics have been successfully added to the database.";

    mysql_close($con)
    ?>

contestado el 16 de mayo de 11 a las 23:05

Esto es vulnerable a la inyección de SQL. - Pekka

Sí, lo es, pero la pregunta es "¿por qué esto no funciona" no "por qué mi base de datos es gonzo?", Es bueno señalar la falla, pero es posible que se haya omitido porque mysql_real_escape_string es muy largo para escribir 3 veces. Sin embargo, señala la falla del sitio web W3fools si esto se copia directamente desde allí. - SeanJA

@SeanJA No importa lo que se pregunte, el código que contiene vulnerabilidades no debe publicarse en SO. Eso ser copiada y pegada por personas. Discusión relacionada: ¿Qué hacer con las preguntas con contenido "dañino"? - Pekka

Muchas gracias, tomará nota de la vulnerabilidad y la abordará. - Katherine Chalmers

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.