Volver al índiceMySQL en PHP

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.

Nota: La sintaxis de algunas consultas depende de la versión de MySQL instalada en el servidor. Las de esta página han sido probadas en MySQL 5.0.

Tengo que mirar cómo se hace para meter números grandes


Resumen

// CONECTAR CON LA BASE DE DATOS
$db = mysqli_connect('localhost', 'root', '');
if (!$db) {
    print "<p>Imposible conectarse con la base de datos.</p>";
    exit();
}

// EJEMPLOS DE CONSULTAS
// Borrar la base de datos
$consulta = "DROP DATABASE agenda"

// Crear la base de datos
$consulta = "CREATE DATABASE agenda"

// Crear una tabla
$consulta = "CREATE TABLE agenda.gente (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(50), apellidos VARCHAR(80), 
  telefono VARCHAR(9), correo VARCHAR(50),   
  PRIMARY KEY(id) )";
// Se puede poner al final de la $consulta TYPE = InnoDB;";

// Borrar una tabla

// Añadir un dato
$consulta = "INSERT INTO agenda.gente 
values (NULL, '$nombre', '$apellidos', '$telefono', '$correo')"; // Seleccionar totods los registros $consulta = "SELECT * FROM agenda.gente ORDER BY $campo $orden"; // Borrar un registro $consulta = "DELETE FROM agenda.gente WHERE id = '$numero'"; // Borrar varios registros foreach ($_REQUEST['id'] as $num => $basura) { $numero = limpia_para_consulta($db, $num);
$consulta = "DELETE FROM agenda.gente WHERE id = '$numero'"; ... } // Buscar registros $consulta = "SELECT * FROM agenda.gente WHERE nombre LIKE '%$nombre%'" ." AND apellidos LIKE '%$apellidos%' AND telefono LIKE '%$telefono%'" ." AND correo LIKE '%$correo%' ORDER BY $campo $orden"; // Modificar un registro $consulta = "UPDATE agenda.gente SET nombre = '$nombre',
apellidos = '$apellidos', telefono = '$telefono', correo = '$correo'
WHERE id = '$id'"; // FIN EJEMPLOS DE CONSULTAS // EJECUTAR LA CONSULTA
$result = mysqli_query($db, $consulta); // Para comprobar si el resultado es vacío: if (mysqli_num_rows($result) == 0) { print "<p>Sin resultado</p>"; } // Si el resultado de la consulta pueden ser varias filas: while ($valor = mysqli_fetch_array($result, MYSQLI_ASSOC)) { print "<p>Nombre: $valor[nombre] - Apellidos: $valor[apellidos]</p>"; } // El tipo de la tabla puede ser MYSQLI_ASSOC, MYSQLI_NUM, MYSQLI_BOTH // Para comprobar si una base de datos existe se puede hacer la consulta: $consulta = "SELECT COUNT(*) as existe_db FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='agenda'" $result = mysqli_query($db, $consulta); $valor = mysqli_fetch_array($result, MYSQLI_ASSOC); if ($valor['existe'db]) { ...

Volver al principio


Conexión con MySQL

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', '');
if (!$db) {
    print "<p>Imposible conectarse con la base de datos.</p>";
    exit();
}
?>

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 correctos o a que no esté activada la extensión mysqli (véase la lección sobre configuración de php).

Volver al principio


Consultas a la base de datos

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).

Volver al principio


Seguridad en las consultas

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

Volver al principio


Consultas CREATE DATABASE, DROP DATABASE

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>";
}
?>

Volver al principio


Consultas CREATE TABLE, DROP TABLE, INSERT INTO, UPDATE, DELETE FROM

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.gente
                   (id INTEGER UNSIGNED NOT NULL 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.gente";
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.gente 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.gente 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.gente WHERE id = '1'";
if (mysqli_query($db, $consulta)) {
    print "<p>Registro borrado correctamente.</p>";
} else {
    print "<p>Error al borrar el registro.</p>";
}
?>

Volver al principio


Consulta SELECT

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.gente 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.gente 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.gente 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.gente, agenda.ciudades
                                                        WHERE gente.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.gente , agenda.ciudades AS nacido, ciudades.agenda AS fallecido WHERE gente.nacido-localidad = nacido.id AND gente.fallecido-localidad = fallecido.id", MYSQLI_ASSOC);
?>

Volver al principio

Autor: Bartolomé Sintes Marco
Última modificación de esta página: 20 de febrero de 2007