mysql_real_escape_string()
a sql injections
již byly zmíněny.
Ale právě teď musí váš skript (pracně) smíchat příkaz sql s daty/parametry a v dalším kroku musí server MySQL oddělit data od příkazu.
Pomocí (na straně serveru) připravená prohlášení
obě „části“ vašeho dotazu se odesílají samostatně a analyzátor sql (vašeho serveru MySQL) se nikdy nemůže „zmást“ ohledně toho, kde končí příkaz a začínají data.
php-mysql modul nezná připravené příkazy, ale php-mysqli a CHOP udělat.
$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $pdo->prepare('
UPDATE
Videos
SET
Title=:title ,
Preacher=:preacher ,
Date=:date ,
Service=:service ,
File=:file ,
Description=:description
WHERE
id=:id
');
$stmt->bindParam(':title', $_POST['title']);
$stmt->bindParam(':preacher', $_POST['preacher']);
$stmt->bindParam(':date', $_POST['date']);
$stmt->bindParam(':service', $_POST['service']);
$stmt->bindParam(':file', $_POST['file']);
$stmt->bindParam(':description', $_POST['description']);
$stmt->bindParam(':id', $_GET['id']); // really _GET?
$stmt->execute();
Pokud použijete $stmt pouze pro jednu operaci, může se to zdát hodně nafouklé. Ale počítejte s tím, že jinak musíte pro každý parametr volat mysql_real_escape_string().