За последние 24 часа нас посетили 62084 программиста и 1596 роботов. Сейчас ищут 817 программистов ...

ORM... ActiveRecord... В общем своими руками...

Тема в разделе "PHP для новичков", создана пользователем askanim, 6 июн 2016.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Друзья
    Помню тема уже подымалась эта, но до конца раскрыта не была.
    В framework Типа YII2 или LARAVEL

    Есть такая реализация при исполнении запросов к БД
    PHP:
    1. DB::table('tableName')->where('id','=', 'id')->get();
    Такой вид запросов реализован в LARAVEL, примерно знаю что в yii2 Тоже самое...

    Так как реализовать подобные запроса. Так скажем объектного вида...

    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 04.06.2016
    6. * Time: 18:04
    7. */
    8.  
    9. namespace App\Models;
    10.  
    11.  
    12. use System\Http\Model\Model;
    13.  
    14. class Main extends Model
    15. {
    16.     public $mass;
    17.     public function mainModel () {
    18.  
    19.        $this->mass = $this->Select('tableName')->get(); // Не знаю что сделать чтобы можно было делать так...
    20.      
    21.     }
    22. }
    А теперь сама Model над которой я проделываю без результатные опыты

    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 04.06.2016
    6. * Time: 18:03
    7. */
    8.  
    9. namespace System\Http\Model;
    10.  
    11. use System\Db\Db;
    12.  
    13. class Model
    14. {
    15.         protected $tableName;
    16.         public $Select;
    17.         public $get;
    18.         public function __construct ($tableName) {
    19.             $this->tableName = $tableName;
    20.  
    21.             $this->Select = $this->Select();
    22.         }
    23.         public function Select () {
    24.             $this->get = $this->get();
    25.         }
    26.         public function get () {
    27.             $db =  Db::getConnection();
    28.             $result = $db->prepare('SELECT * FROM tablename=:tablename');
    29.             $result->bindParam(':tablename',$this->tableName);
    30.             $result->execute();
    31.             $result = $result->fetch();
    32.             return $result;
    33.         }
    34.         public function table ($tableName) {
    35.  
    36.         }
    37. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Тут и пример на PHP есть, будут вопросы задавай.
    https://en.wikipedia.org/wiki/Method_chaining

    ты кстати get правильно сделал, а вот остальные методы нет.
    помни что конструктор не может возвращать данные, это на всякий случай, а в методе Select() последней строчкой надо вызывать return $this; тогда и будет возможность вызывать цепочку $this->Select('tableName')->get(); последний метод get() правильно делает возврат результата, то есть в этой цепочки все методы делают return $this и только последний возвращает результат.
     
    askanim нравится это.
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    ПРОСТО ОТ ДУШИ. ЛАЙК ТЕБЕ! Спасибо друг второй день не могу инфу нарыть как цепочку сделать....
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Вот я реализовал как у себя, ORM оч просто конечно, но для старта пойдёт.

    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 04.06.2016
    6. * Time: 18:04
    7. */
    8.  
    9. namespace App\Models\Main;
    10.  
    11.  
    12. use System\Http\Model\Model;
    13.  
    14. class Main extends Model
    15. {
    16.     public function mainModel ($arr) {
    17.  
    18.         $this->table('Users')->Insert(['user_name' => 'Андрей', 'email' => 'zakoncv@bk.ru']); //Пример добавление данных в БД
    19.  
    20.         $result = $this->table('Users')->where(['id = 1', 'или' , 'groups = 0'])->get($arr); // Пример получения с помощью отбора данных из таблицы
    21.  
    22.  
    23.         // Существует два варианта обновления строки в бд первый вы используете метод ->where ниже пример
    24.         // И затем вы используете метод ->Up Для того чтобы передать ключ как имя столбца в таблицы и значение как то что вы хотите туда написать.
    25.         $this->table('Users')->where(['id > 10'])->Update(['groups' => 1]);
    26.  
    27.         // И второй вариант без использования метода ->where напрямую.
    28.  
    29.  
    30.         $this->table('Users')->Update(
    31.             ['user_name' => 'Леонид'], // Здесь пишите Имя таблицы => И то чем заполняете . Как и в первом варианте
    32.             ['id < 10'] // А тут начинается самое интересное, здесь пишите условие по которому оно выполняется.
    33.         );
    34.  
    35.         // Ну и на функции обновления всё Просто и со вкусом :D
    36.  
    37.  
    38.         // Так ну и с функцией удаление всё тоже просто и красиво
    39.         // В первом варианте мы будем использовать метод->table('Ваша таблица')->where и после метод удаления ->del
    40.         $this->table('Users')->where(['id < 10'])->del();
    41.  
    42.         // И во втором варианте мы удаляем с помощью одного метода ->table('Ваша таблица')->del()
    43.         $this->table('Users')->del(['id < 90']);
    44.  
    45.         return $result;
    46.  
    47.     }
    48. }
    Это конечно уже готовые методы...
     
    #5 askanim, 6 июн 2016
    Последнее редактирование: 6 июн 2016
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Только это не ORM, а DAO (Data Access Objects). ORM - это когда строки таблицы отображаются на объекты классов тем или иным образом.
     
    denis01 нравится это.
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Не понял... Можешь пример привести?
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ну твоя get() возвращает просто массив, а ORM это когда будет возвращён класс и там много чего можно нафаршировать, посмотри doctrine orm,
    ну и тот же Yii2 там есть пример DAO и ORM (Active Record)
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ага посмотрел почитал понял... Засёк... Интересно как это фича реализована... Это нужно за счёт наверно когда таблицу создаёшь происходит запись автоматическое создание объектов, со всеми данными о таблице что позволяет потом через методы обращаться на прямую и изменять данные?
     
    #9 askanim, 7 июн 2016
    Последнее редактирование: 7 июн 2016
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Создание объектов происходит также при запросе. Посмотрите, как реализовано. Если схематично:

    PHP:
    1. class AR {
    2.      protected $values;
    3.      public function __construct($values) {
    4.           $this->values = $values;
    5.      }
    6.      public static function tableName()
    7.      {
    8.           return "";
    9.      }
    10.    
    11.      static function find()
    12.      {
    13.            $rows = DB::select(static::tableName());
    14.            $result = [];
    15.            foreach ($rows as $r) {
    16.                 $result[] = new static($r);
    17.            }
    18.            return $result;
    19.      }
    20.      public function __get($name) { return $this->values[$name]; }
    21.     public function __set($name, $value) { $this->values[$name] = $value; }
    22.     public function save() { /* код вставки или обновления записи в БД */ }
    23.      /* Другие вкусности, типа методов для запроса по связанным таблицам */
    24. }
    25.  
    26. class Task extends AR {
    27.       public static function tableName()
    28.       {
    29.                return "tasks";
    30.       }
    31. }
    32.  
    33. $tasks = Task::find();
    34. $task[0]->name = "Вася";
    35. $task[0]->save();
    Это очень упрощённо подход, используемый в yii2. Я не показал DB::select, но предполагается, что оно возвращает результат обычного select * from table;
    --- Добавлено ---
    А вообще, есть разные паттерны для отображения строк таблицы на объекты. Это - Active Record, он простой, но не без недостатков. Есть ещё Data Mapper, погуглите названия
     
    #10 mkramer, 7 июн 2016
    Последнее редактирование: 7 июн 2016
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 04.06.2016
    6. * Time: 18:03
    7. */
    8.  
    9. namespace System\Http\Model;
    10.  
    11. use System\Db\Db;
    12.  
    13. class Model
    14. {
    15.     protected $tableName;
    16.     protected $Select = 'SELECT ';
    17.     protected $Insert = 'INSERT INTO ';
    18.     protected $Update = 'UPDATE ';
    19.     protected $Delete = 'DELETE FROM ';
    20.     protected $where = '';
    21.  
    22.  
    23.     //Функция выбора Таблицы из БД.
    24.     public function table($tableName)
    25.     {
    26.         $this->tableName = $tableName;
    27.         return $this;
    28.     }
    29.  
    30.  
    31.  
    32.     //Функция добавления данных в таблицу БД
    33.     public function Insert($arr) {
    34.  
    35.         $db = Db::getConnection();
    36.         $stringIns = '';
    37.  
    38.         foreach ($arr as $key => $value) {
    39.             $stringIns = $stringIns.', '.$key.'="'.$value.'"';
    40.         };
    41.         $stringIns = trim($stringIns, ', ');
    42.  
    43.         $result = $db->query($this->Insert . $this->tableName . ' SET ' . $stringIns);
    44.  
    45.     }
    46.  
    47.     //Функция обновления данных в таблице БД
    48.  
    49.     public function Update($arr, $where = NULL) {
    50.  
    51.         $db = Db::getConnection();
    52.  
    53.         $stringUp = '';
    54.         foreach ($arr as $key => $value) {
    55.             $stringUp = $stringUp.', '.$key.'="'.$value.'"';
    56.         };
    57.         $stringUp = trim($stringUp, ', ');
    58.  
    59.  
    60.         if ($where != Null) {
    61.             $this->where = $this->whereIs($where);
    62.  
    63.         }
    64.  
    65.         $db->query($this->Update . $this->tableName . ' SET ' . $stringUp . $this->where);
    66.  
    67.     }
    68.  
    69.     //Функция Удаления данных из таблицы в БД
    70.     public function del($where = NULL) {
    71.  
    72.  
    73.         $db = Db::getConnection();
    74.  
    75.         if ($where != Null) {
    76.             $this->where = $this->whereIs($where);
    77.         }
    78.  
    79.         $db->query($this->Delete . $this->tableName . $this->where);
    80.  
    81.     }
    82.  
    83.     //Общая функция условия при выполнении запроса к таблицы БД
    84.     public function whereIs ($arr) {
    85.         $stringVal = '';
    86.  
    87.         foreach ($arr as $key => $value) {
    88.             if ($value == 'и') {
    89.                 $value = '&&';
    90.             };
    91.             if ($value == 'или') {
    92.                 $value = '||';
    93.             };
    94.             $stringVal = $stringVal . ' ' . $value ;
    95.  
    96.         }
    97.  
    98.         $stringVal = trim($stringVal, ' ,');
    99.  
    100.         $this->where = ' WHERE '. $stringVal;
    101.  
    102.         return $this->where;
    103.     }
    104.     //Функция условия при выполнении запроса к таблицы БД по средством цепочки
    105.     public function where($arr)
    106.     {
    107.         $this->where = $this->whereIs($arr);
    108.  
    109.         return $this;
    110.  
    111.     }
    112.  
    113.     //Функция получения строк из таблицы
    114.     public function get($arr)
    115.     {
    116.  
    117.         $db = Db::getConnection();
    118.  
    119.         $stringVal = '';
    120.  
    121.         foreach ($arr as $key => $value) {
    122.  
    123.             $stringVal = $stringVal . ' ,'. $value ;
    124.  
    125.         };
    126.         $stringVal = trim($stringVal, ' ,');
    127.  
    128.         $result = $db->prepare($this->Select . $stringVal . ' FROM ' . $this->tableName . $this->where);
    129.  
    130.         $result->execute();
    131.  
    132.  
    133.         $base = $result->fetchAll();
    134.  
    135.         return $base;
    136.     }
    137. }
    Вот мой обработчик к базе с запросом, через методы. Думаешь такой вариант подхода плох? Скажите если вдруг по коду есть замечания. С удовольствием улучшу его.
    --- Добавлено ---
    PHP:
    1. namespace App\Database;
    2.  
    3.  
    4. use System\Db\createdDB;
    5.  
    6. class User
    7. {
    8.  
    9.     public function createUser () {
    10.  
    11.  
    12.         $newTable = new createdDB(__CLASS__); // То есть вот так норм передаю а как мне сделать вот так new createdDB() И чтобы у меня
    13.         // в другом классе появился тек класс где создаю экземпляр класса.... Не могу понять там он вызывыет класс того пространства :(
    14.         $newTable->int('id', '123');
    15.         $newTable->varchar('name', '150');
    16.         $newTable->varchar('email', '150');
    17.         $newTable->save();
    18.     }
    19. }
    ... Я чё то уже со всем поехал.. Ваще врубится не могу... Как мне тек класс передать в другой класс... Не вызывая его при этом в тек классе.

    PHP:
    1.  public function __construct($tableName)
    2.     {
    3.         $className =  $tableName;
    4.         $className = explode('\\', $className);
    5.  
    6.         $className = array_pop($className);
    7.         $this->tablename = $className;
    8.     }
    Вот в принципе где я принимаю тот класс

    Я просто не знаю как вообще можно ли так сделать...
    --- Добавлено ---
    Решил данную задачу таким путём

    PHP:
    1. public function __construct()
    2.     {
    3.         $className =  get_class($this);
    4.         $className = explode('\\', $className);
    5.  
    6.         $className = array_pop($className);
    7.         $this->tablename = $className.' (';
    8.     }
    --- Добавлено ---
    Теперь я могу создавать таблицы таким путём !
    PHP:
    1. namespace App\Database;
    2.  
    3.  
    4. use System\Db\createdDB;
    5.  
    6. class User extends createdDB
    7. {
    8.     public function __construct()
    9.     {
    10.         parent::__construct();
    11.     }
    12.  
    13.     public function createUser () {
    14.         $this->int('id', '123');
    15.         $this->varchar('name', '150');
    16.         $this->varchar('email', '150');
    17.         $this->save();
    18.  
    19.     }
    20. }
    А имя таблицы будет имя класса в котором вы создаёте таблицу :)
    --- Добавлено ---
    Я жажду критикичё все молчат то... Что настолько всё плохо что даже писать никто не хочет?)))
     
    #11 askanim, 7 июн 2016
    Последнее редактирование: 7 июн 2016
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Да особо плохового ничего нету. Только это не ORM и не ActiveRecord. Только уязвимости - нигде ничего не экранируешь.
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Это же я не запускаю как движок... Это просто система заноса в бд... А дальше уже с этими методами будут работать я и другие разрабы... Там уже где не посредственно будут внос делать переменных... Которые несут пользовательские значения, там пусть и занимаются защитой... Уберают лишние символы всякие вредные и тд...
    --- Добавлено ---
    А что это ?
    --- Добавлено ---
    Таким же образом в yii добавляются новые таблицы...
    --- Добавлено ---
    Только у себя я ограничил, здесь таблицы будут добавляться только в дочерних классах имеющих наследовниe от createdDB
    --- Добавлено ---
    Я вроде делал следуя паттерну ActiveRecord.... Или я просто напрочь его понял не правильно...
    --- Добавлено ---
    Я могу переделать это на статические функции и реализация будет ваще 1 к 1 как в YII2 или LARAVEL 5

    Только мне кажется я сделал круче не надо ни каких артисанов... Блин и писать чёто в консоле типа php artisan там и тд... Я сделал так что просто, создаёшь класс который наследуется, вписываешь параметры таблицы, и всё. Дальше просто в браузере вкладку надо будет открыть сайт слешь /installDB и всё все таблицы созданы которые прописали...
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Паттерн ActiveRecord - это когда строка таблицы преобразуется в экземпляр класса. А у тебя постоянно туда-сюда гоняются обычные массивы. Получилось DAO, я уже писал.

    Плохая идея. Во-первых, никаких "вредных символов" из запроса убирать не надо, а во-вторых экранировать надо как можно ближе к запросу, чтобы точно всё было экранировано. Или использовать параметрические запросы.
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Мне кажется наоборот, если хакер пытается взломать и попытается, положить базу вводом, то нужно экранировать на уровне ввода... И не пропускать в код символы. Не нужные...
    --- Добавлено ---
    У меня проблема появилась в чём причина не знаю... Если есть где грубая ошибка подскажи плиз...
    PHP:
    1. public function __construct()
    2.     {
    3.         $className =  get_class($this);
    4.  
    5.  
    6.         $className = explode('\\', $className);
    7.  
    8.         $className = array_pop($className);
    9.  
    10.         echo $className.'<br>';
    11.  
    12.  
    13.         $this->tablename = $className.' (';
    14.     }
    15.  
    16.     public function save ()
    17.     {
    18.         $db = Db::getConnection();
    19.         //echo $this->sql.$this->primary.' )';
    20.         $db->query($this->sql.$this->primary.' )');
    21.  
    22.         echo 'Успех <br>';
    23.  
    24.     }
    Дальше сейчас покажу как вызываю методы...

    PHP:
    1. $Users = new User();
    2.         $Users->createUser();
    3.        
    4.         $demoTest = new demoTable();
    5.         $demoTest->create();
    Вот класс User


    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 07.06.2016
    6. * Time: 14:33
    7. */
    8.  
    9. namespace App\Database;
    10.  
    11.  
    12. use System\Db\createdDB;
    13.  
    14. class User extends createdDB
    15. {
    16.     public function __construct()
    17.     {
    18.         parent::__construct();
    19.     }
    20.  
    21.     public function createUser () {
    22.         $this->int('id', '123');
    23.         $this->varchar('name', '150');
    24.         $this->varchar('email', '150');
    25.         $this->save();
    26.  
    27.     }
    28. }
    Вот класс demoTable

    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 07.06.2016
    6. * Time: 18:02
    7. */
    8.  
    9. namespace App\Database;
    10.  
    11.  
    12. use System\Db\createdDB;
    13.  
    14. class demoTable extends createdDB
    15. {
    16.     public function __construct()
    17.     {
    18.         parent::__construct();
    19.     }
    20.     public function create () {
    21.         $this->int('id','11');
    22.         $this->varchar('var_name', '255');
    23.         $this->integer('number_group', '11', '0');
    24.         $this->integer('number_test', '11');
    25.         $this->timestamp('time_Desteny');
    26.         $this->save();
    27.     }
    28. }
    Так на экране видно так:
    User
    Успех
    demoTable
    Успех

    А добавляется всё тупо в таблицу User.... За место создания... Другой таблицы
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    https://secure.php.net/manual/ru/pdo.prepare.php
    Чтобы было безопасно, надо передавать через массив
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Основы вообще не знаешь. Нафига свою ORM пытаться нарисовать. Если все данные экранируются, то добавлять в базу данных можно любую информацию. Никаких опасных символов тогда не существует. К тому же, если не экранировать (или не использовать подготовленные запросы), то базу можно взломать вполне безобидными вещами, типа в текст ввести "I don't speak English", и апостроф от don't поломает запрос. Короче, экранировать правильно близко к запросам. Иначе грош цена библиотеки. Я в yii вообще про экранирование не думаю - просто знаю, что если я запросы строю Query Builder'ом, то Yii2 сам обеспечит безопасность.

    Перед вставкой в базу htmlspecialchars не делается, это неграмотный совет, который можно найти в нете. Вызов этой функции - только при выводе данных, которые не должны содержать html
     
    askanim нравится это.
  18. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    @askanim Вот такая поделка есть (в прикрепленном файле).
     

    Вложения:

    • 1.zip
      Размер файла:
      4,9 КБ
      Просмотров:
      2
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я знаю что нужно экранировать. Но до этого ещё пока далеко. Как до луны... У меня адекватно в базу не влетают таблицы... Я выше написал что у меня не так получается... А вообще я могу получить и на каждый экземпляр по строке... Но а смысл... Когда передоваться во view будет массив, данных, я лучше сразу и передам уже готовый массив чтобы во view его отправить. Про экронизацию знаю, я сделаю все проверки на спец символы, но сначала нужно сделать нормальное создание таблиц, и экранирование нужно делать, только на insert и update... И всё...
    --- Добавлено ---
    Я принял твоё замечание спасибо! Я сделаю экранизацию... Можешь направить на путь правильный про экранирование, как это сделать лучше... Заменить спец символы, с помощью preg_replace на пустые строки ? Или же есть специальный функции в php для экранирования строк запросов перед отправкой ? Я использовал query, для создания таблиц, и для получения данных из db, а для запросов типа UPDATE и INSERT я использую prepare
    --- Добавлено ---
    И только их в принципе и буду экранировать... Не вижу смысла экранировать данные при создании таблиц, ибо не думаю, что разработчик сам себе враг.
    --- Добавлено ---
    Как получить массив методов, только указанного класса без наследуемых методов?
    А то функция
    PHP:
    1. get_class_methods('путь к классу')
    Она возвращает тупо все методы и наследуемые тоже :(
    --- Добавлено ---
    Уже всё сделал подругому...
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А говоришь, что знаешь, как экранировать... Ты не показал, что у тебя под капотом, а так:
    https://secure.php.net/manual/ru/mysqli.real-escape-string.php
    https://secure.php.net/manual/ru/pdo.quote.php
    Ничего ниоткуда не вырезается. Эти функции перед символами добавляют слеши, чтоб показать mysql, что символы - часть строки, и не надо их воспринимать в их исходном значении


    А также подготовленные запросы:
    https://secure.php.net/manual/ru/pdo.prepare.php
    https://secure.php.net/manual/ru/mysqli.prepare.php
    --- Добавлено ---
    По твоей проблеме: кода мало. Что там у тебя за createdDB?
    --- Добавлено ---
    Смысл - потом реализовать автоматический запрос по связанным таблицам, как http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data. Это раз. А два, там могут быть другие методы в классах.
     
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Как получить массив методов, только указанного класса без наследуемых методов?
    А то функция
    Поправочка. Я знаю что нужно экранировать ! :)
    --- Добавлено ---
    Но ведь также часто требуется и получать просто массив с данными, а не одну строчку с бд...
    --- Добавлено ---
    Пока не доделал его, покажу чуть позже...
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну так посмотри мой пример кода: там вернётся массив объектов класса. Или доки по yii (или Laravel, там тот же Active Record вроде реализован)
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Да я и старался сделать похожим на лару...
    --- Добавлено ---
    Ну я тебя понял :). Я собрал DAO... Теперь надо собрать ORM :D
    --- Добавлено ---
    Лови CreatedDB
    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 07.06.2016
    6. * Time: 10:37
    7. */
    8.  
    9. namespace System\Db;
    10.  
    11.  
    12. use System\Db\Db;
    13. class createdDB
    14. {
    15.     protected $tablename; // Название таблицы
    16. //
    17.     protected $integer; // Просто числовое значение
    18.     protected $integerCount;
    19.     protected $int; //    Диапазон от -2 147 483 648 до 2 147 483 647 Если используете автоикнкремент
    20.     protected $intCount; // Кол-во символов в int
    21. //
    22.     protected $float; //Число с плавающей точкой двойной точности.
    23.     protected $double; //Дробное число, хранящееся в виде строки.
    24.     protected $boolen;
    25. //
    26.     protected $date; // Дата в формате ГГГГ-ММ-ДД
    27.     protected $timestamp; // Дата и время в формате timestamp. Однако при получении значения
    28.                           // поля оно отображается не в формате timestamp,
    29.                           // а в виде ГГГГММДДЧЧММСС, что сильно умаляет преимущества его использования в PHP
    30. //
    31.     protected $datetime; // Дата и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
    32.     protected $time; // Время в формате ЧЧ:ММ:СС
    33. //
    34. //
    35.     protected $decimal; // Дробное число, хранящееся в виде строки.
    36.     protected $char;
    37. //
    38.     // Тип данных TEXT
    39.     protected $varchar; //    Может хранить не более 255 символов.
    40.     protected $varCount; // Кол - во символов в VARCHAR
    41. //
    42.     protected $tinytext; //    Может хранить не более 255 символов.
    43.     protected $text; //    Может хранить не более 65 535 символов.
    44.     protected $mediumtext; // Может хранить не более 16 777 215 символов.
    45.     protected $longtext; // Может хранить не более 4 294 967 295 символов.
    46. //
    47.     // Бинарные данные;
    48.     // это почти то же самое, что и данные в формате TEXT, но только при поиске в них учитывается регистр символов.
    49.     protected $blob; // Может хранить не более 65 535 символов.
    50.     protected $mediumblob; // Может хранить не более 16 777 215 символов.
    51.     protected $tinyblob; //    Может хранить не более 255 символов.
    52.     protected $longblob; // Может хранить не более 4 294 967 295 символов.
    53. //
    54.     protected $primary = ''; // Указывает на уникальный ключ
    55.  
    56.     protected $null;
    57.     // BLOD-данные не перекодируются автоматически,
    58.     // если при работе с установленным соединением включена возможность перекодирования текста "на лету".
    59.  
    60.     protected $sql = 'CREATE TABLE ';
    61.  
    62.     // Функция сохранения запроса.
    63.     public function __construct()
    64.     {
    65.  
    66.         $className =  get_class($this);
    67.  
    68.  
    69.         $className = explode('\\', $className);
    70.  
    71.         $className = array_pop($className);
    72.  
    73.  
    74.  
    75.         $this->tablename = $className.' (';
    76.         $this->sql = $this->sql.$this->tablename;
    77.     }
    78.  
    79.     public function save ()
    80.     {
    81.  
    82.         $db = Db::getConnection();
    83.  
    84.         $db->query($this->sql.$this->primary.' )');
    85.  
    86.  
    87.     }
    88.     public function int($int, $count = '11') {
    89.  
    90.             $this->intCount = $count;
    91.             $this->int = $int;
    92.             $this->primary = $this->primary($int);
    93.             $this->sql = $this->sql.' '.$this->int.' INT('.$this->intCount.') NOT NULL AUTO_INCREMENT, ';
    94.  
    95.  
    96.     }
    97.     public function integer ($integer, $count = '11', $default = Null, $null = 'not null') {
    98.  
    99.         $this->integerCount = $count;
    100.         $this->integer = $integer;
    101.         if ($null == 'null') {
    102.             $this->null = $this->null(FALSE);
    103.         }
    104.         elseif ($null == 'not null') {
    105.             $this->null = $this->null(TRUE);
    106.         }
    107.         if ($default != Null) {
    108.             $default = ' DEFAULT '.$default;
    109.         }
    110.         $this->sql = $this->sql.' '.$this->integer.' INT('.$this->integerCount.') '.$this->null.$default.', ';
    111.  
    112.     }
    113.     public function varchar($name, $count = '255', $null = 'null') {
    114.  
    115.             $this->varchar = $name;
    116.             $this->varCount = $count;
    117.         if ($null == 'null') {
    118.             $this->null = $this->null(FALSE);
    119.         }
    120.         elseif ($null == 'not null') {
    121.             $this->null = $this->null(TRUE);
    122.         }
    123.             $this->sql = $this->sql.$this->varchar.' VARCHAR('.$this->varCount.') '.$this->null.', ';
    124.  
    125.  
    126.     }
    127.     public function text($name, $null = 'not null') {
    128.  
    129.             $this->text = $name;
    130.  
    131.             if ($null == 'null') {
    132.                 $this->null = $this->null(FALSE);
    133.             }
    134.             elseif ($null == 'not null') {
    135.                 $this->null = $this->null(TRUE);
    136.             }
    137.  
    138.             $this->sql = $this->sql.$this->text.' TEXT '.$this->null.', ';
    139.  
    140.     }
    141.     public function timestamp($name, $null = 'not null' ,$default = ' DEFAULT CURRENT_TIMESTAMP') {
    142.  
    143.             if ($null == 'null') {
    144.                 $this->null = $this->null(FALSE);
    145.             }
    146.             elseif ($null == 'not null') {
    147.                 $this->null = $this->null(TRUE);
    148.             }
    149.             $this->timestamp = $name;
    150.             $this->sql = $this->sql.$this->timestamp.' TIMESTAMP '.$this->null.$default.', ';
    151.  
    152.  
    153.     }
    154.  
    155.     public function primary ($val) {
    156.         $this->primary = $val;
    157.         return 'PRIMARY KEY('.$val.')';
    158.  
    159.     }
    160.     public function null ($try) {
    161.         if($try === TRUE) {
    162.             $this->null = 'NOT NULL';
    163.             return $this->null;
    164.         }
    165.         elseif ($try === FALSE) {
    166.             $this->null = 'NULL';
    167.             return $this->null;
    168.         }
    169.     }
    170.  
    171.  
    172.  
    173. }