Prepared statements. Как работает?

Vano

Новичок
Код:
$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' ); 
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)"); 
$STH->execute($data);
Каким макаром такой запрос спасает от SQL-injection? У меня догадка - чтобы не ввели в $data, уже не получится создать новую логическую операцию.
 

peon

Lok'tar ogar
Код:
$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' );
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");
$STH->execute($data);
Каким макаром такой запрос спасает от SQL-injection? У меня догадка - чтобы не ввели в $data, уже не получится создать новую логическую операцию.
1) параметр внутри prepare это шаблон, который не должен содержать данные из внешнего ввода (то есть данные представляющие значения в бд)
2) дальше данные корректно экранируются без твоей помощи

значить только ты сможешь саботировать инъекцию
 

Фанат

oncle terrible
Команда форума
Инъекция является следствием некорректно отформатированных данных.
Подставляя в запрос name, addr и city, драйвер корректно отформатирует их.
 

Vano

Новичок
А когда в Yii в метод where передается массив типа
Код:
$condition['status'] = $status;
$condition['status2'] = $status2;
->where($condition)
Где переменные приходят от пользователя. Это безопасно? Фреймворк не лепит тупо строку из массива. Я прав?
 
Сверху