Суть данного класса, писать модули соблюдая синтаксис PDO , чтоб в будущем не перепиливать модули
Сейчас пишу модуль на шестерку, но он попрёт и на семерке. Просто в скрипте в одном месте меняем объявление переменной и с Mysql переключаемся на PDO
Основные методы для использования написал, оттестил на скрипте на чистом PDO и на затычке
потестите , отпишитесь
третий пост темы с актуальным кодом
Код (+/-)
/**
* Db
* Класс эмуляции PDO для обычного mysql
* создан для дальнейшей совместимости, просто удалив файл и подключить к работе PDO , ничего не должно поломаться
* собраны основные методы (не все) , при желании можно дописать, при нужной необходимости
* @author Koenig <http://johncms.com/users/profile.php?user=6565>
* @version 1.0
*/
class Db {
private $sql = false;
private $result = false;
protected static $instance = null;
public final static function getInstance() {
if (null === static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
protected function __construct(){}
protected function __clone(){}
protected function __wakeup(){}
#private function isFetch() {
# return preg_match('/select/i', $this->sql) ? true : false;
#}
public function prepare($sql) {
$this->sql = trim($sql);
return $this;
}
public function query($sql) {
$this->sql = trim($sql);
$this->result = mysql_query($sql);
return $this;
}
public function fetch() {
return mysql_fetch_assoc($this->result);
}
public function fetchColumn($column_number = 0) {
$res = $this->fetch();
return $res[$column_number];
}
public function fetchObject($class = 'stdClass', $args = array()) {
return mysql_fetch_object($this->result, $class, $args);
}
public function rowCount() {
#echo '<pre>' . print_r($this, 1) . '</pre>';
$res = mysql_fetch_row(mysql_query($this->sql));
return $res[0];
}
public function fetchAll() {
$array = array();
while($res = $this->fetch()) {
$array[] = $res;
}
return $array;
}
public function execute($args = array()) {
if (sizeof($args)) {
$args = $this->esc($args);
$parts = preg_split('#(\?)#u', $this->sql, null, PREG_SPLIT_DELIM_CAPTURE);
$cnt = sizeof($parts);
$cntargs = sizeof($args);
$cntparts = substr_count($this->sql, '?');
if ($cntargs != $cntparts) {
throw new InvalidArgumentException('Wrong number of arguments. Parts = ' . $cntparts . ', Args = ' . $cntargs);
}
$sql = '';
for($i = 0; $i < $cnt; $i++) {
$sql .= (($i % 2) == 0 ? $parts[$i] : str_replace('?', $args[($i/2)], $parts[$i]));
}
$sql .= ';';
$this->sql = $sql;
$res = mysql_query($sql);
} else {
$res = mysql_query($this->sql);
}
#$this->result = $this->isFetch() ? $res : false;
$this->result = $res;
return $this;
}
public function lastInsertId() {
$id = $this->query('SELECT LAST_INSERT_ID()')->fetchColumn();
return $id;
}
private function esc($data) {
if (!is_array($data)) {
$data = is_int($data) ? $data : '"' . mysql_real_escape_string($data) . '"';
} else {
$data = array_map(array($this, 'esc'), $data);
}
return $data;
}
public function quote($str) {
return $this->esc($str);
}
public function exec($sql) {
$res = mysql_query($sql);
return mysql_affected_rows($res);
}
}
Что такое PDO?и зачем нужно?
в гугле забанили что ли?
драйвер это. для работы с различными субд, в т.ч и мускули коий пришел на смену ныне устаревшего и не поддерживаемого мускула
Было-бы неплохо напичкать двиг всеми костылями что бы модули думали что работают на 7-ке.
Тогда к моменту выхода уже будет немало полностью совместимых модулей.
Что-то вроде пакета эмуляции 7-ки для 6-ки с детальным описанием всех функций и структуры.
И данный класс будет очень кстати ..
Честно говоря я не понял предназначение данного класса.
Зачем он?
Класс был бы актуален еще на РНР 4, где PDO еще встречался не во всех конфигурациях.
А на сегодня трудно найти такой хостинг, где бы не было PDO.
А если нужен PDO, так его и надо использовать, без каких-либо эмуляторов.
Зачем эмулировать то, что и так есть?
===
З.Ы.
А если хочется сделать эмулятор 7-ки, чтоб уже сейчас на JohnCMS 6 и ниже клепать модули с PDO, то тут надо идти другим путем. Надо параллельно с MySQL подключать PDO, делать эмулятор контейнера (чтоб вызов был такой же как и в 7-ке) и использовать.
AlkatraZ, тогда придётся держать два соединения с бд
вся фишка в том, я пишу модуль на PDO
но я скорее её допишу, чем выйдет семёрка (надеюсь я ошибаюсь)
и чтоб не переписывать код, этот костыль будет работать не меняя код
# Koenig (10.08.2016 / 15:03)
AlkatraZ, тогда придётся держать два соединения с бд
вся фишка в том, я пишу модуль на PDO
но я скорее её допишу, чем выйдет семёрка (надеюсь я ошибаюсь)
и чтоб не переписывать код, этот костыль б
Логично, надо будет держать 2 соединения, что у нас в пакете совместимости и юзается...
Это неизбежное зло на переходной процесс с использованием старых модулей.
AlkatraZ, ну в любом случае пусть лежит. если под шестерку модуль запустить, то чисто для одного модуля держать новое соединение не кошерно