2016-11-02 5 views
2

Я использую PHP для запроса Oracle DB и все отлично работают, если я не попытаться использовать функцию oci_bind_by_name заменить переменнуюфункция oci_bind_by_name() возвращает ошибка

$link = oci_connect("user","password","server/service"); 

$sql = "SELECT name FROM customers WHERE name LIKE '%:name%'"; 
$query= oci_parse($link, $sql); 

$name = "Bruno"; 
oci_bind_by_name($query, ":name", $name); 
$execute = oci_execute($query); 

Я также пытался избежать кавычек, как это, но возвращает ту же ошибку, я предполагаю, что это проблема с подстановочные знаки%

$sql = "SELECT name FROM customers WHERE name LIKE \"%:name%\" "; 

ошибка не является специфичным:

(!) Warning: oci_bind_by_name(): in D:\gdrive\www\sites\pulseiras\php\engine.php on line 30 

Я хотел бы использовать bind по имени, чтобы избежать инъекции sql, как я могу заставить его работать?

ответ

1

OCI вставляет связанную переменную в запросе и в конечном итоге с чем-то вроде этого:

SELECT name FROM customers WHERE name LIKE '%'Bruno'%' 

Очевидно пару ненужных цитат, которые были добавлены. Это происходит потому, что связанная переменная рассматривается как отдельный элемент.

Вы должны изменить переменную, прежде чем связать, так:

$sql = "SELECT name FROM customers WHERE name LIKE :name"; // chars removed. 
$query= oci_parse($link, $sql); 

$name = "%Bruno%"; // chars added. 
oci_bind_by_name($query, ":name", $name); 

Как обычно, PHP manual имеет много полезных примеров.

+0

это решение работает хорошо :) я писал в то же время, как вы, так что я думаю, теперь есть два решения этой проблемы. Спасибо! – brunobliss

0

Удивительно, как мозг только начинает работать после публикации вопроса о stackoverflow. Оказывается, решение выделить символы и конкатенации с переменной:

$sql = "SELECT name FROM customers WHERE name LIKE '%' || :name || '%' "; 
$name = "Bruno"; 
oci_bind_by_name($query, ":name", $name); 
$execute = oci_execute($query); 
Смежные вопросы