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.

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


Resumen

// 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'";

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

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

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

Volver al principio

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