PHP dispone de dos extensiones (llamadas mysql y mysqli) y para acceder a la base de datos MySQL. La extensión mysql es la más antigua. La extensión mysqli es más moderna y está pensada para sacar partido de las versiones más recientes de MySQL (4.1 y posteriores). En esta lección se utiliza mysqli.
Tengo que mirar cómo se hace para meter números grandes
// CONECTAR CON LA BASE DE DATOS $db = mysqli_connect('localhost', 'root', '') or die("Could not open database"); // CONSULTAS mysqli_query($db, $consulta); // BORRAR LA BASE DE DATOS $consulta = "DROP DATABASE agenda" // CREAR LA BASE DE DATOS $consulta = "CREATE DATABASE agenda" //CREAR TABLA $consulta = "CREATE TABLE agenda.personas ( id INTEGER UNSIGNED NOT NULL DEFAULT 0 AUTO_INCREMENT, nombre VARCHAR(50), apellidos VARCHAR(80), telefono INTEGER(9), correo VARCHAR(50), PRIMARY KEY(id) )"; // Se puede poner al final de la $consulta TYPE = InnoDB;"; // BORRAR TABLA // AÑADIR DATO $consulta = "INSERT INTO agenda.personas
values (NULL, $nombre, $apellidos, $telefono, $correo)"; // SELECCIONAR $consulta = "SELECT * FROM agenda.personas ORDER BY ".$campo." ".$orden; // Para comprobar si el resultado es vacío: if (mysqli_num_rows($result) == 0) // El resultado de la consulta se trata con: while ($valor = mysqli_fetch_array($result, MYSQLI_ASSOC)) // El tipo de la tabla puede ser MYSQLI_ASSOC, MYSQLI_NUM, MYSQLI_BOTH // BORRAR foreach ($_REQUEST as $num => $basura) { $consulta = "DELETE FROM agenda.personas WHERE id=".$num; // BUSCAR $consulta = "SELECT * FROM agenda.personas WHERE nombre LIKE '%$nombre%'" ." AND apellidos LIKE '%$apellidos%' AND telefono LIKE '%$telefono%'" ." AND correo LIKE '%$correo%' ORDER BY $campo $orden"; // MODIFICAR $consulta = "UPDATE agenda.personas SET nombre='$nombre',
apellidos='$apellidos', telefono='$telefono', correo='$correo'
WHERE id='$id'";
La función para conectar con la base de datos es mysqli_connect($hostname, $usuario, $password), que devuelve un identificador de enlace que se utiliza en todas las consultas posteriores.
En el ejemplo siguiente, la variable $db almacena el identificador de enlace.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); ?> |
Si no se puede establecer la conexión con la base de datos, puede deberse a que la base de datos no esté funcionando, a que los datos de usuario no sean correctas o a que no esté activada la extensión mysqli (véase la lección sobre configuración de php).
Una vez realizada la conexión a la base de datos, las operaciones se realizan a través de consultas.
La principal función para efectuar consultas es mysqli_query($db, $consulta). Dependiendo del tipo de consulta, la función devuelve un valor lógico o un recurso.
Hablar de las otras consultas (obsoletas o no).
Los ataques malintencionados más habituales son las inyecciones de SQL, que consisten en enviar en los campos de formulario partes de una consulta SQL de manera que PHP ejecute una consulta distinta a la preparada por el programador de la página.
Para evitar este tipo de ataques, es necesario utilizar la función mysqli_real_escape_string($db, $cadena) antes de incluir en la consulta datos enviados por el usuario. Esta función debe aplicarse a cualquier campo de formulario que vaya a incluirse dentro de una consulta.
<?php function recoge_para_consulta($db, $var) { $var = (isset($_REQUEST[$var])) ? trim(strip_tags($_REQUEST[$var])) : ""; if (get_magic_quotes_gpc()) $var = stripslashes($var); if (!is_numeric($var)) $var = "'" . mysqli_real_escape_string($db, $var) . "'"; return $var; } $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $nombre = recoge_para_consulta($db, "nombre"); ?> |
Falta explicar el ejemplo (get_magic_quotes_gpc,
stripslashes, is_numeric, etc).
Faltan ejemplos de inyecciones: esta página en francés habla sobre el tema
http://www.phpsecure.info/v2/article/InjSql.php
Para crear una base de datos, se utiliza la consulta CREATE DATABASE.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "CREATE DATABASE agenda"; if (mysqli_query($db, $consulta)) print "<p>Base de datos creada correctamente.</p>"; else print "<p>Error al crear la base de datos.</p>"; ?> |
Para borrar una base de datos, se utiliza la consulta DROP DATABASE.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "DROP DATABASE agenda"; if (mysqli_query($db, $consulta)) print "<p>Base de datos eliminada correctamente.</p>"; else print "<p>Error al eliminar la base de datos.</p>"; ?> |
Para crear una tabla, se utiliza la consulta CREATE TABLE.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "CREATE TABLE agenda.personas (id INTEGER UNSIGNED NOT NULL DEFAULT 0 AUTO_INCREMENT, nombre VARCHAR(50), apellidos VARCHAR(80), PRIMARY KEY(id))"; if (mysqli_query($db, $consulta)) print "<p>Tabla creada correctamente.</p>"; else print "<p>Error al crear la tabla.</p>"; ?> |
Para borrar una tabla, se utiliza la consulta DROP TABLE.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "DROP TABLE agenda.personas"; if (mysqli_query($db, $consulta)) print "<p>Tabla eliminada correctamente.</p>"; else print "<p>Error al eliminar la tabla.</p>"; ?> |
Para añadir un registro a una tabla, se utiliza la consulta INSERT INTO.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "INSERT INTO agenda.personas values (NULL , 'pepito' , 'conejo')"; if (mysqli_query($db, $consulta)) print "<p>Registro añadido correctamente.</p>"; else print "<p>Error al añadir el registro.</p>"; ?> |
Si se insertan datos provinientes de un formulario, las cadenas deben haberse tratado para evitar inyecciones de SQL.
Para modificar un registro a una tabla, se utiliza la consulta UPDATE.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "UPDATE agenda.personas SET nombre='Juan', apellidos='López' WHERE id='4'"; if (mysqli_query($db, $consulta)) print "<p>Registro modificado correctamente.</p>"; else print "<p>Error al modificar el registro.</p>"; ?> |
Si se insertan datos provinientes de un formulario, las cadenas deben haberse tratado para evitar inyecciones de SQL.
Para borrar un registro de una tabla, se utiliza la consulta DELETE FROM.
<?php<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "DELETE FROM agenda.personas WHERE id='1'"; if (mysqli_query($db, $consulta)) print "<p>Registro borrado correctamente.</p>"; else print "<p>Error al borrar el registro.</p>"; ?> |
Para obtener registros que cumplan determinados criterios se utiliza la consulta SELECT.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "SELECT * FROM agenda.personas ORDER BY apellidos DESC"; $resultado = mysqli_query($db, $consulta, MYSQLI_ASSOC); ?> |
La consulta SELECT permite efectuar búsquedas en cadenas utilizando el condicional LIKE o NOT LIKE y los comodines _ (cualquier carácter) o % (cualquier número de caracteres). La primera consulta del ejemplo siguiente devolvería todos los registros en los que el primer apellido es Pérez, mientras que la segunda consulta devolvería todos los registros en los que el primer o segundo apellido es Pérez.
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "SELECT * FROM agenda.personas WHERE apellidos LIKE 'Pérez%'"; $resultado = mysqli_query($db, $consulta, MYSQLI_ASSOC); ?> |
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $consulta = "SELECT * FROM agenda.personas WHERE apellidos LIKE '%Pérez%'"; $resultado = mysqli_query($db, $consulta, MYSQLI_ASSOC); ?> |
Se pueden realizar consultas de unión:
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $resultado = mysqli_query($db, "SELECT * FROM agenda.personas, agenda.ciudades WHERE personas.nacido-localidad=ciudades.id", MYSQLI_ASSOC); ?> |
Si se utiliza la misma tabla dos veces se deben utilizar alias:
<?php $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos"); $resultado = mysqli_query($db, "SELECT * FROM agenda.personas , agenda.ciudades AS nacido, ciudades.agenda AS fallecido WHERE personas.nacido-localidad=nacido.id AND personas.fallecido-localidad=fallecido.id", MYSQLI_ASSOC); ?> |