【问题标题】:Bind OCI sysdate() to PDO parameter?将 OCI sysdate() 绑定到 PDO 参数?
【发布时间】:2016-06-29 20:03:51
【问题描述】:

我想在我的 PDO 准备查询中绑定 sysdate 函数:

$db = new PDO('oci:dbname=database;charset=UTF8', 'user', 'pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $db->prepare('SELECT :func FROM DUAL');
$query->execute(array(':func' => 'SYSDATE()'));
var_dump($query->fetch());

结果返回这个:

array (size=2)
  ':FUNC' => string 'SYSDATE()' (length=9)
  0 => string 'SYSDATE()' (length=9)

我想获取我的 oracle 数据库的系统日期。有可能吗?

你能帮我做我的把戏吗?

【问题讨论】:

  • 不,这是不可能的。绑定参数是一种注入数据(例如数字或字符串文字)并确保它们不会变成代码的工具。你要求的是相反的。为什么需要这样做?
  • @ÁlvaroGonzález OCI 支持IN and OUT binds,但据我所知不支持 PDO。
  • 现在出现的反映,看到大量的反对票:有问题的代码是说明问题的简化测试用例,还是您真的只想运行普通的静态 SELECT SYSDATE FROM DUAL 查询?
  • @timclutton 我从未使用过用于 Oracle 的 PDO(仅 OCI8),但他似乎不想要 OUT 绑定(并且 IN 绑定显然对他有用,因为他得到了 SELECT 'SYSDATE()' FROM DUAL)。
  • 好点;我从表面上接受了这个问题。无论哪种方式(您的回答或我的回答),问题都应该得到解决。也许OP可以发表评论。

标签: php oracle pdo oracle-call-interface


【解决方案1】:

Oracle(通过 PHP 中的 OCI module确实同时支持 IN and OUT binds。它们用于运行PL/SQL 并返回结果。在你的情况下,运行一个普通的 SQL SELECT 语句,你不需要这样做。

注意SYSDATE 不是一个函数,所以你不能使用括号。

这是一个使用 PDO 的工作示例:

$db = new PDO('oci:dbname=database;charset=UTF8', 'user', 'pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $db->prepare('SELECT SYSDATE FROM DUAL');
$query->execute();
var_dump($query->fetch());

【讨论】:

  • 其实我有这段代码,但我想要一个调试工具功能。
【解决方案2】:

绑定参数是一种注入数据(例如数字或字符串文字)并确保它们不会变成代码的工具。但是,您要求的恰恰相反:您希望数据成为代码。所以恐怕你根本无法使用这种技术。

您必须使用旧的 PHP 字符串操作函数动态编写 SQL,例如:

$sql = sprintf('SELECT %s AS "result" FROM DUAL', 'SYSDATE');

不用说,出于明显的安全原因,您绝不应该允许免费输入。如果你想切换功能,你最好遵循白名单的方法,例如:

switch (filter_input(INPUT_POST, 'option')) {
    case 'time':
        $function = 'SYSDATE';
        break;
    // ... more case statements
    default:
        $function = null;
}
if (!is_null($function)) {
    $sql = sprintf('SELECT %s AS result FROM DUAL', $function);
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2018-02-26
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2012-01-27
    相关资源
    最近更新 更多