• Как найти ближайшие верхние число в двумерном массиве?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    $mass = array(array(14.49),array(17.40),array(12.30),array(19.22));
    $number = 16.20;
    foreach ($mass as $val) {
        if($val[0] > $number) {
            echo $val[0];
            break;
        }
    }
    Ответ написан
  • Как regex-ом выделить слово которое идёт после указанного?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    preg_replace("/(myname|word1)([^-\w]*(\S+))/", "$1***", $text);


    $n - указывает на номер группы из search выражения
    $1 - (myname|word1)
    $2 - ([^-\w]*(\S+))
    Ответ написан
    Комментировать
  • Как преобразовать обычную строку в текст MySQL?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Вариант без placeholder'ов, если $ids массив из INT'ов то можно прогнать каждый элемент через intval() чтобы исключить любого рода инъекции и напрямую подставить в запрос

    $ids = array_map('intval', $ids);
    return $this->db->row("SELECT * FROM cources WHERE id IN (".join(',', $ids).")");
    Ответ написан
    Комментировать
  • Как переслать сообщение в беседу?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте messages.send и параметр forward_messages которым можно задать пересылаемые сообщения
    https://vk.com/dev/messages.send
    Ответ написан
    9 комментариев
  • Как скрыть просмотренные посты?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Нет никакой волшебной пули. Если есть такая задача, то только хранить списки просмотренных постов по каждому пользователю вида user_id, post_id
    И при построении ленты соотв-но исключать из выборки то что "не нужно" или через JOIN или через подзапрос вида NOT IN (...)
    В данном случае грамотные индексы и наличие достаточного кол-ва RAM на сервер должны решать большинство проблем производительности.
    Так же, возможно, сейчас разговор о преждевременной оптимизации, так как действительно ли будут сотни тысяч постов которые просмотрит один пользователь? Ведь это колоссальный объём который кто-то ещё должен запостить.
    Как вариант оптимизации, на будущее, можно историю "просмотренных постов" подчищать, удаляя там записи старее такой-то даты или чистить по кол-ву.
    То есть хранить историю просмотров "за месяц" или хранить последние 1000-10000 просмотренных постов каждым пользователем, что уже не такие большие числа.
    Ответ написан
  • Class 'ImageSplitter\ImageSplitter' not found in Laravel6?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Проблема в том что класса нет в autoload списке.
    Быстрое решение - удалить папку /vendor/ полностью и запустить composer install

    upd. похоже проблемы с самой библиотекой или с содержимым её composer.json так как у меня аналогично не получилось установить и заставить работать. Судя по симптомам "class not found" или что-то с путями или неймингом классов. Глубоко ковыряться не стал.
    Можете создать issue на гитхабе, чтобы автор библиотеки посмотрел.
    Ответ написан
  • Как проскролить страницу или загрузить больше данных на сайте?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Можете использовать эту библиотеку https://github.com/postaddictme/instagram-php-scraper
    Под копотом парсинг веб-версии инстаграма.
    Получение списка постов аккаунта может делать без авторизации, и функция листания страниц присутствует
    Так же может понадобится прокси для смены ip, так как если парсить данные будете часто и активно то блок по ip гарантирован.

    Пример получения списка фото по username
    https://github.com/postaddictme/instagram-php-scra...
    Ответ написан
    1 комментарий
  • Как убрать дубли страниц в выдаче поисковика?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Всё зависит от технической части, движка, фреймворка.
    В простейшем случае текущий URL без домена и протокола находится в переменной $_SERVER['REQUEST_URI']

    Для https://sayt.ru/catalog/1/page=2/
    $_SERVER['REQUEST_URI'] = '/catalog/1/page=2/ ';

    Для https://sayt.ru/catalog/1/order=named/page=2/
    $_SERVER['REQUEST_URI'] = '/catalog/1/order=named/page=2/ ';


    То есть вашу проблему можно решить следующим образом: если мы видим в урл схему /catalog/ID/ то на основании этого формируем корректный канонический url.
    Сделать это можно, например регулярным выражением.
    Предполагается что в $rel_canonical мы получаем корректный url который далее вы выводите на странице.

    <?php
    $rel_canonical = '';
    if(preg_match('!^/catalog/([0-9]+)!si', $_SERVER['REQUEST_URI'], $out))
    {
        $rel_canonical = "https://sayt.ru/catalog/{$out[1]}/";
    }
    
    //$rel_canonical выводим на странице
    Ответ написан
    1 комментарий
  • Какие должны быть значение параметров для Авторизации OK?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. state - любое значение, это доп. механизм для защиты oauth
    2. grant_type - authorization_code
    3. чтобы получить email нужно явно запросить доступ к нему через scope=GET_EMAIL https://apiok.ru/en/ext/oauth/permissions
    Ответ написан
  • Как авторизовать аккаунт вк, через стороннее приложение API?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    код от vodka2 вполне рабочий
    конкретно про запросы к гуглу там есть пример
    https://github.com/vodka2/vk-audio-token/blob/d586...

    Ну и auth.refreshToken и запросы к гуглу не нужны для всех методов, только для некоторых, например для работы с аудио.
    Ответ написан
    1 комментарий
  • Как посмотреть, куда сайт переадресовывает, если переадресация на JS?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если нужно автоматизировать тогда можно использовать "Headless Chrome" или устаревший PhantomJS.
    Вы сами сможете задать нужные HTTP-заголовки запроса, если например, нужно сэмулировать моб. клиент.
    При этом так как это по сути движок браузера, он может исполнять JS, и даст информацию куда в итоге сделан редирект, будь-то http-редирект, js-редирект или даже редирект через <meta http-equiv="refresh"

    Подробнее по теме: https://habr.com/ru/company/oleg-bunin/blog/421137/
    Биндинг на PHP (сыроватый): https://github.com/chrome-php/headless-chromium-php
    Ответ написан
    Комментировать
  • Как поправить ссылку при отправке?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Ещё один вариант

    //убираем справа любое кол-во слешей если они есть и добавляем свой обязательный слеш
    $url = rtrim($url, '/').'/';
    Ответ написан
    Комментировать
  • Как можно разбить контент страницы на заголовки и содержимое?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Пример, как регуляркой вытащить содержимое всех h* тегов
    Но чтобы вытащить content, нужно уже смотреть на структуру страницы: где относительно заголовков расположен контент и тд. Это легко в случае если мы работаем с конкретным сайтом, то есть пишется код под сайт, и сложно если нужно некий универсальный парсер любых сайтов.

    <?php
    $html = file_get_contents('https://toster.ru');
    
    $headers = [];
    for($h = 1; $h <= 6; $h++)
    {
        preg_match_all('!<h'.$h.'.*?>(.*?)</h'.$h.'!usi', $html, $out);
        if(isset($out[1]) && !empty($out[1]))
        {
            $headers["H".$h] = array_map('trim', $out[1]);
        }
    }
    
    print_r($headers);
    Ответ написан
  • Как запретить запуск php скрипта повторно?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    По идее этот код надо вставить в начало скрипта, сразу после <?php, а делее уже ваш код классы и тд.
    Удалять файл не нужно, так как блокировка сама снимется когда скрипт закончит работу, и блокировка будет активна пока скрипт в работе.

    <?php
    
    $lock = fopen(__DIR__ . '/lock_start.lock', 'w');
            if (!($lock && flock($lock, LOCK_EX))) {
                exit('already running');
            }
    
    //далее ваш код
    Ответ написан
    Комментировать
  • Как правильно вывести данные из масиива?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $last_view = $model -> query("SELECT * FROM `w3m_404urls` WHERE `views` >= 3");
    while($row = $last_view->fetch_assoc())
    {
        echo "<tr>
            <td>{$row['id']}</td>
            <td>{$row['url']}</td>
            <td>{$row['date']}</td>
            <td>{$row['view']}</td>
        </tr>";
    }
    Ответ написан
    Комментировать
  • Почему не работает file_get_contents?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Возможно сайт смотрит на наличие определённых HTTP-заголовков, например, чтобы был не пустой user-agent или какие-то другие заголовки.
    Чтобы их задать не обязательно нужен curl (но рекомендую его), можно и для file_get_contents это сделать.
    Пример ниже задаём Accept-language и User-Agent

    $options = array(
      'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-Language: en-US,en;q=0.9,ru;q=0.8\r\n".
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.50 Safari/537.36 OPR/65.0.3467.16 (Edition beta)\r\n"
      )
    );
    
    $context = stream_context_create($options);
    $String = file_get_contents($url, false, $context);
    Ответ написан
    Комментировать
  • Как решить проблему с пагинацией, если следующая страница это JS код вместо ссылки?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    &curPage=XXX

    например, выдаст 5ю страницу
    https://www.qoo10.sg/s/EYELASH?keyword=eyelash&keyword_auto_change=&curPage=5
    Ответ написан
    Комментировать
  • Как правильно хранить мультиязычный контент?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если предполагается что для каждого языка одинаковый список категорий и статей, то лучше второй вариант.
    Причём содержимое статьи для любого языка лучше отделить от самой обёртки статьи.
    То есть 2 таблицы
    1. article - только общая информация, которая повторяется для каждой статьи, и никакой "общей версии" не содержит.
    2. article_data - содержимое статьи на определённом языке.

    Нет смысла хранить внутри статьи "общую версию" текста, так как это только усложнит логику кода лишними проверками, что есть стандартный заголовок на англ языке, он лежит в самой статье, а заголовок на другом языке лежит отдельно. Или при редактировании опять надо будет проверять что стандартный язык в статью, а если доп. язык то отдельно - это опять же усложнение.
    При полном разделении статей и содержимого можно будет легко менять "стандартный" язык, вдруг завтра это будет не англ, а какой-то другой? И логика кода будет чище и проще так как работать будем с понятием "содержимое на таком-то языке" и не важно какой язык стандартный и тд.
    Ответ написан
    1 комментарий
  • Как блокировать создание процессов демонов в php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Можно запретить php-cli, так как обычно демоны это запущенный через php-cli скрипт отвязанный от родителя.
    Так же для демонизации используются обычно pcntl-функции (для создания fork'a и тд) и если можно то запрещать нужно именно их.
    Ответ написан
    1 комментарий
  • Почему не добавляются записи в БД?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Ну для дебага наживую, чтобы увидеть ошибку SQL такой вариант

    if(mysqli_query($connection, $add)) {
      echo "Добавлено";
    } else {
      var_dump(mysqli_error($connection));
      exit;
    }


    Судя по картинке, ошибка будет в том что в таблице в бд есть поле text, а в запросе передаётся description которого нет в таблице.
    Ответ написан
    Комментировать