【问题标题】:oci_bind_by_name() returns erroroci_bind_by_name() 返回错误
【发布时间】:2023-04-09 02:14:01
【问题描述】:

我正在使用 PHP 查询 oracle DB,除非我尝试使用 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 注入,我怎样才能使它工作?

【问题讨论】:

    标签: php oracle


    【解决方案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 有很多有用的例子。

    【讨论】:

    • 这个解决方案也有效:) 我和你同时发布,所以我想现在有两个解决方案。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2019-09-23
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多