3

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

用户尝试连接到 PHP 应用程序。他的密码已过期,但他的用户配置文件的宽限期不为空,因此他仍然可以连接到应用程序。

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

我已经尝试过oci_error(),但它没有返回任何内容,因为与该用户连接到数据库没有失败。

我想抓住 ORA-28001(和 ORA-28002)

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

4

3 回答 3

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
于 2011-04-27T23:22:09.893 回答
1

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

于 2011-04-26T12:35:38.900 回答
1

OCILogon 问题 - Oracle 密码过期一个非常相似的问题,有解决办法。应该在当前的 php 版本中工作。在宽限期内也非常类似于OCILogon - ORA-28002on SO

于 2011-04-26T12:27:25.503 回答