Различные вопросы по PHP и MySQL

256K
.
(\/)____o_O____(\/)

Swank, одну строку изменить, а так и запрос тот же, по сути класс будет работать с любой таблицей, изначально даже хотел еще сделать для любых таблиц с данной структурой. но потом забил, имя таблицы поменять на нужную еще в запросе, там получаешь массив, имен и идов, и этого формирует ссылки

.
Сексуальность валенка

Koenig, О_о в php есть рекурсивность, незнал, мечтал об этом

.
(\/)____o_O____(\/)

Swank, это самый простой способ, сначала я пробовал процедуры в мускуле, там временные таблицы и прочее, но как то не красиво получилось, и по мне не удобно, хоть процедуры в мускуле чем то напоминают компилируемые языки

.
Сексуальность валенка

Koenig, Все работает

.
Сексуальность валенка

У меня есть еще проблемка одна.
Вот есть у меня класс DB он наследует PDO
Этот класс у меня в отдельном файле
Этот файл я инклудю в другой файл(init.php) и в init.php делаю $db = new DB;
Также в init.php инклуюеться другие классы, так в этих других классах я не могу юзать класс DB мне приходится делать переменную $db глобальной
Мне кажется что global юзать нежилательно ибо это както неправильно.
Как сделать чтоб не юзать globale?
Делать $db = new DB; именно там где я юзаю базу? Юзать всеже globale? или может у меня вообще архитектура папок/файлов и мне надо реорганизовать ее?

.
(\/)____o_O____(\/)

Swank, если без велосипеда, то нужно делать синглетон и получать инстанцию класса уже в классе, например в конструктор записывать дб в свойство и работать уже как с локальным объектом, хотя сам привык глобалить, так проще по мне, как синглетон сделать найдешь? еще нужен будет автозагрузчик классов

.
(\/)____o_O____(\/)

Swank, первая ссылка в гугле http://tonylandis.com/php/php5 ... lass/

.
# Swank (26.04.2015 / 16:59)
У меня есть еще проблемка одна.
Вот есть у меня класс DB он наследует PDO
Этот класс у меня в отдельном файле
Этот файл я инклудю в другой файл(init.php) и в init.php делаю $db = new DB;
Также в i
man dependency injection container
.
Folour
Think different

Я себе замутил полностью статическую обертку 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.
А я вообще не понимаю чем отличается абстракный класс от обычного или что такое интерфейс
Прийдется изучать(

Всего: 7969