Muchas bases de datos más maduras respaldan el concepto de declaraciones preparadas.
¿Qué son las declaraciones preparadas? Piense en ello como una plantilla compilada del SQL que desea ejecutar, que se puede personalizar mediante parámetros variables. Las declaraciones preparadas pueden aportar dos beneficios principales:
Una consulta solo necesita analizarse (o preprocesarse) una vez, pero puede ejecutarse varias veces con los mismos parámetros o con parámetros diferentes. Cuando una consulta está lista, la base de datos analiza, compila y optimiza el plan para ejecutar la consulta. Este proceso lleva más tiempo para consultas complejas y puede ralentizar significativamente su aplicación si es necesario repetir la misma consulta varias veces con diferentes parámetros. Al utilizar declaraciones preparadas, puede evitar ciclos repetidos de análisis, compilación y optimización. En pocas palabras, las declaraciones preparadas utilizan menos recursos y, por lo tanto, se ejecutan más rápido.
Los parámetros proporcionados a las declaraciones preparadas no necesitan estar entre comillas; el controlador maneja esto automáticamente. Si su aplicación utiliza sólo declaraciones preparadas, puede estar seguro de que no se producirá la inyección SQL. (Sin embargo, si otras partes de la consulta se construyen a partir de entradas sin escape, todavía existe el riesgo de inyección SQL).
Las declaraciones preparadas son tan útiles que su única característica es que PDO simulará el procesamiento cuando el controlador no lo admita. Esto garantiza que las aplicaciones puedan utilizar el mismo patrón de acceso a datos independientemente de si la base de datos tiene dichas capacidades.
El siguiente ejemplo ejecuta una consulta de inserción reemplazando los marcadores de posición con nombre correspondientes con nombre y valor.
<?php$stmt = $dbh->prepare("INSERTAR EN EL REGISTRO (nombre, valor) VALORES (:nombre, :valor)");$stmt->bindParam(':nombre', $nombre);$stmt- >bindParam(':value', $value);//Inserte una fila $name = 'one';$value = 1;$stmt->execute();// Inserte otra fila con valores diferentes $name = 'two';$value = 2;$stmt->execute();?>
El siguiente ejemplo ejecuta una consulta de inserción reemplazando el marcador de posición ? con nombre y valor.
<?php$stmt = $dbh->prepare("INSERTAR EN EL REGISTRO (nombre, valor) VALORES (?, ?)");$stmt->bindParam(1, $nombre);$stmt->bindParam(2, $valor);//Insertar una fila $nombre = 'uno';$valor = 1;$stmt->execute();// Inserte otra fila con valores diferentes $name = 'two';$value = 2;$stmt->execute();?>
El siguiente ejemplo obtiene datos basados en el valor clave en el formulario proporcionado. La entrada del usuario se cita automáticamente, por lo que no hay peligro de ataques de inyección SQL.
<?php$stmt = $dbh->prepare("SELECCIONAR * DEL REGISTRO donde nombre =?");if ($stmt->ejecutar(array($_GET['nombre']))) { mientras ($fila = $stmt->fetch()) { print_r($fila }}?>
Si el controlador de la base de datos lo admite, la aplicación también puede vincular parámetros de salida y entrada. Los parámetros de salida se utilizan a menudo para obtener valores de procedimientos almacenados. Los parámetros de salida son un poco más complicados de usar que los parámetros de entrada porque al vincular un parámetro de salida, debe conocer la longitud del parámetro dado. Si el valor vinculado a un parámetro es mayor que la longitud recomendada, se genera un error.
<?php$stmt = $dbh->prepare("CALL sp_returns_string(?)");$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // Llama al procedimiento almacenado $stmt->); ejecutar ();imprimir "procedimiento devuelto $valor_retornon";?>
También puede especificar parámetros que tengan valores de entrada y salida, con una sintaxis similar a la de los parámetros de salida. En el siguiente ejemplo, la cadena "hola" se pasa al procedimiento almacenado y, cuando el procedimiento almacenado regresa, hola se reemplaza con el valor devuelto por el procedimiento almacenado.
<?php$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");$value = 'hola';$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000 ); // Llama al procedimiento almacenado $stmt->execute();print "procedimiento devuelto $valorn";?>
<?php$stmt = $dbh->prepare("SELECT * FROM REGISTRY donde nombre LIKE '%?%'");$stmt->execute(array($_GET['name']));// Símbolo de marcador de posición debe usarse en todo el valor $stmt = $dbh->prepare("SELECT * FROM REGISTRY donde nombre LIKE ?");$stmt->execute(array("%$_GET[nombre]%"));?>