PHP DOP declaraciones preparadas y procedimientos almacenados
Muchas bases de datos más maduros apoyan el concepto de declaraciones preparadas.
Lo que es declaraciones preparadas? Piense en ello como una plantilla compilada desea ejecutar SQL, que puede personalizarse usando los parámetros variables. declaraciones preparadas ofrecen dos ventajas principales:
- Consulta sólo resuelve (o pretratamiento) una vez, pero se pueden ejecutar varias veces con los mismos o diferentes parámetros. Cuando la consulta está listo, la base de datos va a analizar, compilar y ejecutar el plan de optimización de consultas. Para consultas complejas, este proceso lleva mucho tiempo, si tiene que ser repetido muchas veces con diferentes parámetros de la misma consulta, entonces el proceso reducirá en gran medida la velocidad de la aplicación. Mediante el uso de la declaración preparada a evitar la repetición de analizar / compilar ciclo / Optimizar. En resumen, preparan estados utilizan menos recursos y por lo tanto se ejecuten más rápidamente.
- Proporcionar parámetros a los comandos preparados no tienen que usar comillas, el conductor será manejado de forma automática. Si la aplicación sólo utiliza comandos preparados, podemos asegurar que ninguna de inyección SQL. (Sin embargo, si otras partes de la consulta no se escaparon de la entrada de construir, entonces todavía hay el riesgo de inyección de SQL).
declaraciones preparadas tan útiles que sólo característica es el procesamiento analógico cuando el conductor no es compatible con la DOP. Esto asegura que, independientemente de si la base de datos tiene una función, puede asegurarse de que las aplicaciones puedan utilizar los mismos patrones de acceso a datos.
PreparedStatements inserción repetida
En el siguiente ejemplo, sustituyendo el nombre de marcador de posición apropiada con el nombre y valor para ejecutar una consulta de inserción
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
PreparedStatements inserción repetida
El siguiente ejemplo mediante la sustitución de nombre y valor? Marcadores de posición para ejecutar una consulta de inserción.
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
Obtener datos utilizando sentencias preparadas
El siguiente ejemplo en la forma de acceso basado en clave a los datos ya proporcionado. La entrada del usuario se incluye de forma automática entre comillas, lo que no hay riesgo de ataques de inyección SQL.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Si el soporte de controlador de base de datos, la aplicación también se puede unir parámetros de entrada y salida de parámetros de salida se utilizan normalmente para obtener los valores del procedimiento almacenado. Los parámetros de salida de usar que los parámetros de entrada a ser un poco más complicado, debido al enlazar un parámetro de salida, es necesario conocer los parámetros de una determinada longitud. Si el valor del parámetro es mayor que las recomendaciones vinculantes de la longitud, se generará un error.
Llamar a un procedimiento almacenado con un parámetro de salida
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
También puede especificar ambos valores de entrada y de salida de los parámetros, la sintaxis es similar a los parámetros de salida. En el siguiente ejemplo, la cadena "hola" se pasa al procedimiento almacenado cuando se restablezca el procedimiento almacenado, hola se reemplaza con el valor devuelto por el procedimiento almacenado.
Con la entrada / parámetros de salida para llamar a un procedimiento almacenado
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
Uso no válido de marcador de posición
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>