Swank, одну строку изменить, а так и запрос тот же, по сути класс будет работать с любой таблицей, изначально даже хотел еще сделать для любых таблиц с данной структурой. но потом забил, имя таблицы поменять на нужную еще в запросе, там получаешь массив, имен и идов, и этого формирует ссылки
Koenig, О_о в php есть рекурсивность, незнал, мечтал об этом
Swank, это самый простой способ, сначала я пробовал процедуры в мускуле, там временные таблицы и прочее, но как то не красиво получилось, и по мне не удобно, хоть процедуры в мускуле чем то напоминают компилируемые языки
У меня есть еще проблемка одна.
Вот есть у меня класс DB он наследует PDO
Этот класс у меня в отдельном файле
Этот файл я инклудю в другой файл(init.php) и в init.php делаю $db = new DB;
Также в init.php инклуюеться другие классы, так в этих других классах я не могу юзать класс DB мне приходится делать переменную $db глобальной
Мне кажется что global юзать нежилательно ибо это както неправильно.
Как сделать чтоб не юзать globale?
Делать $db = new DB; именно там где я юзаю базу? Юзать всеже globale? или может у меня вообще архитектура папок/файлов и мне надо реорганизовать ее?
Swank, если без велосипеда, то нужно делать синглетон и получать инстанцию класса уже в классе, например в конструктор записывать дб в свойство и работать уже как с локальным объектом, хотя сам привык глобалить, так проще по мне, как синглетон сделать найдешь? еще нужен будет автозагрузчик классов
# Swank (26.04.2015 / 16:59)
У меня есть еще проблемка одна.
Вот есть у меня класс DB он наследует PDO
Этот класс у меня в отдельном файле
Этот файл я инклудю в другой файл(init.php) и в init.php делаю $db = new DB;
Также в i
man dependency injection container
Я себе замутил полностью статическую обертку PDO, есть все функции основного класса PDO
DB class (+/-)
<?php
/**
* @author Folour
* @link http://folour.pro
* @contacts Mail: Folour@ya.ru, Skype: iFolour, VK: vk.com/Folour
*/
namespace Folour\system;
use Folour\exceptions\DBException;
/**
* Class DB
* A class for provide access to Database with using PDO
* @package Folour\system
*/
abstract class DB {
/**
* @var \PDO
*/
private static $pdo;
/**
* @var array
*/
private static $args = [
'driver' => 'mysql',
'charset' => 'utf8',
'server' => 'localhost',
'options' => [
\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
],
'fetchMode' => \PDO::FETCH_OBJ,
'errorMode' => \PDO::ERRMODE_WARNING
];
/**
* @param array $args
*/
public static function init($args) {
if(isset($args['user'], $args['password'], $args['db'])) {
self::$args = array_replace(self::$args, $args);
}
}
/**
* @param string $query
* @return int
* @throws DBException
*/
public static function exec($query) {
return self::run()->exec($query);
}
/**
* @param string $query
* @return \PDOStatement
* @throws DBException
*/
public static function query($query) {
return self::run()->query($query);
}
/**
* @param string $query
* @param array $driverOptions
*
* @return \PDOStatement
* @throws DBException
*/
public static function prepare($query, array $driverOptions = []) {
return self::run()->prepare($query, $driverOptions);
}
/**
* @param string $query
* @param int $fetchMode
* @return mixed
*/
public static function fetchAll($query, $fetchMode = \PDO::FETCH_OBJ) {
$result = self::run()->query($query);
if(is_object($result)) {
return $result->fetchAll($fetchMode);
}
return false;
}
/**
* @param string $query
* @param int $fetchMode
* @return bool|mixed
*/
public static function fetch($query, $fetchMode = \PDO::FETCH_OBJ) {
$result = self::run()->query($query);
if(is_object($result)) {
return $result->fetch($fetchMode);
}
return false;
}
/**
* @param string $query
* @param int $columnNumber
* @return bool|string
*/
public static function fetchColumn($query, $columnNumber = 0) {
$result = self::run()->query($query);
if(is_object($result)) {
return $result->fetchColumn($columnNumber);
}
return false;
}
/**
* @return bool
* @throws DBException
*/
public static function beginTransaction() {
return self::run()->beginTransaction();
}
/**
* @return bool
* @throws DBException
*/
public static function inTransaction() {
return self::run()->inTransaction();
}
/**
* @return bool
* @throws DBException
*/
public static function commit() {
return self::run()->commit();
}
/**
* @return bool
* @throws DBException
*/
public static function rollBack() {
return self::run()->rollBack();
}
/**
* @param string $name
* @return string
* @throws DBException
*/
public static function lastInsertId($name = null) {
return self::run()->lastInsertId($name);
}
/**
* @param string $string
* @param int $parameterType
* @return string
* @throws DBException
*/
public static function quote($string, $parameterType = \PDO:
ARAM_STR) {
return self::run()->quote($string, $parameterType);
}
/**
* @param int $attribute
* @return mixed
* @throws DBException
*/
public static function getAttribute($attribute) {
return self::run()->getAttribute($attribute);
}
/**
* @param int $attribute
* @param mixed $value
* @return bool
* @throws DBException
*/
public static function setAttribute($attribute, $value) {
return self::run()->setAttribute($attribute, $value);
}
/**
* @return mixed
* @throws DBException
*/
public static function errorCode() {
return self::run()->errorCode();
}
/**
* @return array
* @throws DBException
*/
public static function errorInfo() {
return self::run()->errorInfo();
}
/**
* @return \PDO
* @throws DBException
*/
public static function run() {
if(self::$pdo instanceof \PDO) {
return self::$pdo;
}
$args = self::$args;
if(isset($args['user'], $args['password'], $args['db'])) {
self::$pdo = new \PDO(
$args['driver'].':charset='.$args['charset'].';host='.$args['server'].';dbname='.$args['db'],
$args['user'],
$args['password'],
$args['options']
);
self::$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, $args['fetchMode']);
self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, $args['errorMode']);
return self::$pdo;
}
throw new DBException('Wrong configuration');
}
}
Использование:
//Где-то в главном скрипте системы
use \Folour\system\DB;
DB::init([
'user' => 'user', //DB user
'password' => 'qwerty', //DB password
'db' => 'database', //DB name
'server' => 'localhost', //DB host
'driver' => 'mysql', //DB driver
'charset' => 'utf8', //DB charset
'options' => [ //PDO options
\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
\PDO::ATTR_PERSISTENT => true
],
'fetchMode' => \PDO::FETCH_OBJ, //PDO fetch mode
'errorMode' => \PDO::ERRMODE_EXCEPTION //PDO error mode
]);
//затем в любом месте
DB::fetch("SELECT * FROM table WHERE id=1"); //получаем одну запись
DB::fetchAll("SELECT * FROM table LIMIT 10"); //получаем 10 записей
DB::fetchColumn("SELECT name FROM table WHERE id=1"); //получаем значение одного поля
//ну и так далее, все методы присутствуют и называются также
Я так понял что для того чтоб юзать Dependency Injection conteiner мне надо понимать такие понятия как interface и abstract.
А я вообще не понимаю чем отличается абстракный класс от обычного или что такое интерфейс

Прийдется изучать(