2016-11-02 103 views
2

我使用PHP來查詢Oracle數據庫和一切都很正常,除非我嘗試使用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 

我想按名稱使用綁定來避免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);