За последние 24 часа нас посетили 19405 программистов и 1665 роботов. Сейчас ищут 1117 программистов ...

Практика использование ООП

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 26 ноя 2017.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Смотри какая ситуация там была. таблица которая отдавалась от портала, её нельзя было изменить не давал ни запрос ни phpmyadmin Он просто брал и выдавал ошибку при этом мол типа заблокированные поля и т.д! Что мы сделали мы создали свою таблицу копию со своими индексами с игорем и решили не таблицу целиком заливать, а заливать конкретно данные в уже существующую, но mysql выдал ошибку мол невозможно разные тип полей или что-то типа того уже не помню. В итоге полная попка была. А на запрос в контору портала добавить индекс на поле таблицы послали далеко в жопу.
    --- Добавлено ---
    В итоге таблицу можно было только как она есть добавлять. Я уже не помню что мы там сделали, но в результате плясов с бубнами получилось сократить время запроса почти в двое. И удалось разгрузить процессор, тоже в двое....
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    В проектах где критична производительность и большой трафик запрос клиента как правило не инициирует запросов данных из первичного хранилища вовсе. Данные отдаются из кеша, при изменении записи инициируется обновление кеша.
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    В проектах не должна быть критична производительность из-за 30-50 тысяч позиций. Простой хост без траблов и с норм кодом это обрабодает без проблем. А вот взять любую cms ет ппц чё там будет.
    --- Добавлено ---
    Программист будет играть в шарады с движком. Где cms говорит угадай - ка вот где:
    И он такой ну дава, а вот здесь: - ай бл. что это за х.ня
     
  4. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    @askanim, вы действительно считаете, что взять "любую cms" и все разработчики на столько глупее вас? Вы исключаете, что те или иные решения принимались на основе обширного опыта, в т.ч. фидбэка от пользователей этих самых cms?

    PS Вот уже какое сообщение гложет вопрос: вы читали буквари по проектированию БД?
     
  5. vaajnur

    vaajnur Новичок

    С нами с:
    15 май 2017
    Сообщения:
    40
    Симпатии:
    3
    куча кода, чтобы вытащить 1 запись из БД.

    нафиг ООП!

    пиши процедурку.
     
  6. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Если программист играет в шарады с движком, то стопудово этот программист поленился прочитать документацию. Еще ни один движок/cms не заставлял делать ни чего подобного.
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    нет говорю лишь факты. Сухие факты. Как оно есть. И если так не есть плюньте мне в глаз
     
  8. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Это не факты, это ваше субъективное мнение.
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    что ты там про доку битрикса говорил она устарела? с 2007 года. Так как в ней находить то что правильно а что нет. Кукусь привет. Сначала адекватные доки пусть напишут. Так вот из всех вминяемых cms которые я всречал был ток modx всё. Остальные все труба, пиши пропало влево вправо движок с докой говорит тебе ариведерчи.
    Так что не надо мне ёлки навязывать свои точки зрения хочется холивара по орать не тот раздел выбрал.
     
  10. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Вообще интересно даже.: вы свой дивжок будете продавать, будет он только для себя или будет распространяться свободно? Вдруг революцию совершите...
    --- Добавлено ---
    Да? А мужики то и не знали... Просто в 2007 описали функционал который появился, например, с 2015 по 2017 год... заранее..
    А на холивар сам не сворачивай. Я по той доке нормально изучил инструмент, остальное добрал по коду без всяких шарад.

    Давай таки вернемся к сути. Ты пишешь движок. Судя по тому что ты хотел на него магазин перевести, функционал таковой имеется/планируется. И там ты собираешься обойтись без джоинов?
     
  11. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    В компаниях приоритетно занимающихся разработкой на Drupal данные аналогично отдаются из SOLR, никаких сложных запросов на лету к реляционной базе данных. Тема утратила свой юмор. Ушел.
     
    #261 Zuldek, 5 дек 2017
    Последнее редактирование: 5 дек 2017
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    я не использую движки. Максимум у меня есть свой framework собственные библы и то состоят от части из других библиотек подтягивающимися композером.
    --- Добавлено ---
    А теперь просто возьми теперь свои глаза и подними на несколько постов выше и почитай, и посмотри посты выше, а то чёт ты ослеп от старости не?
    И где ты увидел в какой месте что я пишу что я собираюсь полностью обойтись без них.
    Алё я писал вот что:
    Или ты читаешь и не понимаешь что я написал?
    --- Добавлено ---
    А в чём юмор?
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А ты перечитай года через два )
     
    runcore и voral нравится это.
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Сделал небольшой класс лайков и дизлайков, всё хорошо работает, нормальный ли этот код? Наверно всё таки плохо, то, что я сделал добавление ников, в поле пользователей, которые уже проголосовали, а не айдишников?

    555.jpg

    PHP:
    1. <?php
    2.  
    3. //проверка на авторизацию.
    4.     public function loginVerification()
    5.     {
    6.         $user = $this->auth->isLoggedIn();
    7.         if(!$user) {
    8.           echo 'Авторизируйтесь';
    9.           die;
    10.        }
    11.     }
    12.  
    13.  
    14.     //проверяет, какие пользователи, уже голосовали.
    15.     public function getVoted($id)
    16.     {
    17.       $login = $this->auth->getUsername(); //достаёт логин из сессии
    18.       $res = $this->database->find('comments', $id); //достаёт все поля строки (коммента)
    19.       $allUsers = $res['logins']; //достаёт проголосовавших пользователей
    20.  
    21.       preg_match_all('#([a-zA-Z0-9а-яА-Я]+)#u', $allUsers, $matches);
    22.  
    23.       if (in_array($login, $matches[0])) {
    24.         return false;
    25.       }
    26.  
    27.       else {
    28.           return $matches;
    29.       }
    30.     }
    31.  
    32.  
    33.     //обновляет счётчик комментария, для выбранной строки.
    34.     public function updateComment($id, $currentCount, $login, $row, $allUsers)
    35.     {
    36.  
    37.         $oldUsers = implode(",", $allUsers[0]); //для того, что бы обновить строку с юзерами, а не заменить, на одного
    38.  
    39.        if($row == 'like_comment') { //для лайка
    40.             $this->database->update('comments', $id, ['like_comment' => $currentCount]);
    41.        }
    42.        else {//для дизлайка
    43.            $this->database->update('comments', $id, ['dislike_comment' => $currentCount]);
    44.        }
    45.  
    46.       $this->database->update('comments', $id, ['logins' =>  $oldUsers.','.$login.',']);
    47.      
    48.     }
    49.  
    50.     public function like()
    51.     {
    52.        $id = $_POST['id'];
    53.    
    54.       $this->loginVerification();
    55.    
    56.       $login = $this->auth->getUsername();
    57.    
    58.       if(!$this->getVoted($id)) {
    59.           echo 'Вы уже голосовали';
    60.           die;
    61.       }
    62.  
    63.       $res = $this->database->find('comments', $id);
    64.  
    65.       $currentCount = $res['like_comment'] + 1;
    66.  
    67.       $this->updateComment($id, $currentCount, $login, $row = 'like_comment', $allUsers = $this->getVoted($id));
    68.  
    69.  
    70.       echo $currentCount;
    71.  
    72.     }
    73.  
    74.     public function dislike()
    75.     {
    76.       $id = $_POST['id'];
    77.  
    78.        $this->loginVerification();
    79.    
    80.        $login = $this->auth->getUsername();
    81.    
    82.       if(!$this->getVoted($id)) {
    83.           echo 'Вы уже голосовали';
    84.           die;
    85.       }
    86.    
    87.       $res = $this->database->find('comments', $id);
    88.  
    89.       $currentCount = $res['dislike_comment'] + 1;
    90.  
    91.       $this->updateComment($id, $currentCount, $login, $row = 'dislike_comment', $allUsers = $this->getVoted($id));
    92.  
    93.       echo $currentCount;
    94.  
    95.     }
    96.    
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.580
    Симпатии:
    1.760
    @Dimon2x. не очень хорошо. первая причина - добавление ников в ту же таблицу, вторая причина - этот класс может работать только с коммантами, ты не сможешь перетащить его без изменений в проект, где тебе нужно будет лайкать ещё и статьи. Третья причина - он делает слишком много, работает с сессиями, с базами данных, ищет самостоятельно комментарии. Попробуй такой класс сделать и так организовать базу данных, чтоб можно было его подключить к лайкам чего угодно. Если не получится, я тебе расскажу, как я это делал. Но ведь самому придумать интереснее, не так ли?
    --- Добавлено ---
    Самый большой недостаток твоего хранения ников в таблице с лайками - это то, что нет нормального способа получить, к примеру, список комментов, которые лайкнул Dima. Или получить список всех комментариев, которые лайкали пользователи возрастом больше 10 лет.
     
    Dimon2x и Maputo нравится это.
  18. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    #268 Dimon2x, 2 апр 2018
    Последнее редактирование: 2 апр 2018
  19. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @Dimon2x это бот, забей )
     
  20. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  21. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Просмотр всех статей забавно выглядит. Все будет уезжать. Сделай фиксированную высоту картинки и текста
     
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @nospiou я взял готовый макет и он какой-то косячный
     
  23. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    У тебя jquery не добавлен без него в bootstrap многоe работать не будет. Сделай окно маленьким и попробуй открыть меню.
    --- Добавлено ---
    Это ckeditor такое творит? Полное описание&nbsp;o_O
     
  24. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  25. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @nospiou @mkramer @MouseZver @askanim @romach @voral @Zuldek @igordata

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

    Это полиморфизм?

    Можно ли как-то это сократить
    PHP:
    1. $pdo = new Db($host, $db, $user, $pass, (new DbPDO($host, $db, $user, '')));
    , что бы не дублировать?

    PHP:
    1. <?php
    2.  
    3.  
    4. interface DbInterface
    5. {
    6.     public function show($table);
    7.    
    8. }
    9.  
    10.  
    11. class Db
    12. {
    13.     public $host;
    14.     public $dbname;
    15.     public $user;
    16.     public $password;
    17.     public $dbdriver;
    18.    
    19.     public function __construct($host, $dbname, $user, $password, DbInterface $dbd)
    20.     {
    21.         $this->host = $host;
    22.         $this->dbname = $dbname;
    23.         $this->user = $user;
    24.         $this->password = $password;
    25.         $this->dbdriver = $dbd;
    26.     }
    27.    
    28.     public function query()
    29.     {
    30.         $this->dbdriver->show($table);
    31.     }
    32. }
    33.  
    34. class DbPDO implements DbInterface
    35. {
    36.     private $host;
    37.     private $dbname;
    38.     private $user;
    39.     private $password;
    40.     private $dsn;
    41.     private $opt = [
    42.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    43.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    44.         PDO::ATTR_EMULATE_PREPARES   => false,
    45.     ];
    46.    
    47.     public function __construct($host, $dbname, $user, $password)
    48.     {
    49.         $this->host = $host;
    50.         $this->dbname = $dbname;
    51.         $this->user = $user;
    52.         $this->password = $password;
    53.         $this->dsn = "mysql:host=$this->host;dbname=$this->dbname;charset=utf8";
    54.     }
    55.    
    56.     public function show($table)
    57.     {
    58.         $pdo = new PDO($this->dsn, $this->user, $this->password, $this->opt);
    59.         $sql = "SELECT login FROM $table";
    60.         $stmt = $pdo->query($sql);
    61.         $res = $stmt->fetchAll();
    62.         return $res;
    63.     }
    64. }
    65.  
    66. class DbMySqli implements DbInterface
    67. {
    68.     private $host;
    69.     private $dbname;
    70.     private $user;
    71.     private $password;
    72.    
    73.     public function __construct($host, $dbname, $user, $password)
    74.     {
    75.         $this->host = $host;
    76.         $this->dbname = $dbname;
    77.         $this->user = $user;
    78.         $this->password = $password;
    79.     }
    80.    
    81.     public function show($table)
    82.     {
    83.         $mysqli = new mysqli($this->host, $this->user, $this->password, $this->dbname);
    84.         $sql = "SELECT login FROM $table";
    85.         $result = $mysqli->query($sql);
    86.         $result = mysqli_fetch_all($result);
    87.         return $result;
    88.     }
    89. }
    90.  
    91. $host = 'localhost';
    92. $db   = 'oop';
    93. $user = 'root';
    94. $pass = '';
    95.  
    96. $pdo = new Db($host, $db, $user, $pass, (new DbPDO($host, $db, $user, '')));
    97.  
    98. $mySqli = new Db($host, $db, $user, $pass, (new DbMySqli($host, $db, $user, '')));
    99.  
    100. echo '<pre>';
    101.     print_r($pdo->dbdriver->show('users'));
    102. echo '</pre>';
    103.  
    104. echo '<pre>';
    105.     print_r($mySqli->dbdriver->show('users'));
    106. echo '</pre>';