虽然表存在,但php应用程序引发了ORA-00903

时间:2017-10-31 11:41:07

标签: php oracle plsql oci8

我正在尝试编写一个PHP Web应用程序,对于这个应用程序,我需要一个功能来获取表的ID,因为我不想使用无休止的长switch我想我会做以下功能:

function getId($conn, string $col, string $tbl, string $val): int{
  $qry = oci_parse($conn, "SELECT :col FROM :tbl WHERE :col = :val");
  oci_bind_by_name($qry, ':tbl', $tbl);
  oci_bind_by_name($qry, ':col', $col);
  oci_bind_by_name($qry, ':val', $val);
  @$success = oci_execute($qry);

  if($success){
    //fetch data
  }else {
    $err = oci_error($qry);
    print_r($err);
    }
  }
}

我首先认为这是因为它不会绑定我的变量,但我测试了它并返回true所以绑定似乎有效。如果我尝试使用该函数,我会收到以下错误消息:

Array
(
    [code] => 903
    [message] => ORA-00903: Invalid table name
    [offset] => 20
    [sqltext] => SELECT :col FROM HR.:tbl WHERE :col = :val;
)

我已经阅读了一些帖子,但我仍然无法找到错误。我希望你能帮助我。

1 个答案:

答案 0 :(得分:1)

据我所知,无法在预准备语句中绑定表名和列名。这并不是对预准备语句的限制,因为通常列和表结构在不同的表中会有所不同,因此无论如何都不能重用相同的语句。

所以我希望以下内容可行:

$qry = oci_parse($conn, "SELECT some_col FROM your_table WHERE some_col = :val");
oci_bind_by_name($qry, ':val', $val);
@$success = oci_execute($qry);

在内部我也不确定这里到底发生了什么,但有一种可能性是PHP将表名作为参数转义。在任何情况下,它都不会导致将运行的查询。

如果您需要在预准备语句中更改列或表,请继续创建另一个语句。