Как работает?

$_POST['name'] = 'Алексей';
$_POST['surname'] = 'Арх';
$query = $db->prepare("SELECT * FROM users WHERE `name` = :name OR `surname` = :surname");
$query->execute(array('name'=>$_POST['name'],'surname'=>$_POST['surname']));
while ($row = $query->fetch()) {
}

На сколько я могу предполагать, во первых execute обработает входные данные, и уберёт возможность sql инъекций, без построение всяких велосипедов. Во вторых prepere предварительно отправляет шаблон запроса на сервер, как бы проверка на соответствие, и только потом туда подставляются значения из execute как строку (обработанную).

Так же есть вариант использовать $db->quote(); которые обрамит кавычками, экранирует что нужно, собственно предотвратить инъекцию.

Касаемо скорости.
Обычный не обработанный запрос.
$query = $db->query("SELECT * FROM users WHERE `name` = '".$_POST['name']."' OR `surname` = '".$_POST['surname']."'");
while ($row = $query->fetch()) {
}

Средняя скорость 0.0277
Опасно так делать =)

Чуть медленней через $db->quote()
$query = $db->query("SELECT * FROM users WHERE `name` = ".$db->quote($_POST['name'])." OR `surname` = ".$db->quote($_POST['surname'])."");
while ($row = $query->fetch()) {
}

Средняя скорость 0.0285

Еще медленней execute
$query = $db->prepare("SELECT * FROM users WHERE `name` = :name OR `surname` = :surname");
$query->execute(array('name'=>$_POST['name'],'surname'=>$_POST['surname']));
while ($row = $query->fetch()) {
}

Средняя скорость 0.0300

В теории ни одна инъекцию не пройдёт, тесты лично не проводил.
Но я считаю всё равно необходимо обрабатывать всё что идёт в запрос по так называемому "белому списку"

http://phpforum.ru/txt/index.php/t66952.html