【发布时间】:2019-05-02 06:15:30
【问题描述】:
尝试根据错误日志中的数据发布到 OCI 数据库。
尝试执行时出现 ORA-24374 错误。
“警告:oci_fetch_array(): ORA-24374: define not done before fetch or execute and fetch in C:\xampp\htdocs\wam\header.php on line 46”;
具有讽刺意味的是,它确实将数据发布到数据库。但是我仍然得到错误。并且需要刷新 .php 页面以获取其余代码执行的结果。
有问题的代码:
来自 header.php
public function dbQuerySafe($statement, $format = '', $args = array(), $outvar = '')
{
$config = include('includes/config.php');
$res = '';
$connectionString = $config['database']['tnsstring'];
$username = $config['database']['user'];
$password = $config['database']['password'];
$connobj = oci_connect($username, $password, $connectionString);
$error = false;
$result = false;
if (!$connobj) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
exit();
}
//print_r($statement);
$stid = oci_parse($connobj, $statement);
if ($stid) {
if (!empty($format) && !empty($args)) {
foreach ($args as $key => $val) {
oci_bind_by_name($stid, $key, $args[$key]);
}
}
if ($format == 'insert' && !empty($outvar)) {
oci_bind_by_name($stid, ':' . $outvar, $res, 32);
}
$rsltflag = oci_execute($stid);
if ($rsltflag && $format != 'insert') {
$result = array();
while (($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
foreach ($row as $key => $val) {
$c[$key] = $val;
}
$result[] = $c;
}
} else if ($rsltflag && $format == 'insert') {
$result = $res;
} else {
$result = false;
$error = oci_error($stid);
$log = new Logger('header.php- line 57');
$log->pushHandler(new StreamHandler(dirname(__FILE__) . './log/db_queries.log', Logger::ERROR));
// $log->error($error['message'] . '. SQL query which caused the error: ' . $error['sqltext']);
$log->error("Error connecting to database: ", array('username' => 'test username', 'module' => 'header.php', 'page_name' => 'header.php', 'error_at' => 'line 57', 'severity' => 'ERROR', 'error_msg' => $error['message']));
trigger_error(htmlentities($error['message'], ENT_QUOTES), E_USER_ERROR);
}
}
oci_free_statement($stid);
oci_close($connobj);
return array($result, $error);
}
来自error_log.php:
if (isset($_POST['push_to_db'])) {
$handle = @fopen($errorFile, "r");
$values = '';
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$errorUsername = $error_api->str_slice($buffer, strpos($buffer, '"username"') + 12, strpos($buffer, '","module"'));
$errorModule = $error_api->str_slice($buffer, strpos($buffer, '"module"') + 10, strpos($buffer, '","page_name"'));
$errorPageName = $error_api->str_slice($buffer, strpos($buffer, '"page_name"') + 13, strpos($buffer, '","error_at"'));
$errorErrorAt = $error_api->str_slice($buffer, strpos($buffer, '"error_at"') + 12, strpos($buffer, '","severity"'));
$errorSeverity = $error_api->str_slice($buffer, strpos($buffer, '"severity"') + 12, strpos($buffer, '","error_msg"'));
$errorErrorMsg = $error_api->str_slice($buffer, strpos($buffer, '"error_msg"') + 13, strpos($buffer, '"}'));
if ($errorUsername) {
echo ("<script>console.log('" . $errorUsername . "');</script>");
echo ("<script>console.log('" . $errorModule . "');</script>");
echo ("<script>console.log('" . $errorPageName . "');</script>");
echo ("<script>console.log('" . $errorErrorAt . "');</script>");
echo ("<script>console.log('" . $errorSeverity . "');</script>");
echo ("<script>console.log('" . $errorErrorMsg . "');</script>");
$error_api->pushErrorsToDB($errorUsername, $errorModule, $errorPageName, $errorErrorAt, $errorSeverity, $errorErrorMsg);
}
//for testing purposes
// else {
// echo ("<script>console.log('" . $errorUsername . "');</script>");
// }
}
// clear log file
file_put_contents('../log/db_queries.log', "");
}
来自 api.php:
public function pushErrorsToDB($username, $module, $pageName, $errorAt, $severity, $errorMsg)
{
//function to push Monolog files to WAM_ERROR_LOG table
list($q, $error) = $this->dbQuerySafe(
"
INSERT INTO WAM_ERROR_LOG
(USERNAME, MODULE, PAGE_NAME, ERROR_AT, SEVERITY, ERROR_MSG)
VALUES
('$username', '$module', '$pageName', '$errorAt', '$severity', '$errorMsg')"
);
// if (!$error) {
// return array($q, false);
// } else {
// return array(false, $error);
// }
}
这个 OCI 实例在许多不同的数据库操作中都能正常工作。
我从另一个开发人员那里接手了这个项目,我是 php/OCI 的新手。因此,我不愿将任何内容更改为 header.php 中的 dbQuerySafe 函数,因为它已在整个项目中成功使用。
欢迎任何建议。
【问题讨论】: