Cómo insertar en MySQL desde PHP

Estás intentando guardar los datos de tu formulario en una base de datos, todo funciona bien salvo que… cuando vas a mirar tu tabla… nada por aquí, nada por allá.

¿Qué pasó?

Ya buscaste en Google, ya probaste de todo y nada funciona.

Estás desesperado y sentís que sólo estás tirando tiros a ciegas

Calma

Todo tiene solución 🙂

A lo largo de este artículo conocerás los motivos más comunes de estos problemas pero primero debemos poner algunos puntos en común.

Existen varios métodos para realizar una consulta a MySQL utilizando PHP pero a nivel conceptual todos hacen lo mismo:

  1. Establecer una conexión entre tu aplicación y el servidor MySQL
  2. Generar el código SQL que corresponde con la operación que buscás realizar
  3. Enviar el comando a través de la conexión
  4. Evaluar el resultado

Este último punto suele ser la clave del misterio.

Paso 1: Conectar nuestro PHP al MySQL

Un esqueleto de código adaptable a situaciones como esta es:

<?php

$conn = mysqli_connect("127.0.0.1", "mi_usuario", "mi_contraseña", "mi_bd");

En este ejemplo estamos intentando realizar una conexión a un servidor MySQL que se encuentra en la misma computadora que está ejecutando el script PHP (Por eso usamos el parámetro «127.0.0.1» o «localhost»).

Para identificarnos usamos las credenciales «mi_usuario»:»mi_contraseña».

Y por último, estamos indicando que queremos trabajar sobre la base de datos llamada «mi_bd».

Aquí nos enfrentamos con el primer set de potenciales problemas.

¿Qué puede salir mal?

  1. El servidor MySQL puede no estar instalado o encendido en este momento
  2. El nombre de usuario puede no ser correcto
  3. La contraseña puede no ser correcta
  4. La base de datos puede no existir
  5. El usuario que estamos utilizando puede no tener permisos para acceder a esta base

Si se da cualquiera de estas situaciones la conexión no será exitosa… y ¡más vale que nos enteremos de eso cuanto antes!

De modo que, lo primero que debemos hacer es agregar una condición que permita verificar el resultado de nuestro intento:

<?php

$conn = mysqli_connect("127.0.0.1", "mi_usuario", "mi_contraseña", "mi_bd");

if (!$conn) {
   ...
}

Cómo diagnosticar los problemas de conexión a MySQL

Con esta verificación estamos definiendo un curso de acción especial para el caso de que la conexión no se haya podido establecer.

Claro que, como decía anteriormente, hay múltiples razones por las que eso puede haber sucedido y, si queremos resolverlo (y seguramente si estás leyendo esto es porque así es), tenemos que ser capaces de diagnosticar el problema.

Para ello cuentas con la ayuda de las funciones mysqli_connect_errno y mysqli_connect_error, las cuales te dan el código y mensaje de error respectivamente.

Entonces, el código completo de la conexión será algo como:

<?php

$conn = mysqli_connect("127.0.0.1", "mi_usuario", "mi_contraseña", "mi_bd");

if (!$conn) {
    echo "Error: No se pudo conectar a MySQL. Error " . mysqli_connect_errno() . " : ". mysqli_connect_error() . PHP_EOL;
    die;
}

Es importante agregar el die para evitar que el script continúe ejectuándose aún cuando la conexión haya fallado.

Si nada de esto ha sucedido, es hora de pasar al siguiente paso: armar el SQL

Paso 2: Generar código SQL usando PHP

Nuevamente, existen varias formas de lograr esto, todas dependen de tu objetivo particular pero lo que siempre debes tener en cuenta es que la comunicación entre una aplicación PHP y un servidor MySQL se realiza mediante el envío de un string:

Claro que no se trata de un string cualquiera… tiene que ser un string que contenga código SQL correctamente escrito.

Y aquí aparece nuestro primer sospechoso:

¿está bien escrito el INSERT?

Algunas formas de escribir un INSERT

La forma más común de INSERT es:

  INSERT INTO tabla (campo1, campo2, campo3) VALUES (valor1, valor2, valor3);

En este caso, tabla es el nombre de la tabla en la base de datos donde queremos almacenar la información.

campoX es el nombre del campo al que queremos darle valor y valorX es el valor que queremos que se asigne a dicho campo en el nuevo registro.

Es importante comprender que la asociación valor => campo se realiza en forma posicional, es decir: el primer valor se asignará al primer campo de la consulta, el segundo al segundo y así sucesivamente.

Por ejemplo, si fuéramos a insertar los datos de un nuevo cliente podríamos usar algo como:

  INSERT INTO tabla (nombre, telefono, email) VALUES ('Mauro', '1234', 'mauro.chojrin@leewayweb.com');

Nota cómo los valores se escriben entre comillas mientras que los nombres de los campos no.

Otra forma de escribir un INSERT en SQL es esta:

  INSERT INTO tabla VALUES (valor1, valor2, valor3);

La diferencia entre la primera y esta es que aquí no estoy aclarando a qué campos quiero darles valor.

A esta se la conoce como sintaxis abreviada.

Puede resultar muy cómoda ya que nos hace ahorrar caracteres pero también esconde un pequeño peligro: al no aclarar a qué campos queremos asignar valor se asume que queremos hacerlo para todos los campos existentes.

Y cuando digo todos me refiero a todos: ¡los autonuméricos también!

En el caso de MySQL, si quisieras usar esta sintaxis y tu tabla tuviese un campo autonumérico lo que deberías hacer es asignar un NULL (¡Sin comillas!) a la posición que corresponde a ese campo.

Otra desventaja de esta sintaxis es que si en algún momento cambias el orden en que tus campos están dispuestos en la tabla tus consultas perderán validez.

Una última forma de escribir un insert en SQL es esta:

INSERT INTO tabla (campo1, campo2) SELECT valor1, valor2

Esta sintaxis puede parecerte redundante respecto de la primera pero de hecho es mucho más potente: el SELECT podría incluir cualquier expresión de SQL (Por ejemplo, sacar registros de otra/s tabla/s).

¿Siempre deben escribirse los valores entre comillas?

Técnicamente no, aunque yo te lo recomiendo.

MySQL es suficientemente inteligente como para hacer una conversión de ’10’ (String) en 10 (int) si es necesario, con lo cual, es una buena práctica usar siempre las comillas y evitar problemas (Salvo el caso de querer escribir un valor NULL).

Cómo armar un INSERT con PHP

Ahora que estamos de acuerdo en cómo se ve un INSERT correctamente escrito pensemos en cómo puede generarse usando PHP.

El modo más simple es escririrlo en forma literal:

 $sql = "INSERT INTO clientes (nombre, mail) VALUES ('Mauro', 'mauro.chojrin@leewayweb.com');"

Este código es perfectamente válido, aunque no suele ser muy útil.

Imaginemos que los datos del cliente vienen de un formulario enviado utilizando el método POST.

En ese caso el string SQL debería incluir los valores del array $_POST:

 $sql = "INSERT INTO clientes (nombre, mail) VALUES ('{$_POST[nombre]}', '{$_POST[mail]}');"

En este caso los índices del arreglo $_POST (y por ende los campos del lado del HTML) coinciden con los nombres de los campos de la tabla pero esto no necesariamente debe ser así.

Por útlimo, algo que puede resultar muy útil es armar el string SQL en forma iterativa.

Este sería el caso si te encontraras con una situación en la que tienes que insertar una serie de campos que son variables o desconocidos.

Un modo elegante de resolver esta situación es este:

<?php

$insert = "INSERT INTO tabla (";
$values = " VALUES (";
 
foreach ( $_POST as $key => $value ) {
   $insert .= "$key, ";
   $values .= " '$value', ";
}
 
// Eliminar las ultimas comas y cerrar los parentesis
$insert = substr($insert, 0, -2).')';
$values = substr($values, 0, -2).')';
 
$sql = $insert.$values; 

Paso 3: ejecutar la consulta SQL usando PHP

Estamos llegando a la parte más esperada, ejecutar el SQL de la inserción 🙂

Para esto necesitamos enviar el string SQL (Independientemente de cómo lo hayamos creado) al servidor.

Para ello podemos utilizar varias funciones de la librería mysqli, la más común es mysqli_query.

El código que utilizaremos será similar a:

<?php

mysqli_query($conn, $insertSQL);

Con este código estaremos enviando el comando contenido en $insertSQL al servidor a través de la conexión establecida en $conn

Paso 4: controlar los errores de la ejecución de la consulta SQL

Claro que, aún si todo se ve bien… el diablo está en los detalles así que, más vale prevenir que lamentar.

Modifiquemos ligeramente el código para que se vea de esta forma:

<?php

if (($result = mysqli_query($conn, $insertSQL)) === false) {
    die(mysqli_error($conn));
}

Con esta verificación estamos chequeando que la consulta se haya ejecutado exitosamente del lado del servidor y, en caso de que no sea así, cortamos la ejecución del script obteniendo un mensaje de error que nos ayude a identificar y solucionar el problema.

Qué hacer si nos encontramos con errores

En la gran mayoría de los casos ayuda mucho conocer el error específico y saber cuál fue exactamente el comando que se envió al servidor, es decir, cuál era el contenido de la variable $insertSQL.

Para ello lo mejor que podemos hacer es utilizar un debugger.

Si a simple vista todo parece ir bien, otra técnica que ayuda es tomar el código SQL y ejecutarlo en forma directa contra la base de datos (A través de phpMyAdmin, la consola de MySQL o el cliente de tu preferencia).

Una de las causas más comunes de errores en los INSERT se da por incompatibilidad de tipos de datos: verifica que los valores que estás enviando son aceptables para los campos donde quieres insertarlos.

Ultimas consideraciones

  1. La evaluación de los resultados de las operaciones es fundamental para evitar todo tipo de problemas, no sólo los de mysql
  2. Utilizar echo para enterarte de los mensajes de error puede serte útil en tu ambiente de desarrollo, pero en producción, lo último que querés es que cualquier visitante acceda a esa información (Especialmente si se trata de hackers que podrían aprovecharla para vulnerar tu aplicación). Para ello es mejor logear los errores.
  3. Las funciones que mostré en este artículo corresponden al modo procedural de trabajar con MySQL, existen también formas de trabajar utilizando Programación Orientada a Objetos
  4. Los conceptos que viste en este artículo aplican a otras bases de datos también, sólo cambian las funciones específicas

mchojrin

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: