PHP con MySQL: Insertar datos en MySQL

Continuando con la serie de artículos dedicados a explicar como trabajar PHP con MySQL, ahora nos toca explicar como insertar datos o registros en nuestras tablas de MySQL.

Requerimientos

Para guardar datos en MySQL es necesario primero crear una conexión con MySQL, también necesitamos una base de datos de ejemplo el cual pueden crear con el siguiente script SQL y finalmente conocimientos básicos de SQL.

Conceptos Básicos

PHP provee funciones nativas que permiten interactuar con MySQL, para el proceso de insertar registros utilizaremos las siguientes funciones.

  • mysql_query permite enviar cualquier consulta SQL (SELECT, INSERT, UPDATE, etc.) desde PHP.
  • mysql_insert_id devuelve el identificador del último registro ingresado.

Entonces si deseamos insertar una nueva empresa en nuestra tabla de ejemplo tendríamos:

// abrimos la conexión
require("conexion.php");
// insertarmos el registro
mysql_query("INSERT INTO empresa (nombre, direccion) VALUES ('Apple', '1 Infinite Loop')");
// mostramos el ID del registro
echo mysql_insert_id();

Como pueden ver la creación de datos es sencilla, solo necesitamos crear la consulta adecuada y la enviamos mediante mysql_query.

Ejemplo Práctico

Veamos un ejemplo práctico, donde mediante un formulario en HTML registraremos los datos de las empresas.

Creando el Formulario

Para nuestro ejemplo creamos un formulario con tres campos (nombre, dirección y teléfono) con dos botones uno para enviar los datos y otro para limpiar el formulario.

<form method="post" action="agregar-empresa.php">
    Nombre  <input type="text" id="nombre" name="nombre" /><br />
    Direcci&oacute;n  <input type="text" id="direccion" name="direccion" /><br />
    Tel&eacute;fono   <input type="text" id="telefono" name="telefono" /><br />
    <button type="submit">Guardar</button>
    <button type="reset">Limpiar</button>
</form>

Procesando los Datos

El siguiente paso, es verificar si se están enviando datos desde un formulario para luego crear la consulta concatenando los datos enviados para finalmente guardar los datos con la función mysql_query.

// file: insert-demo2.php
require("conexion.php");
$status = "";
if (isset($_POST["nombre"])) {
	$nombre = $_POST["nombre"];
	$direccion = $_POST["direccion"];
	$telefono = $_POST["telefono"];
	// Creamos la consulta	
	$sql = "INSERT INTO empresa (nombre, direccion, telefono) ";
	$sql.= "VALUES ('".$nombre."', '".$direccion."', '".$telefono."')";
	// enviamos la consulta
	mysql_query($sql, $conexion);
	$status = "ok";
}

Uniendo el código obtenemos nuestro primer ejemplo funcionando para agregar registros desde un formulario.

Filtrando los Datos

El ejemplo anterior, funciona pero tiene un problema y es que el usuario podría haber ingresado datos inválidos (Por ejemplo texto donde solo se aceptan números) o también enviar código SQL para atacar a nuestra base de datos. Por ello antes de utilizar los datos enviados por el usuario es necesario antes normalizar estos datos.

Creamos una función llamada sqlValue, esta se encarga de convertir al tipo de dato correcto y agregarle los apostrofes necesarios para los textos y fechas.

// file: funciones.php
function sqlValue($value, $type) {
  $value = get_magic_quotes_gpc() ? stripslashes($value) : $value;
  $value = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($value) : mysql_escape_string($value);
  switch ($type) {
    case "text":
      $value = ($value != "") ? "'" . $value . "'" : "NULL";
      break;
    case "int":
      $value = ($value != "") ? intval($value) : "NULL";
      break;
    case "double":
      $value = ($value != "") ? "'" . doubleval($value) . "'" : "NULL";
      break;
    case "date":
      $value = ($value != "") ? "'" . $value . "'" : "NULL";
      break;
  }
  return $value;
}

Esta función recibe dos parámetros, el primero el dato que deseamos normalizar y el segundo el tipo de dato (text, int, double, date). Luego vamos a modificar nuestro primer script para verificar los datos antes de guardarlos.

// file: insert-demo3.php
require("conexion.php");
require("funciones.php");
$status = "";
if (isset($_POST["nombre"])) {
	$nombre = sqlValue($_POST["nombre"], "text");
	$direccion = sqlValue($_POST["direccion"], "text");
	$telefono = sqlValue($_POST["telefono"], "int");
	
	$sql = "INSERT INTO empresa (nombre, direccion, telefono) ";
	$sql.= "VALUES (".$nombre.", ".$direccion.", ".$telefono.")";
	
	mysql_query($sql, $conexion);
	$status = "ok";
}

Unimos nuevamente el código y obtenemos una nueva forma de guardar datos en MySQL esta vez verificando los tipos de datos antes de guardarlos.

Haciendo pequeñas modificaciones podríamos guardar los datos de cualquier formulario, no importa la cantidad de datos o la complejidad de los mismos, todo este proceso se puede resumir en armar correctamente la consulta SQL para insertar los datos.

Depurar los INSERTS

Si tienen problemas en la creación de sus consultas por que no insertan o generan un error, lo mas sencillo es imprimir la consulta antes de enviarla a MySQL y detener la ejecución del script PHP.

$sql = "INSERT INTO empresa (nombre, direccion, telefono) ";
$sql.= "VALUES (".$nombre.", ".$direccion.", ".$telefono.")";
echo $sql;
exit;
mysql_query($sql, $conexion);

La consulta devuelta podemos revisarla y detectar algún error de sintaxis, también podríamos ejecutarla directamente en algún cliente de MySQL que tengamos para verificar si hace la inserción correctamente.

[download id=»50″ autop=»false»]

Nota Final

Para mejorar aún mas nuestro script para insertar datos, podríamos agregar validación de formularios. Ello lo podríamos hacer desde el lado del cliente mediante una librería javascript para validar formulario (Por ejemplo: Validar Formularios con Mootools o también Vanadium: Validar formularios fácilmente). La segunda forma es hacerlo con PHP verificando que los datos no estén vacíos, asignando valores por defecto si es que el campo esta vacío, entre otras verificaciones.

Comentarios Total 13 comentarios

josepex
Publicado: 18/12/2010 9:38 am

como siempre simple y directo, tremenda la clase para filtrar los datos… saludos :-)

Javier
Publicado: 20/12/2010 5:20 pm

enhorabuena!!! sigan asi(Y); esperando un articulo sobre el update de mysql :D

Saludos!!!

marco
Publicado: 29/12/2010 2:21 am

creo que habias posteado uno muy parecido
http://blog.unijimpe.net/insertar-registros-en-mysql/

Katy
Publicado: 01/02/2011 12:04 am

Hi! I cannot speak spanish.. sorry :/

Did you create the WP Archives plugin? If so, can you tell me how to additionally group by user?

So like this:

January 2011
User
post name
post name
Total posts: 2

User
post name
Total posts: 1

Mauricio
Publicado: 22/08/2011 10:22 am

aunque veo bien que se filtre por las dudas veo que le falta algo al script y es que no tiene comprobaciones, sería muy util que se explique tambien como hacer esas comprobaciones ya que no todo el mundo sabe realmente como hacerlas y ya que el ejemplo es bueno y FUNCIONA (cosa que no puedo decir de otros ejemplos que andan en otros lados) pues simplemente para completar un poquito el script hay que agregarle las comprobaciones (y un id autoincremental tambien sería muy util para el ejemplo)

krlitoos
Publicado: 23/11/2011 6:31 pm

Hola, estoy probando de hacer este ejemplo. He creado dos ficheros, uno llamado register.html (el formulario) y otro llamado register.php (donde va el codigo que enviamos los datos a la bd).

En el formulario cuando le doy a enviar se me descarga el archivo register.php y no me funciona evidentemente. ¿Que hago mal?

Gracias

PD: Sigue asi. Geniales los tutoriales ;)

unijimpe
Publicado: 23/11/2011 7:02 pm

krlitoos, asegurate que el nombre de tu archivo ‘register.php’ no tenga espacios en blanco. Además de ellos el servidor web donde lo estas probando debe tener instalado PHP para poder interpretar las sentencias PHP.

Israel
Publicado: 01/12/2011 4:16 pm

Excelente amigo gracias por el aporte

oscar parra
Publicado: 23/05/2012 11:26 pm

Hola,,,gracias por tu gran trabajo, me ha servido bastante, mira tengo una inquietud, cuando usas la funcion sqlvalue, en el caso de tener un campo tipo int, cuando ingreso otro tipo de campo, por ejemplo texto, el igual me guarda el ese dato en la base de datos, osea no esta haciendo la validacion de que hablabas…o esa funcion no hace ese trabajo…

marlon martos
Publicado: 03/07/2012 2:38 pm

#el registro para dato tipo date «fecha»
# codigo

<?php
include("../func/funciones.php");
$consulta=mysql_query("SELECT descripcion_producto, UNIX_TIMESTAMP(fecha_caducidad_pro) AS fecha_subscrip FROM productos WHERE idproductos='60' ; ");
$tipoPropadre=mysql_fetch_assoc($consulta);
$fecha_inicio=$tipoPropadre['fecha_subscrip'];
echo $fecha_inicio."»;
//final: dentro de 90 dias
$fecha_final=strtotime(«+7 days», $fecha_inicio);
//¿Cuanto queda?
$quedan_dias=ceil(($fecha_final-time())/86400);
//damos un poco de formato a los dias restantes…
switch($quedan_dias){
case 0:
$dias=»hoy»;
break;
case 1:
$dias=»mañana»;
break;
default:
$dias=»dentro de «.$quedan_dias.» días»;
}
?>
Tu oferta de prueba durante 90 días, que comenzó el ,
finaliza , el

julio
Publicado: 24/08/2012 3:38 pm

no hace nada el codigo ya lo descarge y lo ejecuto desd un iframe

Luis martinez
Publicado: 26/08/2012 11:17 am

Hola amigos. Tengo un problema con una tabla. La misma recibe datos normalmente, pero cuando le agrego un identificador (id) como clave primaria y auto_incremento, deja de hacerlo. A qué se debe esto?. Auxilio

blanca
Publicado: 29/08/2012 6:07 pm

mucha muchas gracias!!!:D m ayudaste mucho

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)