Tutorial PHP

PHP INICIO Introducción PHP Instalación de PHP Sintaxis PHP Comentarios PHP Variables PHP PHP Echo / Imprimir Tipos de datos PHP Cadenas PHP Números PHP Matemáticas PHP Constantes PHP Operadores PHP PHP Si... Más... Elseif Cambio de PHP Bucles de PHP Funciones PHP Matrices de PHP Superglobales de PHP PHP expresión regular

Formularios PHP

Manejo de formularios PHP Validación de formulario PHP Formulario PHP requerido Formulario PHP URL/Correo electrónico Formulario PHP completo

PHP Avanzado

Fecha y hora PHP PHP Incluir Manejo de archivos PHP Archivo PHP Abrir/Leer Archivo PHP Crear/Escribir Carga de archivos PHP Cookies PHP Sesiones PHP Filtros PHP Filtros PHP avanzados Funciones de devolución de llamada de PHP PHPJSON Excepciones de PHP

POO de PHP

PHP ¿Qué es la programación orientada a objetos? Clases PHP/Objetos Constructor PHP Destructor PHP Modificadores de acceso de PHP Herencia de PHP Constantes PHP Clases abstractas de PHP Interfaces PHP Características de PHP Métodos estáticos de PHP Propiedades estáticas de PHP Espacios de nombres de PHP Iterables de PHP

Base de datos MySQL

Base de datos MySQL Conexión MySQL MySQL Crear base de datos Crear tabla MySQL MySQL Insertar datos MySQL Obtener la última identificación MySQL Insertar Múltiples MySQL preparado Datos seleccionados de MySQL mysql donde MySQL Ordenar por MySQL Eliminar datos Datos de actualización de MySQL Límite de datos de MySQL

PHPXML _

Analizadores PHP XML Analizador PHP SimpleXML PHP SimpleXML - Obtener PHP XML Expatriados PHP XML DOM

PHP -AJAX

Introducción a AJAX AJAXPHP Base de datos AJAX XML AJAX Búsqueda en vivo de AJAX Encuesta AJAX

Ejemplos de PHP

Ejemplos de PHP Compilador PHP Cuestionario de PHP Ejercicios PHP Certificado PHP

Referencia PHP

Descripción general de PHP Matriz de PHP Calendario PHP Fecha PHP Directorio PHP Error PHP Excepción PHP Sistema de archivos PHP Filtro PHP PHPFTP PHPJSON Palabras clave PHP PHP Libxml Correo PHP Matemáticas PHP PHP misceláneo PHP MySQLi Red PHP Control de salida de PHP PHP expresión regular PHP SimpleXML flujo PHP Cadena PHP Manejo de variables de PHP Analizador PHP XML código postal de PHP Zonas horarias de PHP

Declaraciones preparadas PHP MySQL


Las declaraciones preparadas son muy útiles contra las inyecciones de SQL.


Declaraciones preparadas y parámetros enlazados

Una declaración preparada es una característica que se utiliza para ejecutar las mismas (o similares) declaraciones SQL repetidamente con alta eficiencia.

Las declaraciones preparadas básicamente funcionan así:

  1. Preparar: se crea una plantilla de declaración SQL y se envía a la base de datos. Ciertos valores se dejan sin especificar, llamados parámetros (etiquetados como "?"). Ejemplo: INSERTAR EN VALORES de MyGuests(?, ?, ?)
  2. La base de datos analiza, compila y realiza la optimización de consultas en la plantilla de declaración SQL y almacena el resultado sin ejecutarlo.
  3. Ejecutar: en un momento posterior, la aplicación vincula los valores a los parámetros y la base de datos ejecuta la instrucción. La aplicación puede ejecutar la sentencia tantas veces como quiera con diferentes valores

En comparación con la ejecución directa de sentencias SQL, las sentencias preparadas tienen tres ventajas principales:

  • Las declaraciones preparadas reducen el tiempo de análisis ya que la preparación de la consulta se realiza solo una vez (aunque la declaración se ejecuta varias veces)
  • Los parámetros vinculados minimizan el ancho de banda al servidor, ya que necesita enviar solo los parámetros cada vez, y no toda la consulta.
  • Las declaraciones preparadas son muy útiles contra las inyecciones de SQL, porque los valores de los parámetros, que se transmiten más tarde usando un protocolo diferente, no necesitan escaparse correctamente. Si la plantilla de declaración original no se deriva de una entrada externa, no se puede producir la inyección SQL.

Declaraciones preparadas en MySQLi

El siguiente ejemplo usa declaraciones preparadas y parámetros enlazados en MySQLi:

Ejemplo (MySQLi con declaraciones preparadas)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

Líneas de código para explicar del ejemplo anterior:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

En nuestro SQL, insertamos un signo de interrogación (?) donde queremos sustituir un valor entero, cadena, doble o blob.

Luego, echa un vistazo a la función bind_param():

$stmt->bind_param("sss", $firstname, $lastname, $email);

Esta función vincula los parámetros a la consulta SQL y le dice a la base de datos cuáles son los parámetros. El argumento "sss" enumera los tipos de datos que son los parámetros. El carácter s le dice a mysql que el parámetro es una cadena.

El argumento puede ser de cuatro tipos:

  • yo - entero
  • d - doble
  • s - cadena
  • b - BLOB

Debemos tener uno de estos para cada parámetro.

Al decirle a mysql qué tipo de datos esperar, minimizamos el riesgo de inyecciones de SQL.

Nota: si queremos insertar datos de fuentes externas (como la entrada del usuario), es muy importante que los datos estén desinfectados y validados.



Declaraciones preparadas en PDO

El siguiente ejemplo usa declaraciones preparadas y parámetros enlazados en PDO:

Ejemplo (PDO con declaraciones preparadas)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // prepare sql and bind parameters
  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  VALUES (:firstname, :lastname, :email)");
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  $stmt->bindParam(':email', $email);

  // insert a row
  $firstname = "John";
  $lastname = "Doe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "[email protected]";
  $stmt->execute();

  echo "New records created successfully";
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>