将OCI sysdate()绑定到PDO参数?

时间:2016-03-14 16:47:49

标签: php oracle pdo oci

我想在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数据库的系统日期。有可能吗?

你能帮我制作一招吗?

2 个答案:

答案 0 :(得分:-1)

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

您必须使用良好的旧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);
    // ...
}

答案 1 :(得分:-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());