From bda7f797b454371769dc5b496837859a606f4b5f Mon Sep 17 00:00:00 2001 From: Carsten Rose <carsten.rose@math.uzh.ch> Date: Wed, 19 Oct 2016 17:28:32 +0200 Subject: [PATCH] Database.sql: fixed problem that query results are not logged. --- extension/qfq/qfq/Database.php | 104 +++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/extension/qfq/qfq/Database.php b/extension/qfq/qfq/Database.php index 336e65c20..31a16a2fb 100644 --- a/extension/qfq/qfq/Database.php +++ b/extension/qfq/qfq/Database.php @@ -234,13 +234,16 @@ class Database { * @throws \qfq\UserFormException */ private function prepareExecute($sql, array $parameterArray = array(), &$queryType, array &$stat) { + + $sqlLogMode = $this->isSqlModify($sql) ? SQL_LOG_MODE_MODIFY : SQL_LOG_MODE_ALL;; $result = 0; $stat = array(); + $this->store->setVar(SYSTEM_SQL_FINAL, $sql, STORE_SYSTEM); $this->store->setVar(SYSTEM_SQL_PARAM_ARRAY, $parameterArray, STORE_SYSTEM); // Logfile - $this->dbLog($sql, $parameterArray); + $this->dbLog($sqlLogMode, $sql, $parameterArray); if (false === ($this->mysqli_stmt = $this->mysqli->prepare($sql))) { throw new DbException('[ mysqli: ' . $this->mysqli->errno . ' ] ' . $this->mysqli->error, ERROR_DB_PREPARE); @@ -305,11 +308,30 @@ class Database { $this->store->setVar(SYSTEM_SQL_COUNT, $count, STORE_SYSTEM); // Logfile - $this->dbLog($msg); + $this->dbLog($sqlLogMode, $msg); return $count; } + /** + * Check if the given SQL Statement might modify data. + * + * @param $sql + * @return bool true is the statement might modify data, else: false + */ + private function isSqlModify($sql) { + $command = explode(' ', $sql, 2); + switch (strtoupper($command[0])) { + case 'INSERT': + case 'UPDATE': + case 'DELETE': + case 'REPLACE': + case 'TRUNCATE': + return true; + } + return false; + } + /** * Decide if the SQL statement has to be logged. If yes, create a timestamp and do the log. * @@ -318,19 +340,20 @@ class Database { * @return string * @throws \qfq\UserFormException */ - private function dbLog($sql, $parameterArray = array()) { + private function dbLog($mode = SQL_LOG_MODE_ALL, $sql = '', $parameterArray = array()) { + + $sqlLogMode = $this->store->getVar(SYSTEM_SQL_LOG_MODE, STORE_SYSTEM); - $mode = $this->store->getVar(SYSTEM_SQL_LOG_MODE, STORE_SYSTEM); switch ($mode) { case SQL_LOG_MODE_ALL: + if ($sqlLogMode != SQL_LOG_MODE_ALL) { + return; + } break; case SQL_LOG_MODE_MODIFY: - if ($this->isSqlModify($sql)) { - break; - } - // nothing to log. - return; + break; + default: throw new UserFormException("Unknown SQL_LOG_MODE: $mode", ERROR_UNKNOWN_SQL_LOG_MODE); } @@ -338,57 +361,50 @@ class Database { // Client IP Address $remoteAddress = $this->store->getVar(CLIENT_REMOTE_ADDRESS, STORE_CLIENT); - $msg = '[' . date('Y.m.d H:i:s O') . '][' . $remoteAddress . ']['; - + $msg = '[' . date('Y.m.d H:i:s O') . '][' . $remoteAddress . ']'; // // FE User // $feUser = $this->sqlLog = $this->store->getVar(TYPO3_FE_USER, STORE_TYPO3); // $pageId = $this->sqlLog = $this->store->getVar(TYPO3_PAGE_ID, STORE_TYPO3); // $ttcontentId = $this->sqlLog = $this->store->getVar(TYPO3_TT_CONTENT_UID, STORE_TYPO3); - if (count($parameterArray) === 0) { - $msg .= $sql; - } else { - - $sqlArray = explode('?', $sql); - $ii = 0; - foreach ($parameterArray as $value) { - if (isset($sqlArray[$ii])) { - if (is_array($value)) { - $value = OnArray::toString($value); - } - - $msg .= $sqlArray[$ii++] . "'" . $value . "'"; - } else { - $msg = '?'; - } - } - if (isset($sqlArray[$ii])) - $msg .= $sqlArray[$ii]; + if (count($parameterArray) > 0) { + $sql = $this->preparedStatementInsertParameter($sql, $parameterArray); } - $msg .= ']'; + if ($sql !== '') { + $msg .= '[' . $sql . ']'; + } Logger::logMessage($msg, $this->sqlLog); } /** - * Check if the given SQL Statement might modify data. - * * @param $sql - * @return bool true is the statement might modify data, else: false + * @param $parameterArray + * @return string */ - private function isSqlModify($sql) { - $command = explode(' ', $sql, 2); - switch (strtoupper($command[0])) { - case 'INSERT': - case 'UPDATE': - case 'DELETE': - case 'REPLACE': - case 'TRUNCATE': - return true; + private function preparedStatementInsertParameter($sql, $parameterArray) { + $msg = ''; + + $sqlArray = explode('?', $sql); + $ii = 0; + foreach ($parameterArray as $value) { + if (isset($sqlArray[$ii])) { + if (is_array($value)) { + $value = OnArray::toString($value); + } + + $msg .= $sqlArray[$ii++] . "'" . $value . "'"; + } else { + $msg = '?'; + } } - return false; + if (isset($sqlArray[$ii])) { + $msg .= $sqlArray[$ii]; + } + + return $msg; } /** -- GitLab