🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PHP y MySQL
  3. Acceder a una base de datos MySQL
Extrait - PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición)
Extractos del libro
PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición) Volver a la página de compra del libro

Acceder a una base de datos MySQL

Introducción

1. Visión de conjunto

La utilización de una base de datos SQL es a menudo indispensable para la puesta en marcha de un sitio web dinámico. De hecho, es un método estándar para el almacenamiento de datos útiles para el sitio web:

  • Lista de los usuarios con sus preferencias.

  • Catálogo de productos.

  • Registro de transacciones realizadas…

PHP ofrece un soporte nativo para un gran número de bases de datos, entre las cuales se encuentra MySQL, Oracle, Microsoft SQL Server, Informix, Sybase, SQLite. Por otro lado, PHP admite ODBC (Open DataBase Connectivity) y puede, por lo tanto, acceder a cualquier base de datos que soporte ODBC.

En este libro, estudiaremos el acceso a una base de datos MySQL.

En la mayoría de los casos, cuando se utilice una base de datos, el script PHP tendrá que realizar una o varias de las siguientes tareas:

  • Conectarse y desconectarse.

  • Leer datos (una fila o varias filas).

  • Actualizar datos (añadir, modificar o eliminar).

En este capítulo estudiaremos las principales operaciones.

Para los diferentes ejemplos, utilizaremos la base de datos eni creada en el capítulo Introducción a MySQL. Para obtener los mismos resultados que los presentados en este capítulo, debe volver a crearse la base de datos.

Ejemplo

[root@xampp ~]#mysql -u root < crear-base-eni.sql 

2. ¿Qué extensión utilizar para acceder a MySQL?

La extensión...

Utilización de la extensión MySQLi

1. Introducción

La extensión MySQLi puede utilizarse, bien en forma de procedimiento, bien en forma de objeto.

En su forma orientada a objetos, la extensión MySQLi ofrece tres clases principales:

mysqli

Conexión entre PHP y MySQL.

mysqli_stmt

Consulta preparada.

mysqli_result

Resultado de la ejecución de una consulta.

Estas diferentes clases ofrecen métodos que permiten efectuar las diferentes acciones (ejecución de una consulta, recuperación del resultado, etc.).

En su forma de procedimiento, la extensión MySQLi ofrece funciones que permiten efectuar las mismas acciones. Varias de estas funciones devuelven o admiten sin ningún problema objetos de tipo mysqli o mysqli_result como parámetros.

En este libro, presentaremos únicamente la forma de procedimiento de la extensión MySQLi.

La extensión MySQLi permite usar las consultas preparadas.

Una consulta preparada es una consulta que contiene parámetros representados por un signo de interrogación (?).

Ejemplos

SELECT * FROM coleccion WHERE id = ? 
INSERT INTO coleccion(nombre,precio_siniva) VALUES(?,?) 

En sentido contrario, una consulta no preparada es una consulta en la que se especifican todos los valores.

Ejemplos

SELECT * FROM coleccion WHERE id = 1 
INSERT INTO coleccion(nombre,precio_siniva) VALUES('Open IT',5.69) 

En este capítulo, explicaremos cómo ejecutar consultas de lectura y de actualización, primero con consultas no preparadas (véase el apartado Utilizar consultas no preparadas) y luego con consultas preparadas (véase el apartado Utilizar consultas preparadas). 

2. Conexión y desconexión

a. Conexión

La función mysqli_connect permite establecer una conexión con una base de datos MySQL.

Sintaxis

objeto mysqli_connect([cadena host [, cadena usuario 
[,cadena contraseña [, cadena nombre_base [, entero puerto [, 
cadena socket]]]]]]) 

host

Nombre (o dirección IP) del host al que debe conectarse (equipo local predeterminado).

usuario

Nombre del usuario que debe utilizarse para establecer la conexión. Valor predeterminado: el propietario del proceso del servidor web.

contraseña

Nombre del usuario que debe utilizarse para establecer la conexión. Valor predeterminado: cadena vacía (sin contraseña)....

PHP Data Objects (PDO)

PHP Data Objects (PDO) es una extensión que define una interfaz uniforme para acceder a las bases de datos en PHP. El acceso a una base de datos a través de PDO se efectúa por mediación de un controlador que presenta las características de la base de datos.

Nótese que PDO no proporciona una capa de abstracción de la base de datos, sino una capa de abstracción del acceso a las bases de datos. Las consultas deben respetar la sintaxis de la base de datos que se utilice; PDO no reescribe las consultas SQL y no emula las funcionalidades que faltan (con la excepción de las consultas configuradas).

Numerosas bases de datos, como MySQL, Oracle, Microsoft SQL Server y SQLite, disponen de un controlador PDO.

PDO es una extensión orientada a objetos que ofrece tres clases:

  • PDO: conexión entre PHP y la base de datos,

  • PDOStatement: consulta preparada y, tras la ejecución, resultado asociado,

  • PDOException: excepción identificada por PDO.

En este capítulo, presentaremos esta extensión mediante un simple ejemplo comentado: 

<?php 
//Definición de los parámetros de conexión. 
// La sintaxis del código fuente (Data Source Name o DSN) 
// es específica de cada controlador. 
$codigo = 'mysql:host=localhost;dbname=eni'; 
$usuario = 'eniweb'; 
$contrasenia...

Gestión de apóstrofos en el texto de las consultas

En caso de utilizar consultas no preparadas, puede haber problemas si hay un apóstrofo en una cadena de caracteres presente en una consulta.

Ejemplo (inserción en una base de datos MySQL de un dato que contiene un apóstrofo):

<?php 
// Desactivar el reporte de errores 
mysqli_report(MYSQLI_REPORT_OFF); 
// Dato que plantea problema (puede introducirse inocentemente 
// en un formulario). 
$nombre = "Frank O'Connor"; 
$precio_siniva = 10; 
// Consulta de inserción. 
$sql = "INSERT INTO coleccion(nombre,precio_siniva) " . 
       "VALUES('$nombre',$precio_siniva)"; 
echo $sql,'<br />'; 
// Ejecución. 
$db = mysqli_connect('localhost','eniweb','web','eni'); 
$consulta = mysqli_query($db,$sql); 
echo mysqli_error($db),'<br />';  
$ok = mysqli_close($db); 
?> 

Resultado

INSERT INTO coleccion(nombre,precio_siniva) VALUES('O'Connor',10) 
You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax 
to use near 'Connor',10)' at line 1 

En SQL, el delimitador de cadena de caracteres es el apóstrofo: Si una consulta envía la cadena O’Connor a la base de datos, esta última interpretará ’O’ como una cadena y no sabrá qué hacer con el resto (Connor’):

Para solucionar este problema, es necesario indicar a la base de datos que los apóstrofos...

Ejemplos de integración en formularios

1. Visión de conjunto

Para terminar este capítulo, vamos a presentar algunos ejemplos de acceso a una base de datos MySQL a partir de formularios.

Veremos tres ejemplos:

  • un formulario que permite introducir datos en una lista;

  • un formulario de búsqueda con visualización del resultado;

  • un formulario de entrada de tipo «página».

Por razones de concisión, en estos ejemplos, el control de entrada y la gestión de errores están prácticamente ausentes, y el formato es muy sencillo.

2. Formulario de entrada en lista

Presentación del formulario

images/page617.png

El formulario ofrece el contenido actual de la tabla que se puede modificar (entrada directa en las zonas de texto) o eliminar (por medio de las casillas de la derecha), más cinco filas vacías para introducir nuevos valores. El identificador no puede introducirse, es el servidor MySQL quien lo asigna.

Cada fila de la tabla contiene cuatro zonas de formulario nombradas (atributo name de la etiqueta <input>) de la siguiente manera:

Columna

Nombre

Identificador

entrada[i][modificar]

Nombre

entrada[i][nombre]

Precio sin IVA

entrada[i][precio_siniva]

Eliminar

entrada[i][eliminar]

El índice i es el identificador de la colección para las filas que existen y un número comprendido entre -1 y -5 para las filas vacías. La zona de la columna Identificador es una zona oculta (type="hidden") que se utilizará para identificar las filas en las que el usuario ha efectuado una modificación.

Con este proceso de identificación, cualquier entrada es recuperada en el script PHP con la forma de una tabla multidimensional. Cada línea de la tabla corresponde a una línea del formulario con la clave igual al identificador (o de -1 a -5 para las nuevas líneas) y el valor igual a una tabla asociativa que da los elementos introducidos.

Para identificar las líneas modificadas por el usuario, las zonas de entrada del nombre y del precio de las líneas existentes contienen el siguiente código JavaScript:

onChange="document.formulario[$n].value=1" 

Este pequeño fragmento de código JavaScript tiene como efecto, cada vez que la zona correspondiente es modificada, poner un 1 en la zona oculta asociada a la línea. Con el formulario que se llama formulario (<form name = "formulario"...)...