我正在尝试编写一个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;
)
我已经阅读了一些帖子,但我仍然无法找到错误。我希望你能帮助我。
答案 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将表名作为参数转义。在任何情况下,它都不会导致将运行的查询。
如果您需要在预准备语句中更改列或表,请继续创建另一个语句。