我使用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注入,我该如何使它工作?
答案 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);