• Как оптимизировать видео для веба (из под линукс или через интернет-сервис)?

    Denormalization
    @Denormalization
    FFMPEG поможет вам. Любые манипуляции с видео+аудио. Любые доступные кодеки.

    С первой страницы гугла:
    ffmpeg -i inputfile.avi -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a libfdk_aac -b:a 96k output.mp4


    Конвертирование видео в 360p at 250kbit/s
    Ответ написан
    7 комментариев
  • Как реализовать хранение друзей в БД?

    difiso
    @difiso
    В параллельной вселенной я космонавт
    А что если хранить немного по другому?

    Например не создавать дублирующую запись в обратную сторону, а изначально использовать еще одно поле в троичной системе счисления: ± 1 когда один пользователь добавил другого (знак указывает направление заявки) и 0 когда заявка подтверждена.

    Тогда запрос будет один на выборку пары, а состояния отозвать/принять заявку и удалить из друзей будут определяться знаком числа в дополнительном поле.

    Из очевидных плюсов. Места занимать будет примерно в два раза меньше — мелочь, а приятно.
    Минусов не сразу не соображу.
    Ответ написан
    3 комментария
  • Почему бот не отправляет длинные русские сообщения?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Потому что ограничение на передачу GET 4кб, нужно отправлять через POST в теле.
    Ответ написан
    2 комментария
  • Чат на WebSocket с MYSQL бд?

    DevMan
    @DevMan
    Дописать в пример функционал сохранения в бд.
    Всегда ваш, Кэп.
    Ответ написан
    Комментировать
  • В чем отличие между двумя созданиями объекта?

    ivan_zhuck
    @ivan_zhuck
    В далеком 2010 году перед разработчиками PHP встала задача предоставить поддержку вызова методов и доступа к свойствам созданного объекта одной строкой, поскольку ранее этого делать было нельзя. Также было предложено два варианта синтаксиса new foo->bar() и (new foo())->bar(), из которых был был выбран второй и реализован в 2011 году в PHP 5.4.0. Так что это просто часть синтаксиса языка.

    Подробности: https://wiki.php.net/rfc/instance-method-call
    Ответ написан
    Комментировать
  • Почему strtotime вместо одного дня прибавляет целый месяц?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    strtotime использует стандартный формат 'Y-m-d'
    $nextDay = strtotime(date('Y-d-m', strtotime('+1 day', $startTime)));

    Здесь вы сначала получаете дату в 'Y-d-m', затем распознаёте её как 'Y-m-d'. Соответственно, день и месяц у вас меняются местами.
    Ответ написан
    Комментировать
  • Почему strtotime вместо одного дня прибавляет целый месяц?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    $nextDay = strtotime(date('Y-d-m', strtotime('+1 day', $startTime)));

    Уберите лишние телодвижения.
    $nextDay = strtotime('+1 day', $startTime);
    Внешний strtotime немного не в курсе что вы поменяли местами месяц и день.
    Ответ написан
    Комментировать
  • Как правильно развиваться в программировании?

    zolt85
    @zolt85
    Программист
    Конкретно:
    Идете на github
    Находите проект "по душе", разбираетесь в нем
    Смотрите список открытых issue по проекту, если видите что можете что-то сделать - делайте.

    Абстрактно:
    Развиваться в программировании возможно только через непрерывную практику. Чем больше будете практиковаться, тем быстрее поймете, что Вы ничего не знаете о программировании, и сие осознание будет толкать Вас на изучение новых приемов и практик. И так всю жизнь.
    Ответ написан
    Комментировать
  • Как написать регулярное выражение, которое ищет слово после определенного символа?

    @IS-Builder
    ~ PHP-8 & REGEXP - This is a really powerful kit ~
    Ответ на вопрос: ^(?:[\pL\h]+,)\h*\Kдругой,\h*.+$
    Ответ написан
    Комментировать
  • Почему classList.contains не видит класс?

    Zdomb
    @Zdomb
    web-программист
    Магия, конечно, но у classList есть замечательный метод toggle, который может помочь https://developer.mozilla.org/ru/docs/Web/API/Elem...

    Кроме того, рекомендую к своему вопросу прикладывать ссылку с кодом, например, на https://codepen.io/ или https://www.plnkr.co/
    Ответ написан
    2 комментария
  • Как сделать бота vk в последовательным?

    У тебя есть три функции
    getStart
    getEmail
    getPassword

    И просто хранишь где-нибудь ( в базе данных или памяти) , такую структуру
    {
    user_id: 123,
    next: 'getEmail'
    }


    ТО есть ты хранишь идентификатор пользователя, и функцию, которая выполнится в след сообщении. Тебе пришло сообщение - глянул в бд какую функцию вызвать - вызвал - после записал в бд следующую функцию.

    В nodejs есть библиотека, где хранится сессия пользователя
    Ответ написан
    Комментировать
  • В чем суть роутера на php?

    onqu
    @onqu
    weasy
    1. Здесь пугают всякими контроллерами, ларавелями. Давайте жить проще. Для начала дадим определение модному слову роутер. Это маршрутизатор. Что делает маршрутизатор? Правильно. Обрабатывает маршруты, являясь связующим звеном. Маршрутом для web сайта принято считать метод запроса [GET, POST, PUT и другие] и компоненты URI.

    например: https://ru.wikipedia.org/wiki/URI?foo=bar#title
    [схема: https] :// [источник: ru.wikipedia.org] [путь: /wiki/URI] [запрос: ?foo=bar] [фрагмент: #title]


    Но для определения маршрута может браться любая другая информация передаваемая серверу, определение выше это лишь наиболее употребляемые параметры.

    Сама работа, как правило проста: от клиента приходит запрос, маршрутизатор перебирает все заданные ему пути до первого совпадения. При совпадении вызывается определенная вами функция, которая возвращает ответ клиенту.

    2. Он необходим, если в приложении одна точка входа, когда любой запрос приходит на один файл.

    3. Простой пример
    // файл index.php
    
    // Маршруты
    // [маршрут => функция которая будет вызвана]
    $routes = [
        // срабатывает при вызове корня или /index.php
        '/' => 'hello',
        // срабатывает при вызове /about или /index.php/about
        '/about' => 'about',
        // динамические страницы
        '/page' => 'page'
    ];
    
    // возвращает путь запроса
    // вырезает index.php из пути
    function getRequestPath() {
        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    
        return '/' . ltrim(str_replace('index.php', '', $path), '/');
    }
    
    // наш роутер, в который передаются маршруты и запрашиваемый путь
    // возвращает функцию если маршшрут совпал с путем
    // иначе возвращает функцию notFound
    function getMethod(array $routes, $path) {
        // перебор всех маршрутов
        foreach ($routes as $route => $method) {
            // если маршрут сопадает с путем, возвращаем функцию
            if ($path === $route) {
                return $method;
            }
        }
    
        return 'notFound';
    }
    
    // функция для корня
    function hello() {
        return 'Hello, world!';
    }
    
    // функция для страницы "/about"
    function about() {
        return 'About us.';
    }
    
    // чуть более сложный пример
    // функция отобразит страницу только если
    // в запросе приходит id и этот id равен
    // 33 или 54
    // [/page?id=33]
    function page() {
    
        $pages = [
            33 => 'Сага о хомячках',
            54 => 'Мыши в тумане'
        ];
    
        if (isset($_GET['id']) && isset($pages[$_GET['id']])) {
            return $pages[$_GET['id']];
        }
    
        return notFound();
    }
    
    // метод, который отдает заголовок и содержание для маршрутов,
    // которые не существуют
    function notFound() {
        header("HTTP/1.0 404 Not Found");
    
        return 'Нет такой страницы';
    }
    
    
    // Роутер
    // получаем путь запроса
    $path = getRequestPath();
    // получаем функцию обработчик
    $method = getMethod($routes, $path);
    // отдаем данные клиенту
    echo $method();


    На практике используют более сложные маршрутизаторы, у которых гораздо большие возможности.

    4. Обойтись без него можно. Если каждая страница в вашем приложении будет являться отдельным файлом, который отвечает за отдачу информации.
    index.php
    about.php
    contact.php
    ...


    Это олдскульная структура, в новых проектах почти не применяется.
    Ответ написан
    13 комментариев
  • Почему PDO::execute не заменяет псевдопеременные в запросе?

    sHinE
    @sHinE
    веб-разработчик, php/js/mysql и сопутствующее
    Насколько помню есть замута с ипользованием плейсхолдеров в лимите, в доктрине во всяком случае.
    Попробуйте конкретно с лимитом вот так:
    $st->bindValue(":limit", $limit, ParameterType::INTEGER);
    Ответ написан
    2 комментария
  • Почему PDO::execute не заменяет псевдопеременные в запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что не выключен режим эмуляции.

    Только фактически всё наоборот: при включенном режиме эмуляции PDO как раз таки подставляет данные в запрос, и в LIMIT будет ошибка. А при выключенном данные в запрос не подставляются, и следовательно никакой ошибки не будет.

    Судя по тому, что в вопросе нет сообщения об ошибке, при соединении вообще не указывается ни один нужный параметр. Как правильно соединяться с PDO
    При указанных настройках запрос с лимитом будет работать.

    Идея с функцией query() отличная, только она не должна возвращать fetchAll(). Это все равно что добровольно отказаться от половины функциональности PDO!
    Функция должна возвращать стейтмент. Тогда ее можно будет использовать для любых запросов ,и получать данные в любых из дюжины форматов, поддерживаемых PDO, а не только в виде тупого массива.

    Соответственно, функция должна делать return $query; а код будет таким
    $sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT :startLimit , :countLimit';
    $params = ['startLimit' => $_POST['slimit'], 'countLimit' => $_POST['limit']];
    $lines = $db->query($sql, $params)->fetchAll();
    var_dump($lines);
    Ответ написан
    Комментировать
  • Вывод товаров по категориям учитывая вложенность, как сделать?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $config = array(
        'host' => 'localhost',
        'name' => 'test',
        'user' => 'root',
        'pass' => '',
    );
    
    $pdo = new \PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['name'], $config['user'], $config['pass'],
        [
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
            \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
        ]
    );
    
    $res = $pdo->query('select * from `products` order by `parent_id` asc');
    
    $cats = [];
    $structure = [];
    
    while ($row = $res->fetch()) {
        $cats[$row['id']] = $row;
        $structure[$row['parent_id']][] = $row['id'];
    }
    
    class Printer
    {
        private $cats = [];
        private $structure = [];
    
        public function __construct(array $cats, array $structure)
        {
            $this->setCats($cats);
            $this->setStructure($structure);
        }
    
        private function setCats(array $cats): void
        {
            $this->cats = $cats;
        }
    
        private function setStructure(array $structure): void
        {
            $this->structure = $structure;
        }
    
        protected function element(int $element): string
        {
            return '<a href="' . $this->cats[$element]['id'] . '">' . $this->cats[$element]['name'] . '</a>';
        }
    
        private function printElement(int $element, int $dept): string
        {
            $str = $this->element($element) . PHP_EOL;
            if (is_array($this->structure[$element]) && count($this->structure[$element]) > 0) {
                foreach ($this->structure[$element] as $id) {
                    $str .= $this->print($id, $dept + 1);
                }
            }
    
            return $str;
        }
    
        private function print(int $element, int $dept = 1): string
        {
            return '<ul><li>' . $this->printElement($element, $dept) . '</li></ul>' . PHP_EOL;
        }
    
        private function run(): string
        {
            return $this->print(current(current($this->structure)));
        }
    
        public function __toString(): string
        {
            return $this->run();
        }
    }
    
    echo(new Printer($cats, $structure));

    структура бд
    -- phpMyAdmin SQL Dump
    -- version 4.8.3
    -- https://www.phpmyadmin.net/
    --
    -- Хост: 127.0.0.1:3306
    -- Время создания: Фев 16 2019 г., 11:41
    -- Версия сервера: 8.0.12
    -- Версия PHP: 7.2.10
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    
    --
    -- База данных: `test`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `products`
    --
    
    CREATE TABLE `products` (
      `id` int(11) NOT NULL,
      `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
      `parent_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    
    --
    -- Дамп данных таблицы `products`
    --
    
    INSERT INTO `products` (`id`, `name`, `parent_id`) VALUES
    (1, 'Рыбалка', 0),
    (2, 'Удилища', 1),
    (4, 'Спининговые', 2),
    (5, 'Морские', 2),
    (6, 'Катушки', 1);
    
    --
    -- Индексы сохранённых таблиц
    --
    
    --
    -- Индексы таблицы `products`
    --
    ALTER TABLE `products`
      ADD PRIMARY KEY (`id`);
    
    --
    -- AUTO_INCREMENT для сохранённых таблиц
    --
    
    --
    -- AUTO_INCREMENT для таблицы `products`
    --
    ALTER TABLE `products`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
    COMMIT;
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    5c67cd0973e35415319613.png
    Ответ написан
    Комментировать