Ответы пользователя по тегу Программирование
  • Как отделить логику от взаимодействия с базой данных?

    @Pantene742
    Класс для работы с БД создай в отдельном файле заполни статическими методами. и вызывай их из предыдущего класа(обьекта) только подключи файл с класом по БД в файле где класс который будет его юзать. Я какраз так пишу первый клас у меня делает запросы в youtube API, второй DBdriver он делает все что связано с БД

    DB driver собственно....

    <?php
    /**
     * Created by PhpStorm.
     * User: pantene
     * Date: 13.02.2017
     * Time: 14:15
     */
    
    namespace ytd;
    
    use \PDO;
    
    class DBdriver
    {
    
    
        private static function getConnection()
        {
    
      // Получаем параметры подключения из файла
            $paramsPath = array(
                'host' => 'localhost',
                'dbname' => 'kamios_mbet',
                'user' => 'root',
                'password' => '',
            );
    
            $params = $paramsPath;
    
            // Устанавливаем соединение
            $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
            $db = new PDO($dsn, $params['user'], $params['password']);
    
            // Задаем кодировку
            $db->exec("set names utf8");
    
            return $db;
        }   // get Connection with DataBase
    
    
    
    
        public static function Add_Video_To_DataBase($options)
        {
    
    
    
            // Соединение с БД
            $db = DBdriver::getConnection();
    
            // Текст запроса к БД
            $sql = 'INSERT INTO videos '
                . '(name, description, date, views, videos_id)'
                . 'VALUES '
                . '(:name, :description, :date, :views, :videos_id)';
    
            // Получение и возврат результатов. Используется подготовленный запрос
            $result = $db->prepare($sql);
    
    
    
            $result->bindParam(':name', $options['name'], PDO::PARAM_STR);
            $result->bindParam(':description', $options['description'], PDO::PARAM_STR);
            $result->bindParam(':date', $options['date'], PDO::PARAM_STR);
            $result->bindParam(':views', $options['views'], PDO::PARAM_INT);
            $result->bindParam(':videos_id', $options['id'], PDO::PARAM_STR);
    
            if ($result->execute()) {
                // Вертаємо ІД останнього запису
                return $db->lastInsertId();
            }
            // Вразі помилки 0
            return 0;
        }
    
    
    
        public static function clear_table(){
    
            $db = DBdriver::getConnection();
    
            $sql = 'TRUNCATE TABLE videos';
    
            $result = $db->prepare($sql);
    
            if ($about_result = $result->execute()) {
                // Если запрос выполенен успешно, возвращаем id добавленной записи
                return $about_result;
            }
            // Иначе возвращаем 0
            return 0;
    
    
        }
    
    
        public static function get_clicks_sum(){
    
            $db = DBdriver::getConnection();
    
            $sql = "SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = '_linker_count'";
    
            // echo $sql;  for debug
    
            $result = $db->query($sql);
    
            $assocArray = $result->fetchAll();
    
         //   var_dump($assocArray);    for debug
    
            $sum = 0;
    
            for ($i = 0; $i <= count($assocArray); $i++) {
    
               $sum = $sum + $assocArray[$i][meta_value];
    
    
            }
    
    
            return $sum;
    
    
        }
    
    
        public static function get_all_views_in_playlist($num_int = false) {
    
    
            $db = self::getConnection();
    
            $sql =  'SELECT `views` from `videos`';
    
            $result = $db->query($sql);
    
            $assocArray = $result->fetchAll();
    
            $sum = 0;
    
            for ($i = 0; $i <= count($assocArray); $i++) {
    
                $sum = $sum + $assocArray[$i][views];
    
    
            }
    
    
            if ($num_int) {
    
                return $sum;
    
            } else {
    
                return number_format($sum);
    
            } //else
    
    
        }   // get_all_views_in_playlist
    
    
    
        public static function get_views_in_last_30_days() {
    
    
            $db = self::getConnection();
    
            $sql =  'SELECT `views` from `videos` WHERE `date` > CURDATE() - INTERVAL 30 DAY AND CURDATE()';
    
            $result = $db->query($sql);
    
            $assocArray = $result->fetchAll();
    
    
            $sum = 0;
    
            for ($i = 0; $i <= count($assocArray); $i++) {
    
                $sum = $sum + $assocArray[$i][views];
    
    
            }
    
    
            return   number_format($sum);
    
    
    
        } // get_views_in_last_30_days
    
    
        public static function get_quantity() {
    
            $db = self::getConnection();
    
            $members=$db->query("SELECT COUNT(*) as count FROM videos")->fetchColumn();
    
    
    
            return $members;
    
        }  //  get_quantity_of_videos_in_play_list
    
    
    
    
        public static function get_average_views_per_video() {
    
    
    
                  $average = self::get_all_views_in_playlist(true) / self::get_quantity();
    
                  $average = round($average, 0);
    
                  return $average;
    
    
    
        }
    
    
    
    }


    И сам класс который его юзает...

    <?php
    /**
     * Created by PhpStorm.
     * User: pantene
     * Date: 13.02.2017
     * Time: 13:27
     */
    
    namespace ytd;
    
    use ytd\DBdriver;
    
    
    class YtData
    {
    
    //свойства
    
    public $last_number_of_array_on_the_last_pagination = 0;
    public $all_items_ids = array();
    public $array_of_full_information_about_video = array();
    public $playlist_id = "";
    
    //свойства
    
    
    
    
    
        public function add_videos_to_bd(){
    
                for ($i = 0; $i <= count($this->array_of_full_information_about_video); $i++) {
    
                    DBdriver::Add_Video_To_DataBase($this->array_of_full_information_about_video[$i]);
    
                }
    
    
            }
    
    
    
    
    
    
    
            public function get_array_of_full_information_about_video(){
    
                       //  echo "</br></br>ITEMS_IDS</br></br>";
    
                         $i = 0;
    
                         foreach ($this->all_items_ids as $key=>$value){
    
                           $this->array_of_full_information_about_video[$i] = $this->get_data_about_video_by_id($value);
    
                           $i++;
                         } //foreach
    
                return $this->array_of_full_information_about_video;
            } // METHOD   get array of full information about video
    
    
            public function get_all_items($is_page_token = false)
            {
    
    
                if ($is_page_token != false) {
    
                    $pgt = "&pageToken=" . $is_page_token;
    
                } else { $pgt = ""; }
    
    
                $request = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLbZV_PJvMcy8x0n6Bx3QsWdSABYTtM0ph&key=AIzaSyC6N_rx9GXbitgE1qTnMmDafv1lVa0Rtvk&maxResults=9&order=date".$pgt;
    
                $response = file_get_contents($request);
    
                $response = json_decode($response, true);
    
    
                for ($i = 0; $i < count($response[items]); $i++) {
    
                    $this->all_items_ids[$this->last_number_of_array_on_the_last_pagination] = $response[items][$i][snippet][resourceId][videoId];
    
                    $this->last_number_of_array_on_the_last_pagination++;
    
                } //FOR
    
    
                if (isset($response[nextPageToken])) {   $this->get_all_items($response[nextPageToken]);    }   else { return true; }
    
    
    
            }
    
    
    
        public function get_data_about_video_by_id($videoID){
    
    
            $response = file_get_contents('https://www.googleapis.com/youtube/v3/videos?id='.$videoID.'&key=AIzaSyC6N_rx9GXbitgE1qTnMmDafv1lVa0Rtvk%20&part=statistics,snippet');
    
            $response = json_decode($response, true);
    
    
    
            $data_about_video = array();
    
            $data_about_video[date] = $response[items][0][snippet][publishedAt];           // вихідний формат дати
    
            $data_about_video[date] = $this->date_in_right_order($data_about_video[date]); // получили дату роліка. Звернулися до метода, що зробить її в потрібному фоматі
    
            $data_about_video[name] = $response[items][0][snippet][title];    // получили назву роліка
    
            $data_about_video[views] =  $response[items][0][statistics][viewCount];
    
            $data_about_video[description] = $response[items][0][snippet][description];    // получили описання роліка
    
            $data_about_video[id] = $response[items][0][id];
    
    
    
    
            return $data_about_video;
    
    
        }  // METHOD - get video's data by ID
    
    
        private function date_in_right_order($date_in_false_order){
    
    
               $date_in_false_order = explode("T", $date_in_false_order);
               $date_in_false_order = explode("-",$date_in_false_order[0]);
    
               $string_data = implode("-", $date_in_false_order);
    
             //  $array_right_order = array();
    
               /*$ar = 2;
               $it = 0;
            for ($i = 1; $i <= count($date_in_false_order); $i++) {
    
                $array_right_order[$it] = $date_in_false_order[$ar];
                $ar--;
                $it++;
    
            } //for*/
    
    
         //   $string_data = implode("-", $array_right_order);
    
            return "$string_data";
    
        } //get date in right order  response date in need FORMAT
    
    }   //class YtData;


    Интерессная штука....

    Вот метод в класе драйвера БД
    private static function getConnection()
        {
    
      // Получаем параметры подключения из файла
            $paramsPath = array(
                'host' => 'localhost',
                'dbname' => 'kamios_mbet',
                'user' => 'root',
                'password' => '',
            );
    
            $params = $paramsPath;
    
            // Устанавливаем соединение
            $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
            $db = new PDO($dsn, $params['user'], $params['password']);
    
            // Задаем кодировку
            $db->exec("set names utf8");
    
            return $db;
        }   // get Connection with DataBase


    Его я вызываю в других методах этого класа вот таким кодом...

    $db = DBdriver::getConnection(); ---- и у меня уже в переменной БД интерфей для работы с PDO Mysql.

    Еще можно написать self::fetConnection(); когда один метод использует другой внутри одного класса
    Ответ написан
    1 комментарий
  • Java vs C++. Что полезнее?

    @Pantene742
    Смотря где применять ? то там и полезнее. у джавы есть большой плюс. Она практический во всех сферах задействована, и хороша для определенных задач в каждой из сфер своего применения. Например в вебэ оч круто можно применить, сервер видеочатов, онлайн кинотеатра с псевдостримингом и рекламными паузами без джавы не написать. (Node, Python, Ruby с модулями и каракулями будут такое уметь, за php молчу). Но это не повод учить джаву. Так как крупный функциональный проэкт заказывают только у фирм. А для небольшого сайтика своему другу только php + WP или Laravel. Веду к тому что для мелких задач мощный инструмент также некоректен как и не мощный для сложной задачи. Java впринцыпе умеет делать все тоже что и C++, только суть джави в том чтоб пожертвовать производительность но отвязать пользователя от работы с памятью, и API операционной системы(WIN API, POSIX). JVM как бы слой между етими сложными вещами и твоей джава программкой. Вообще джаву юзают вовсю там где ненадо производительности ее оч любят работники гугла и яндекса. Когда дело доходит до критической производительности сразу слезы на глазах и "о нет опять этот C++ глюки при зборке, опенсорсовские возможно з глюками плагины к GCC или библиотеки для конкретных могут выдать 1000 ошибок при зборке + их мощные компы иногда собирают 10 часов проэкты СПП" из за этого рабочие гугла (ребята участвующе в разработке Unix и Java еще в SUN Microsystems) которым надоел C++ создали GO для своих задач. Да C++ мощный, его сделали мощным и впихнули туда все что только можно, но пожертвовали всем. Это инструмент для крупных корпораций где над глюком будуть ломать голову минимум 10 чел. Если есть желание таки попробовать то советую под WIN API писать в Visual Studio. там оч много стандартов. и получить уникальный глюк очень сложно. и как правило есть ответы на многие глюки. как то так.
    Ответ написан
    Комментировать
  • Как работает C++/CLI?

    @Pantene742
    C++/CLI компилируеться в байт код для виртуальной машинки .net. У него узкая сфера применения на нем можно унаследовать классы с программ на C++ и собрать библиотеку в соответсвие со стандартами C++/CLI с которой можно будет наследоваться с C#. как правило наследуют в программе на C# переоформляют все еще разок. и уже с переоформленных библиотек на C# наследуються C#.net разработчики. Это называеться Wrapper (обертка) через которую программы на C# контактируют с нативными на C++/C.

    Этот язык стоит учить если ты хочешь писать эти обертки. Их в нете полно (они должны хорошо продаваться по лицензиям) Они под популярные библиотеки C++. можно сказать на 90 процентов случаев )) в сфере обработки видеоаудио. Телефонии. сети. работы с Данными БД. и всякого такого на все случаи почти.
    Ответ написан
    22 комментария