Changed from mysqli to PDO, some refactorings, faster sql queries
parent
f7c09cb7ff
commit
9a3ad88834
@ -1,59 +1,62 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\DB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a log entry.
|
* Creates a log entry.
|
||||||
*
|
*
|
||||||
* @param string $nick Username
|
* @param string $nick Username
|
||||||
* @param string $message Log Message
|
* @param string $message Log Message
|
||||||
* @return mysqli_result|false
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function LogEntry_create($nick, $message)
|
function LogEntry_create($nick, $message)
|
||||||
{
|
{
|
||||||
return sql_query("
|
return DB::insert('
|
||||||
INSERT INTO `LogEntries`
|
INSERT INTO `LogEntries` (`timestamp`, `nick`, `message`)
|
||||||
SET
|
VALUES(?, ?, ?)
|
||||||
`timestamp`='" . sql_escape(time()) . "',
|
', [time(), $nick, $message]);
|
||||||
`nick`='" . sql_escape($nick) . "',
|
|
||||||
`message`='" . sql_escape($message) . "'
|
|
||||||
");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns log entries with maximum count of 10000.
|
* Returns log entries with maximum count of 10000.
|
||||||
*
|
*
|
||||||
* @return array|false
|
* @return array
|
||||||
*/
|
*/
|
||||||
function LogEntries()
|
function LogEntries()
|
||||||
{
|
{
|
||||||
return sql_select('SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000');
|
return DB::select('SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns log entries filtered by a keyword
|
* Returns log entries filtered by a keyword
|
||||||
*
|
*
|
||||||
* @param string $keyword
|
* @param string $keyword
|
||||||
* @return array|false
|
* @return array
|
||||||
*/
|
*/
|
||||||
function LogEntries_filter($keyword)
|
function LogEntries_filter($keyword)
|
||||||
{
|
{
|
||||||
if ($keyword == '') {
|
if ($keyword == '') {
|
||||||
return LogEntries();
|
return LogEntries();
|
||||||
}
|
}
|
||||||
return sql_select("
|
|
||||||
SELECT *
|
$keyword = '%' . $keyword . '%';
|
||||||
FROM `LogEntries`
|
return DB::select('
|
||||||
WHERE `nick` LIKE '%" . sql_escape($keyword) . "%'
|
SELECT *
|
||||||
OR `message` LIKE '%" . sql_escape($keyword) . "%'
|
FROM `LogEntries`
|
||||||
ORDER BY `timestamp` DESC
|
WHERE `nick` LIKE ?
|
||||||
");
|
OR `message` LIKE ?
|
||||||
|
ORDER BY `timestamp` DESC
|
||||||
|
',
|
||||||
|
[$keyword, $keyword]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all log entries.
|
* Delete all log entries.
|
||||||
*
|
*
|
||||||
* @return mysqli_result|false
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function LogEntries_clear_all()
|
function LogEntries_clear_all()
|
||||||
{
|
{
|
||||||
return sql_query('TRUNCATE `LogEntries`');
|
return DB::statement('TRUNCATE `LogEntries`');
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,22 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\DB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns users groups
|
* Returns users groups
|
||||||
*
|
*
|
||||||
* @param array $user
|
* @param array $user
|
||||||
* @return array|false
|
* @return array
|
||||||
*/
|
*/
|
||||||
function User_groups($user)
|
function User_groups($user)
|
||||||
{
|
{
|
||||||
return sql_select('
|
return DB::select('
|
||||||
SELECT `Groups`.*
|
SELECT `Groups`.*
|
||||||
FROM `UserGroups`
|
FROM `UserGroups`
|
||||||
JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id`
|
JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id`
|
||||||
WHERE `UserGroups`.`uid`=\'' . sql_escape($user['UID']) . '\'
|
WHERE `UserGroups`.`uid`=?
|
||||||
ORDER BY `UserGroups`.`group_id`
|
ORDER BY `UserGroups`.`group_id`
|
||||||
');
|
',
|
||||||
|
[$user['UID']]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,250 +0,0 @@
|
|||||||
<?php
|
|
||||||
/** @var mysqli $sql_connection */
|
|
||||||
$sql_connection = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close connection.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
function sql_close()
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
|
|
||||||
return $sql_connection->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return NULL if given value is null.
|
|
||||||
*
|
|
||||||
* @param mixed $value
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
function sql_null($value = null)
|
|
||||||
{
|
|
||||||
return $value == null ? 'NULL' : ("'" . sql_escape($value) . "'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start new transaction.
|
|
||||||
*
|
|
||||||
* @return mysqli_result|bool
|
|
||||||
*/
|
|
||||||
function sql_transaction_start()
|
|
||||||
{
|
|
||||||
global $sql_nested_transaction_level;
|
|
||||||
|
|
||||||
if ($sql_nested_transaction_level++ == 0) {
|
|
||||||
return sql_query('BEGIN');
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Commit transaction.
|
|
||||||
*
|
|
||||||
* @return mysqli_result|bool
|
|
||||||
*/
|
|
||||||
function sql_transaction_commit()
|
|
||||||
{
|
|
||||||
global $sql_nested_transaction_level;
|
|
||||||
|
|
||||||
if (--$sql_nested_transaction_level == 0) {
|
|
||||||
return sql_query('COMMIT');
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop transaction, revert database.
|
|
||||||
*
|
|
||||||
* @return mysqli_result|bool
|
|
||||||
*/
|
|
||||||
function sql_transaction_rollback()
|
|
||||||
{
|
|
||||||
global $sql_nested_transaction_level;
|
|
||||||
|
|
||||||
if (--$sql_nested_transaction_level == 0) {
|
|
||||||
return sql_query('ROLLBACK');
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs an sql error.
|
|
||||||
*
|
|
||||||
* @param string $message
|
|
||||||
* @return false
|
|
||||||
*/
|
|
||||||
function sql_error($message)
|
|
||||||
{
|
|
||||||
// @TODO: Bad idea..
|
|
||||||
sql_close();
|
|
||||||
|
|
||||||
$message = trim($message) . "\n";
|
|
||||||
$message .= debug_string_backtrace() . "\n";
|
|
||||||
|
|
||||||
error_log('mysql_provider error: ' . $message);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to mysql server.
|
|
||||||
*
|
|
||||||
* @param string $host Host
|
|
||||||
* @param string $user Username
|
|
||||||
* @param string $pass Password
|
|
||||||
* @param string $db_name DB to select
|
|
||||||
* @return mysqli|false The connection handler
|
|
||||||
*/
|
|
||||||
function sql_connect($host, $user, $pass, $db_name)
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
|
|
||||||
$sql_connection = new mysqli($host, $user, $pass, $db_name);
|
|
||||||
if ($sql_connection->connect_errno) {
|
|
||||||
error('Unable to connect to MySQL: ' . $sql_connection->connect_error);
|
|
||||||
return sql_error('Unable to connect to MySQL: ' . $sql_connection->connect_error);
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = $sql_connection->query('SET CHARACTER SET utf8;');
|
|
||||||
if (!$result) {
|
|
||||||
return sql_error('Unable to set utf8 character set (' . $sql_connection->errno . ') ' . $sql_connection->error);
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = $sql_connection->set_charset('utf8');
|
|
||||||
if (!$result) {
|
|
||||||
return sql_error('Unable to set utf8 names (' . $sql_connection->errno . ') ' . $sql_connection->error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $sql_connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Change the selected db in current mysql-connection.
|
|
||||||
*
|
|
||||||
* @param $db_name
|
|
||||||
* @return bool true on success, false on error
|
|
||||||
*/
|
|
||||||
function sql_select_db($db_name)
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
if (!$sql_connection->select_db($db_name)) {
|
|
||||||
return sql_error('No database selected.');
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MySQL SELECT query
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return array|false Result array or false on error
|
|
||||||
*/
|
|
||||||
function sql_select($query)
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
|
|
||||||
$result = $sql_connection->query($query);
|
|
||||||
if ($result) {
|
|
||||||
$data = [];
|
|
||||||
while ($line = $result->fetch_assoc()) {
|
|
||||||
array_push($data, $line);
|
|
||||||
}
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sql_error('MySQL-query error: ' . $query . ' (' . $sql_connection->errno . ') ' . $sql_connection->error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MySQL execute a query
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return mysqli_result|false boolean resource or false on error
|
|
||||||
*/
|
|
||||||
function sql_query($query)
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
|
|
||||||
$result = $sql_connection->query($query);
|
|
||||||
if ($result) {
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sql_error('MySQL-query error: ' . $query . ' (' . $sql_connection->errno . ') ' . $sql_connection->error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns last inserted id.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
function sql_id()
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
return $sql_connection->insert_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Escape a string for a sql query.
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function sql_escape($query)
|
|
||||||
{
|
|
||||||
global $sql_connection;
|
|
||||||
return $sql_connection->real_escape_string($query);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a boolean for mysql-queries.
|
|
||||||
*
|
|
||||||
* @param boolean $boolean
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function sql_bool($boolean)
|
|
||||||
{
|
|
||||||
return $boolean == true ? 'TRUE' : 'FALSE';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Count query result lines.
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return int Count of result lines
|
|
||||||
*/
|
|
||||||
function sql_num_query($query)
|
|
||||||
{
|
|
||||||
return sql_query($query)->num_rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sql_select_single_col($query)
|
|
||||||
{
|
|
||||||
$result = sql_select($query);
|
|
||||||
return array_map('array_shift', $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $query
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
function sql_select_single_cell($query)
|
|
||||||
{
|
|
||||||
$result = sql_select($query);
|
|
||||||
if ($result == false) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = array_shift($result);
|
|
||||||
if (!is_array($result)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return array_shift($result);
|
|
||||||
}
|
|
@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Database;
|
||||||
|
|
||||||
|
use PDO;
|
||||||
|
use PDOException;
|
||||||
|
use PDOStatement;
|
||||||
|
|
||||||
|
class Db
|
||||||
|
{
|
||||||
|
/** @var PDO */
|
||||||
|
protected static $db;
|
||||||
|
|
||||||
|
/** @var PDOStatement */
|
||||||
|
protected static $stm = null;
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
protected static $lastStatus = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect to database
|
||||||
|
*
|
||||||
|
* @param string $dsn
|
||||||
|
* @param string $username
|
||||||
|
* @param string $password
|
||||||
|
* @param array $options
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function connect($dsn, $username = null, $password = null, $options = [])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
self::$db = new PDO($dsn, $username, $password, $options);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a prepared query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return PDOStatement
|
||||||
|
*/
|
||||||
|
public static function query($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::$stm = self::$db->prepare($query);
|
||||||
|
self::$lastStatus = self::$stm->execute($bindings);
|
||||||
|
|
||||||
|
return self::$stm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a sql query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function unprepared($query)
|
||||||
|
{
|
||||||
|
self::$stm = self::$db->query($query);
|
||||||
|
self::$lastStatus = (self::$stm instanceof PDOStatement);
|
||||||
|
|
||||||
|
return self::$lastStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a select query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function select($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::query($query, $bindings);
|
||||||
|
|
||||||
|
return self::$stm->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a insert query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function insert($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::query($query, $bindings);
|
||||||
|
|
||||||
|
return self::$lastStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a update query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public static function update($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::query($query, $bindings);
|
||||||
|
|
||||||
|
return (self::$lastStatus ? self::$stm->rowCount() : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a delete query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public static function delete($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::query($query, $bindings);
|
||||||
|
|
||||||
|
return (self::$lastStatus ? self::$stm->rowCount() : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a single statement
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array $bindings
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function statement($query, array $bindings = [])
|
||||||
|
{
|
||||||
|
self::query($query, $bindings);
|
||||||
|
|
||||||
|
return self::$lastStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last error
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getError()
|
||||||
|
{
|
||||||
|
if (!self::$stm instanceof PDOStatement) {
|
||||||
|
return [-1, null, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$stm->errorInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the PDO instance
|
||||||
|
*
|
||||||
|
* @return PDO
|
||||||
|
*/
|
||||||
|
public static function getPdo()
|
||||||
|
{
|
||||||
|
return self::$db;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return PDOStatement|false|null
|
||||||
|
*/
|
||||||
|
public static function getStm()
|
||||||
|
{
|
||||||
|
return self::$stm;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue