oci_bind_by_name()返回错误

时间:2016-11-02 11:48:37

标签: php oracle

我使用PHP查询oracle数据库,除非我尝试使用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注入,我该如何使它工作?

2 个答案:

答案 0 :(得分: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有很多有用的例子。

答案 1 :(得分:0)

令人惊讶的是,在stackoverflow上发布问题后,大脑似乎才开始工作。事实证明,解决方案是隔离通配符并与变量连接:

$sql = "SELECT name FROM customers WHERE name LIKE '%' || :name || '%' ";
$name = "Bruno";
oci_bind_by_name($query, ":name", $name);
$execute = oci_execute($query);