2009-12-12 5 views
5

Quelqu'un pourrait-il me donner des exemples d'utilisation de requêtes paramétrées avec MySQL/PHP?Exemples de requêtes paramétrées

+2

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

Répondre

8

une requête paramétrée est essentiellement une requête qui fait abstraction de distance toutes les entrées. Ceci a plusieurs bons effets secondaires, comme rendre toutes les entrées inoffensives (c'est-à-dire qu'aucune injections nocives ne sont possibles) et le rendre plus rapide lorsqu'il est utilisé de façon répétée, puisqu'il est pré-analysé et compilé, ainsi le moteur sait appliquer l'entrée donnée. Un exemple dans une base MySQL pur est:

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

La déclaration est maintenant compilé et mis en mémoire cache, et peut être exécuté à plusieurs reprises sans avoir à recompiler et interpréter:

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

Lorsqu'il est utilisé en PHP, il est généralement comme ce (raccourci):

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

Je ne comprends pas bien comment cela arrête l'injection SQL. Je n'en doute pas, mais pourriez-vous l'expliquer davantage? –

+2

Parce que la requête est pré-compilée avant que l'un des paramètres ne soit ajouté. Et même si un paramètre était '"; DELETE FROM stuff; "ou quelque chose comme ça, il serait juste inséré là où l'instruction compilée dit, en tant que chaîne complète, elle ne passe pas par l'analyseur, parce que l'instruction principale Vous pouvez le comparer à 'eval()' comme: 'eval (" new Class ($ data); ")'. Considérer que les données sont '); delete_all_my_files ('. Les instructions précompilées signifient que vous évitez "eval" problème. –

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

SET @test_parm = "FIN"; 

EXECUTE stmt_name USING @test_parm; 

Source: MySQL Dev: Prepared Statements