Zum Sinn: Das Beste und sicher jedem wichtigste ist, dass sql injection nicht mehr möglich ist, WENN man es so nutzt, wie es vorgesehen ist.
Bsp wie man es "versaut":
$stmt = $dbh->prepare("SELECT * FROM tablename WHERE name = ".$_GET['name']." LIMIT $_POST['user_input'], :rows");
Somit würde man die query mit user daten füllen.
Also immer :name ect nutzen. Dann ist es "egal", was man beim execute(array('nickname' => $_GET['user_input'])) reinschickt.
angenommen: $_GET['name'] = " ';cottton "
dann wird hier ein bissl was schief laufen:
$stmt = $dbh->prepare("SELECT * FROM players WHERE nickname = '".$_GET['name']."' LIMIT 0,1");
$stmt->execute();
query: SELECT * FROM players WHERE nickname = ' ';cottton ' LIMIT 0,1
richtig wäre:
$stmt = $dbh->prepare("SELECT * FROM players WHERE nickname = :nickname LIMIT 0,1");
$stmt->execute(
array(
'nickname' => $_GET['name']
)
);
query: ja, wie stellt man das dar?
Ich hab noch kein Bsp gesehen, wie die query dann aussieht.
Aber die query ist jedenfalls schon "fertig" - prepared.
Kann also "nicht mehr geändert werden". Die Daten werden als Parameter übergeben.
(Weiß nicht wie ich es sonst ausdrücken soll ;D )