To jest tzw. "bindowanie", zabezpieczenie przed wstrzykiwaniem SQL oraz innymi niebezpieczeństwami. Zastosowanie tej techniki daje większe bezpieczeństwo aplikacji i nie tylko aplikacji.
Dam przykład z rozszerzenia mysqli, jest to również na PDO, tylko jest inna nazwa funkcji.
http://php.net/manual/en/mysqli-stmt.bind-param.php
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
W tym przykładzie masz 4 znaki zapytania. Oznacza to, że później trzeba podać 4 wartości.
Druga linia oznacza kolejno (te sssd): string, string, string, double.
Te zmienne dalej to odpowiedniki tego, co ustaliliśmy. Czyli 1. zmienna to typ string, 2. zmienna to też typ string, 3. zmienna też jest typu string, a ostatnia typu double/float.