Prepare er den eneste vej frem, og det er ikke så svært endda =)
Prøv at kikke på denne kode fra [url=http://dk.php.net/manual/en/pdo.prepare.php]php.net[/div]:
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();
?>
Forestil dig, at linjen:
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
- opretter et objekt
$sth nede på databasen. Dette objekt får automatisk en metode
execute, som kalder dit SELECT-statement, hvergang den kaldes med nye argumenter.
Ved alm. MySQL dannes en funktion udfra en streng, der er sammensat af stumper - dels skrevet af udvikleren, og dels indsat af brugeren (via $_POST eller $_GET) - hvergang databasen kaldes.
Ved PDO's eller MySQLI's prepare dannes en funktion på baggrund af en streng skrevet af udvikleren. Der hvor der skal indgå dynamiske parametre, udskiftes disse med en placeholder: '
?'.
Efterfølgende kan denne funktion kaldes mange gange med forskellige argumenter - f.eks. stammende fra brugerinput - med
execute. Fuldstændig som du kalder enhver PHP-funktion.
I eksemplet kaldes funktionen to gange - først med 150 og 'red' som argumenter. Anden gang med 175 og 'yellow' som argumenter.
Det gør, at brugerinput ikke bliver 'fedtet' ind i selve funktions body'en (dens 'indre'), men kun bliver brugt som argumenter i et funktionskald. Derfor er det ikke nødvendigt at escape brugerinputtet.
Det gør samtidig gentagne kald med samme SQL (og forskellige argumenter) langt hurtigere.
Håber, det hjalp på forståelsen =)