2009-12-12 10 views
5

¿Alguien me puede dar ejemplos de cómo usar consultas parametrizadas con MySQL/PHP, por favor?Ejemplos de consultas con parámetros

+2

http://www.google.com.au/search?hl=en&source=hp&q=+MySQL++parameterized+queries&meta=&aq=f&oq= –

Respuesta

8

Una consulta parametrizada es esencialmente una consulta que abstrae toda la entrada. Esto tiene varios buenos efectos colaterales, como hacer que todas las entradas sean inofensivas (es decir, que no sean posibles inyecciones dañinas) y hacerlas más rápidas cuando se usan repetidamente, ya que se analizan y compilan previamente, de modo que el motor sabe cómo aplicar la información proporcionada. Un ejemplo en MySQL puro es:

PREPARE qry FROM "INSERT INTO tbl VALUES (?)"; 

La declaración está ahora compila y almacena en caché, y se puede ejecutar repetidamente sin necesidad de recompilar e interpretarla:

SET @var = "some input"; 
EXECUTE qry USING @var; 
SET @var = "some other input"; 
EXECUTE qry USING @var; 

Cuando se utiliza en PHP, por lo general como esto (acortada):

$stmt = prepare('INSERT INTO tbl VALUES(?)'); 
execute($stmt, array("some input")); 
execute($stmt, array("some other input")); 
execute($stmt, array("some more input")); 
+0

no entiendo totalmente cómo esto detiene la inyección SQL. No estoy dudando de que lo haga, pero ¿podría explicarlo más? –

+2

Porque la consulta se precompila antes de que cualquiera de los parámetros se coloque en ella. Y así, incluso si un parámetro fuera '"; BORRAR FROM cosas; 'o algo así, simplemente se insertaría en cualquier lugar donde diga la instrucción compilada, como una cadena completa. No pasa por el analizador, porque el enunciado principal ya se ha analizado. Puede compararlo con 'eval()' como: 'eval (" new Class ($ data); ")' Considere que los datos son '); delete_all_my_files (' .Las declaraciones precompiladas básicamente significa que usted evita el problema "eval" –

4
PREPARE stmt_name FROM "SELECT name FROM Country WHERE code = ?"; 

SET @test_parm = "FIN"; 

EXECUTE stmt_name USING @test_parm; 

Fuente: MySQL Dev: Prepared Statements

Cuestiones relacionadas