From 648364aa23cb3160e4177e863e0eaa41686293ef Mon Sep 17 00:00:00 2001 From: Max Pozdeev Date: Sun, 25 Jul 2021 00:10:27 +0300 Subject: [PATCH] * add support of PDO mysql extension (try it by default while setup) --- src/includes/class.db.mysql.php | 171 ++++++++++++++++++++++++++++++++ src/includes/common.php | 1 + src/init.php | 5 +- src/setup.php | 18 +++- 4 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 src/includes/class.db.mysql.php diff --git a/src/includes/class.db.mysql.php b/src/includes/class.db.mysql.php new file mode 100644 index 0000000..968e583 --- /dev/null +++ b/src/includes/class.db.mysql.php @@ -0,0 +1,171 @@ + + Licensed under the GNU GPL v2 license. See file COPYRIGHT for details. +*/ + +// ---------------------------------------------------------------------------- // +class DatabaseResult_Mysql +{ + private $q; + private $affected; + + function __construct($dbh, $query, $resultless = 0) + { + // use with DELETE, INSERT, UPDATE + if ($resultless) + { + $this->affected = $dbh->exec($query); //throws PDOException + } + // SELECT + else + { + $this->q = $dbh->query($query); //throws PDOException + $this->affected = $this->q->rowCount(); + } + } + + function fetch_row() + { + return $this->q->fetch(PDO::FETCH_NUM); + } + + function fetch_assoc() + { + return $this->q->fetch(PDO::FETCH_ASSOC); + } + + function rowsAffected() + { + return $this->affected; + } +} + +// ---------------------------------------------------------------------------- // +class Database_Mysql +{ + private $dbh; + private $affected = null; + var $lastQuery; + private $dbname; + + function __construct() + { + } + + function connect($host, $user, $pass, $db) + { + $options = array( + PDO::MYSQL_ATTR_FOUND_ROWS => true, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION + ); + $this->dbname = $db; + + $this->dbh = new PDO("mysql:host=$host;dbname=$db", $user, $pass, $options); + return true; + } + + + + /* + Returns single row of SELECT query as indexed array (FETCH_NUM). + Returns single field value if resulting array has only one field. + */ + function sq($query, $p = NULL) + { + $q = $this->_dq($query, $p); + + $res = $q->fetch_row(); + if ($res === false) return NULL; + + if (sizeof($res) > 1) return $res; + else return $res[0]; + } + + /* + Returns single row of SELECT query as dictionary array (FETCH_ASSOC). + Returns single field value if resulting array has only one field. + */ + function sqa($query, $p = NULL) + { + $q = $this->_dq($query, $p); + + $res = $q->fetch_assoc(); + if ($res === false) return NULL; + + if (sizeof($res) > 1) return $res; + else return $res[0]; + } + + function dq($query, $p = NULL) + { + return $this->_dq($query, $p); + } + + /* + for resultless queries like INSERT,UPDATE,DELETE + */ + function ex($query, $p = NULL) + { + return $this->_dq($query, $p, true); + } + + private function _dq($query, $p = NULL, $resultless = 0) + { + if (!isset($p)) $p = array(); + elseif (!is_array($p)) $p = array($p); + + $m = explode('?', $query); + + if (sizeof($p) > 0) + { + if (sizeof($m) < sizeof($p)+1) { + throw new Exception("params to set MORE than query params"); + } + if (sizeof($m) > sizeof($p)+1) { + throw new Exception("params to set LESS than query params"); + } + $query = ""; + for ($i=0; $iquote($p[$i])); + } + $query .= $m[$i]; + } + $this->lastQuery = $query; + $dbr = new DatabaseResult_Mysql($this->dbh, $query, $resultless); + $this->affected = $dbr->rowsAffected(); + return $dbr; + } + + function affected() + { + return $this->affected; + } + + function quote($s) + { + return '\''. addslashes($s). '\''; + } + + function quoteForLike($format, $s) + { + $s = str_replace(array('%','_'), array('\%','\_'), addslashes($s)); + return '\''. sprintf($format, $s). '\''; + } + + function last_insert_id() + { + return $this->dbh->lastInsertId(); + } + + function table_exists($table) + { + $r = $this->sq("SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?", + array($this->dbname, $table) ); + if ($r === false || $r === null) return false; + return true; + } +} + +?> \ No newline at end of file diff --git a/src/includes/common.php b/src/includes/common.php index d687d75..fcd4259 100644 --- a/src/includes/common.php +++ b/src/includes/common.php @@ -87,6 +87,7 @@ class Config 'template' => array('default'=>'default', 'type'=>'s'), 'showdate' => array('default'=>0, 'type'=>'i'), 'markup' => array('default'=>'markdown', 'type'=>'s'), + 'mysqli' => array('default'=>1, 'type'=>'i') ); public static $config; diff --git a/src/init.php b/src/init.php index bc54407..978434d 100644 --- a/src/init.php +++ b/src/init.php @@ -40,9 +40,10 @@ unset($config); date_default_timezone_set(Config::get('timezone')); # MySQL Database Connection -if(Config::get('db') == 'mysql') +if (Config::get('db') == 'mysql') { - require_once(MTTINC. 'class.db.mysqli.php'); + if (Config::get('mysqli')) require_once(MTTINC. 'class.db.mysqli.php'); + else require_once(MTTINC. 'class.db.mysql.php'); $db = DBConnection::init(new Database_Mysql); try { $db->connect(Config::get('mysql.host'), Config::get('mysql.user'), Config::get('mysql.password'), Config::get('mysql.db')); diff --git a/src/setup.php b/src/setup.php index 9751122..d1b7f92 100644 --- a/src/setup.php +++ b/src/setup.php @@ -336,13 +336,23 @@ function testConnect(&$error) { if(Config::get('db') == 'mysql') { - if ( !function_exists("mysqli_connect") ) { - throw new Exception("Required PHP extension 'mysqli' is not installed"); + if (defined('PDO::MYSQL_ATTR_FOUND_ROWS')) { + require_once(MTTINC. 'class.db.mysql.php'); + Config::set('mysqli', 0); } - require_once(MTTINC. 'class.db.mysqli.php'); + else if (function_exists("mysqli_connect")) { + require_once(MTTINC. 'class.db.mysqli.php'); + Config::set('mysqli', 1); + } + else { + $text = "Required PHP extension 'PDO mysql' is not installed."; + throw new Exception($text); + } + $db = new Database_Mysql; $db->connect(Config::get('mysql.host'), Config::get('mysql.user'), Config::get('mysql.password'), Config::get('mysql.db')); - } else + } + else { if(false === $f = @fopen(MTTPATH. 'db/todolist.db', 'a+')) throw new Exception("database file is not readable/writable"); else fclose($f);