php 应用程序引发 ORA-00903 尽管存在 table

php application raises ORA-00903 although the table is present

我正在尝试编写一个 PHP Web 应用程序,对于这个应用程序,我确实需要一个函数来获取 table 的 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);
    }
  }
}

我最初以为是因为它不会绑定我的变量,但我测试了它 returns true 所以绑定似乎有效。如果我尝试使用该功能,我会收到以下错误消息:

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

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

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

所以我希望以下方法有效:

$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 正在转义你的 table 名称作为参数。无论如何,它不会导致 运行.

的查询

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