我在PHP应用程序中使用Oracle数据库。
用户尝试连接到PHP应用程序。他的密码已过期,但其用户个人资料的宽限期不为空,因此他仍然可以连接到该应用程序。
我想要做的是认识到该用户应该更改密码并向他显示消息。
我已尝试使用oci_error()
,但它没有返回任何内容,因为使用此用户连接数据库时没有失败。
我想赶上ORA-28001(和ORA-28002)
不幸的是,我无法对数据库本身的结构进行任何更改(添加额外的表或额外的字段)。
答案 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扩展设置。