如何捕获PHP oracle宽限期消息?

时间:2011-04-26 11:38:39

标签: php oracle ora-28002

我在PHP应用程序中使用Oracle数据库。

用户尝试连接到PHP应用程序。他的密码已过期,但其用户个人资料的宽限期不为空,因此他仍然可以连接到该应用程序。

我想要做的是认识到该用户应该更改密码并向他显示消息。

我已尝试使用oci_error(),但它没有返回任何内容,因为使用此用户连接数据库时没有失败。

我想赶上ORA-28001(和ORA-28002)

不幸的是,我无法对数据库本身的结构进行任何更改(添加额外的表或额外的字段)。

3 个答案:

答案 0 :(得分:2)

扩展Narf的答案,这适用于Oracle 11.2

<?php

function my_error_handler($errno, $errstr, $errfile, $errline) {
    if (preg_match('/ORA-28002: [ a-zA-Z]*([0-9])+/', $errstr, $matches)) {
        echo "Your password will expire within ${matches[1]} days\n";
    }
}

set_error_handler("my_error_handler", E_WARNING);

$c = @oci_connect("hr", "welcome", "localhost/XE");
if (!$c) {
    $m = oci_error();
    echo "Connection failed: " . $m['message'] . "\n";
} else {
    echo "Connected OK\n";
    // Prove the connection is valid
    $s = oci_parse($c, "select 'Query is OK' as c from dual");
    oci_execute($s);
    $r = oci_fetch_array($s, OCI_ASSOC);
    echo $r['C'] . "\n";
}

restore_error_handler();

?>

宽限期内的密码输出为:

Your password will expire within 1 days
Connected OK
Query is OK

答案 1 :(得分:1)

使用解决方案,查看OCILogon problem - Oracle password expiry一个非常类似的问题。应该在当前的PHP版本中工作。也与OCILogon during Grace Period - ORA-28002on SO

非常相似

答案 2 :(得分:1)

尝试在执行oci_connect()时启用警告,然后使用自定义错误处理程序捕获它们(确保在连接时不忽略@的错误)。这可能需要您调整php.ini中的oci扩展设置。