2009-08-07 46 views
9

Esta es una pregunta similar a esta "When not to use Prepared statements?", pero con la parte "cómo hacer" y para PostgreSQL.Para usar declaraciones preparadas por PHP para Postgres

Sé que necesito declaraciones preparadas porque hago más de una llamada a mi base de datos durante una secuencia de comandos.

Me gustaría obtener ejemplos concretos sobre la mirada following sentence

al encasillamiento, validar y desinfección de las variables y el uso de DOP con declaraciones preparadas.

Sé lo que quiere decir con validar y desinfectar variables. Sin embargo, no estoy completamente seguro acerca de las declaraciones preparadas. ¿Cómo preparamos las declaraciones? Por filtros, ¿eso es por desinfección? ¿O por alguna capa PDO? ¿Cuál es la definición de la capa?

¿Qué significan las declaraciones preparadas en la declaración? Por favor, use ejemplos concretos.

+0

¡Gracias por tus respuestas! –

Respuesta

5

¿Qué significan las declaraciones preparadas en la declaración?

Desde el documentation:

Esta característica permite a los comandos que se van a utilizar en repetidas ocasiones que se analiza y se planificaron una sola vez, en lugar de cada vez que se ejecutan.

Ver pg_prepare

Ejemplo de la página vinculada arriba:

<?php 
// Connect to a database named "mary" 
$dbconn = pg_connect("dbname=mary"); 

// Prepare a query for execution 
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 

// Execute the prepared query. Note that it is not necessary to escape 
// the string "Joe's Widgets" in any way 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 

// Execute the same prepared query, this time with a different parameter 
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes")); 
?> 

El MySQL documentation for Prepared Statements responde muy bien a las siguientes preguntas:

  • ¿Por qué usar comandos preparados?
  • ¿Cuándo debe usar las declaraciones preparadas ?
+0

¿Sus ejemplos tienen la misma funcionalidad que Robot? Ellos son mucho más claros para mí que los de Robot. Parece usar muchas matrices que hacen que sea difícil leer para mí. –

+1

@Masi: los ejemplos que proporcioné son de la página pg_prepare doc. Son más fáciles de seguir, pero diría que los ejemplos de @Glass Robot son más reales (por ejemplo, marcadores nombrados). Sugiero que te ensucies las manos lo antes posible. No hay 'un solo ejemplo para gobernarlos a todos'. – karim79

+1

Su respuesta no usa PDO. Esto me sugiere que puede usar declaraciones preparadas sin PDO. PDO parece ofrecer independencia de base de datos solamente. –

0

¿Cómo nos preparamos declaraciones:

define una consulta una vez, y se llama tan a menudo como desee con diferentes valores.

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 
$result = pg_execute($dbconn, "my_query", array("row two")); 
$result = pg_execute($dbconn, "my_query", array("row three")); 

ver (por ejemplo, en un bucle.): http://us2.php.net/manual/en/function.pg-execute.php

6

Significa que lo ayudará a evitar ataques de inyección de SQL al eliminar la necesidad de citar manualmente los parámetros.

En lugar de colocar una variable en el sql, utiliza un marcador con nombre o signo de interrogación cuyos valores reales se sustituirán cuando se ejecute la instrucción.

Definición de PDO del manual de PHP:
'Los PHP Data Objects extensión (DOP) define una interfaz ligera y consistente para acceder a bases de datos en PHP.'

Consulte el manual php en PDO y PDO::prepare.

Un ejemplo de una declaración preparada con marcadores con nombre:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = :username 
AND password = :pass"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password'])); 
$result = $sth->fetchAll(); 

Un ejemplo de una declaración preparada con marcadores signo de interrogación:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = ? 
AND password = ?"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array($_POST['username'], $_POST['password'])); 
$result = $sth->fetchAll(); 
+0

Sus comandos parecen seleccionar el nombre de usuario y contraseña de las columnas de los usuarios de la tabla cuando, por ejemplo, nombre de usuario = a y contraseña = a. Esto me sugiere que el código no es práctico en la vida real porque no tiene sentido seleccionar los dos nombres de columna cuando ya los conoces. Sin embargo, si selecciona la tercera columna según los dos, entonces su camino parece funcionar. Parece que las entradas del usuario se procesan de tal manera que una falla/accidente en la ejecución de las consultas con la entrada del usuario no cambia los datos originales, por lo que no hay inyección de SQL: por ejemplo, detener si falla en la preparación ... –

0

Responder a la respuesta de Karim79

Este

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1'); 

parece ser el mismo que este

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?'); 

Conclusión: el uso de pg_prepare y pg_execute hace PHP mucho más eficiente, ya que no es necesario tener en cuenta la desinfección. También lo ayuda en el uso de PDO.

Cuestiones relacionadas