/** * Gibt einen ListView mit den ausgeführten Queries zurück * * @return ListViewControl * @throws \Exception */ public function showQueryLog() { $listView = new ListViewControl(null, 'debugQuery'); $listView->addItems(QueryLog::getItems()); $listView->setRenderIfEmpty(false); $listView->setItemSkin(' <div class="panel <?php if ("{errorMessage}" != "") echo "panel-danger"; else echo "panel-default"; ?>"> <div class="panel-heading" role="tab" id="heading{id}"> <h4 class="panel-title"> <a class="collapsed" data-toggle="collapse" href="#collapse{name}"> {short} </a> <div class="pull-right"> <span class="glyphicon glyphicon-flash" aria-hidden="true"></span> {execution} ms </div> </h4> </div> <div id="collapse{name}" class="panel-collapse collapse" role="tabpanel"> <div class="panel-body"> <button class="btn btn-primary btn-xs" style="margin-bottom: 10px"> <span class="glyphicon glyphicon-play" aria-hidden="true"></span> Ausführen </button> {query} <pre>{params}</pre> </div> </div> </div> '); $listView->setSkin('<div class="panel-group">{controls}</div>'); return $listView; }
/** * Query auf Datenbank ausführen und die entsprechenden Bindings durchführen. * ACHTUNG: Funktion fängt derzeit nicht ab, wenn Leerzeichn im Feldnamen * stehen, aber das sollte man sowieso nicht machen. * @param string $sql * @param array|null $params * @return $this */ public function query($sql, $params = null) { if (!$this->connected) { $this->connect(); } // Falls noch ein Statement aktiv ist, dieses abbrechen if ($this->statement !== null) { $this->closeStatement(); } // TODO if ($this->engine === self::DB_MSSQL) { $sql = str_replace('CURDATE()', 'Convert(date, getdate())', $sql); $sql = str_replace('curdate()', 'Convert(date, getdate())', $sql); } $startTime = microtime(true); $this->prepareQueryAndBindParameter($sql, $params); $prepareTime = microtime(true); Profiler::startSection('database.execute', $sql); $errorMsg = ''; try { $success = $this->statement->execute(); } catch (Exception $e) { $errorMsg = $e->getMessage(); $success = false; } $executeTime = microtime(true); Profiler::endSection('database.execute'); if ($this->logQueries || !$success) { if ($success) { QueryLog::success($sql, $params, round(($executeTime - $prepareTime) * 1000), round(($prepareTime - $startTime) * 1000)); } else { $info = $this->statement->errorInfo(); Logging::error('Query konnte nicht ausgeführt werden: ' . $info[2] . $errorMsg . $sql); //error_log("Query konnte nicht ausgeführt werden: " . $info[2] . "\n" . $errorMsg . "\n" . $sql . "\n" . print_r(debug_backtrace(~DEBUG_BACKTRACE_PROVIDE_OBJECT), true)); QueryLog::fail($sql, $params, round(($executeTime - $prepareTime) * 1000), round(($prepareTime - $startTime) * 1000), $info[2] . $errorMsg); } } return $this; }