Changed from mysqli to PDO, some refactorings, faster sql queries
parent
f7c09cb7ff
commit
9a3ad88834
@ -1,59 +1,62 @@
|
||||
<?php
|
||||
|
||||
use Engelsystem\Database\DB;
|
||||
|
||||
/**
|
||||
* Creates a log entry.
|
||||
*
|
||||
* @param string $nick Username
|
||||
* @param string $message Log Message
|
||||
* @return mysqli_result|false
|
||||
* @return bool
|
||||
*/
|
||||
function LogEntry_create($nick, $message)
|
||||
{
|
||||
return sql_query("
|
||||
INSERT INTO `LogEntries`
|
||||
SET
|
||||
`timestamp`='" . sql_escape(time()) . "',
|
||||
`nick`='" . sql_escape($nick) . "',
|
||||
`message`='" . sql_escape($message) . "'
|
||||
");
|
||||
return DB::insert('
|
||||
INSERT INTO `LogEntries` (`timestamp`, `nick`, `message`)
|
||||
VALUES(?, ?, ?)
|
||||
', [time(), $nick, $message]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns log entries with maximum count of 10000.
|
||||
*
|
||||
* @return array|false
|
||||
* @return array
|
||||
*/
|
||||
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
|
||||
*
|
||||
* @param string $keyword
|
||||
* @return array|false
|
||||
* @return array
|
||||
*/
|
||||
function LogEntries_filter($keyword)
|
||||
{
|
||||
if ($keyword == '') {
|
||||
return LogEntries();
|
||||
}
|
||||
return sql_select("
|
||||
SELECT *
|
||||
FROM `LogEntries`
|
||||
WHERE `nick` LIKE '%" . sql_escape($keyword) . "%'
|
||||
OR `message` LIKE '%" . sql_escape($keyword) . "%'
|
||||
ORDER BY `timestamp` DESC
|
||||
");
|
||||
|
||||
$keyword = '%' . $keyword . '%';
|
||||
return DB::select('
|
||||
SELECT *
|
||||
FROM `LogEntries`
|
||||
WHERE `nick` LIKE ?
|
||||
OR `message` LIKE ?
|
||||
ORDER BY `timestamp` DESC
|
||||
',
|
||||
[$keyword, $keyword]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all log entries.
|
||||
*
|
||||
* @return mysqli_result|false
|
||||
* @return bool
|
||||
*/
|
||||
function LogEntries_clear_all()
|
||||
{
|
||||
return sql_query('TRUNCATE `LogEntries`');
|
||||
return DB::statement('TRUNCATE `LogEntries`');
|
||||
}
|
||||
|
@ -1,18 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Engelsystem\Database\DB;
|
||||
|
||||
/**
|
||||
* Returns users groups
|
||||
*
|
||||
* @param array $user
|
||||
* @return array|false
|
||||
* @return array
|
||||
*/
|
||||
function User_groups($user)
|
||||
{
|
||||
return sql_select('
|
||||
SELECT `Groups`.*
|
||||
FROM `UserGroups`
|
||||
JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id`
|
||||
WHERE `UserGroups`.`uid`=\'' . sql_escape($user['UID']) . '\'
|
||||
ORDER BY `UserGroups`.`group_id`
|
||||
');
|
||||
return DB::select('
|
||||
SELECT `Groups`.*
|
||||
FROM `UserGroups`
|
||||
JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id`
|
||||
WHERE `UserGroups`.`uid`=?
|
||||
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