• Какой вариант из двух выбрать: передаче по ссылке, или без?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если вопрос по ссылке или без - то однозначно ответ лучше передавать не по ссылке, так как меньше шансов выстрелить себе в ногу.
    Но как написали выше, тут напрашивается рефакторинг, так как почему функция с названием checkPermissions() производит модификацию данных?
    То есть это скорее getAvailablePermissions() или filterResponsePermissions() или типа того.

    upd. Единственное что даст передача по ссылке, это экономия памяти, так как при передаче по ссылке не будут создаваться копии $permissions и $responses, но если у вас эти массивы не на сотни тысяч элементов, то экономить нечего.
    Ответ написан
    Комментировать
  • Как спарсить заголовки excel через php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Универсального решения в данном случае нету. Так как всё чем вы оперируете это ячейки, строки, столбцы.
    Тут только применять логику из разряда, а как человек определяет где начинаются заголовки и данные?
    Например что это N-подряд ячеек в строке жирным шрифтом без объединения за которым следует поток данных в таком же формате и тд.
    И на основании этого уже пишем алгоритм на РНР.
    Ответ написан
    Комментировать
  • Как передать значения двумерного массива из БД MySQL в Google Maps API для обработки GeoCoder по имени адреса?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <div id="map"></div>
    <?php
    $arr = [];
    $result = db_query("SELECT sid, name, value FROM webform WHERE name IN('form_name', 'form_city')");
    foreach ($result as $record)
    {
        $arr[$record->sid][$record->name] = $record->value;
    }
    
    $adresses = [];
    foreach($arr as $row)
    {
        $adresses[] = "{$row['form_city']}, {$row['form_name']}";
    }
    
    $js_str_address_arr = json_encode(array_values($adresses));
    ?>
        <script>
          var geocoder;
          var map;
    
    var address = <?php echo $js_str_address_arr;?>;
    
          function initMap() {
    Ответ написан
    9 комментариев
  • Как более лучше оптимизировать код для добавления товаров в избранное?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Не понятно требование для пустой $data отправлять 1, а не 0
    То есть если было одно значение в избранном и стало ноль, то посылаем 1 и при этом если было ноль и добавили первое значение то всё-равно посылаем 1?

    <?php
    function add_to_id()
    {
        if(isset($_POST['variation_id']) && !empty($_POST['variation_id']))
        {
            $value = intval($_POST['variation_id']);
        }
        elseif(isset($_POST['product_id']) && !empty($_POST['product_id']))
        {
            $value = intval($_POST['product_id']);
        }
        else
        {
            wp_send_json_error();
        }
    
        $data = [];
        if(isset($_COOKIE['wp_id']))
        {
            foreach(explode(',', $_COOKIE['wp_id']) as $val)
            {
                if(!empty($val))
                {
                    $data[$val] = $val;
                }
            }
        }
        
        //удаляем value если оно было среди значение в cookie
        if(isset($data[$value]))
        {
            unset($data[$value]);
        }
        else
        {
            $data[$value] = $value;
        }
    
        setcookie("wp_id", implode(',', $data), time() + 86400 * 30, COOKIEPATH, COOKIE_DOMAIN);
    
        //если человек кликнул - $data: 1, а при повторном клике (по той же иконке) - $data: 0
        wp_send_json_success(count($data));
    }
    Ответ написан
  • Как для callback array_udiff сделать сверку по нескольким ключам?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    function keyCompare($key1, $key2) {
            $val1 = $key1['order_id'].'|'.$key1['shop'];
            $val2 = $key2['order_id'].'|'.$key2['shop'];
            return strcasecmp($val1, $val2);
    }
    Ответ написан
    Комментировать
  • Как убедится в работе OPCache?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Посмотрите секцию Zend OPcache либо параметр opcache.enable должно быть On
    <?php
    phpinfo();


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

    То есть time(); будет выводить разный результат каждый раз, так как скрипты всё-равно исполняются.
    Подробнее можете почитать тут - https://ruhighload.com/Оптимизация+php
    Ответ написан
    Комментировать
  • Почему в БД PHPMyadmin отображаются не верные символы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если данные побились при переносе, то смена кодировки пост-фактум может не помочь.
    1. Нужно проверить содержимое дампа. Так как может быть проблема в том как сохранены данные там.
    2. Перезалить дамп по новой

    Если у вас, предположим таблица была в latin или cp1251 в старой базе, вы сделали дамп. Он тоже в latin. Заливаете в новую базу которая настроена на utf8, то корректно дамп не зальётся никогда.

    Не хватает информации по исходным данным. Но для случая если данные были в 1251 и сейчас хотим utf8 то содержимое дампа можно переконвертить через iconv или enconv
    Ответ написан
    Комментировать
  • SQL возвращает null при left join?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    WHERE `refererJoin`.`id` IS NOT NULL
    Ответ написан
    3 комментария
  • Как получить сообщение в ТГ api?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте метод getUpdates()

    В документации это указано, кстати https://github.com/TelegramBot/Api#api-wrapper-1
    You can use method getUpdates() and all incoming messages will be automatically tracked as Message-event
    Ответ написан
    Комментировать
  • Как проверить наличие файла с кодировкой cp1251?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    file_exists(iconv("utf-8", "cp1251", $filename))
    Ответ написан
    Комментировать
  • Почему html_entity_decode преобразовывает не все HTML-сущности?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Потому что этих сущностей нет в таблице кодирования/декодирования
    Посмотреть эту таблицу можно так
    <?php
    var_dump(get_html_translation_table(HTML_ENTITIES));


    https://www.php.net/manual/ru/function.get-html-tr...
    так же можно поиграться в параметром $flags, который может повлиять на кодирование &quot; например
    Ответ написан
    1 комментарий
  • Как найти картинку в папке по совпадению слова из файла и названию картинки?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    //список файлов который получен любым из способов, напр. scandir()
    $files_list = [
        'Яблоко.png',
        'Апельсин.png',
        'Арбуз.png',
        'мандариН.png',
    ];
    
    foreach($files_list as $file_name)
    {
        if(preg_match('!(Сочный|китайский|апельсин|мандарин)!usi', $file_name, $out))
        {
            echo "Found: {$out[1]} in {$file_name}\n";
        }
    }
    
    //Found: Апельсин in Апельсин.png
    //Found: мандариН in мандариН.png
    Ответ написан
  • Как более правильнее сохранять id в куках?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. Шифровние имеет смысл если вы не хотите чтобы значение cookie могли подменить или подсмотреть. Для этого можно использовать https://www.php.net/openssl_encrypt или любую обёртку из гугла по запросу "PHP encrypt lib"
    2. Хранить в виде строки. Учтите что максимальный размер данных для cookie обычно 4Кб (строка длиной 4тыс символов). Самый компактный вариант - строка с числами через разделитель. $id = "1,2,3,4,5"; или $id = "1|2|3|4|5";

    - При шифровании длина строки будет выше чем исходная.
    - Для удобства можно использовать json_encode(), это пригодится если с cookie так же надо будет работать через JS.

    p.s. если предполагается хранить очень много id на клиенте, то предпочтительнее использовать localstorage который поддерживается всеми современными браузерами и не лимитирован 4кб https://caniuse.com/#search=localstorage
    Ответ написан
  • При работе с preg_replace, не выходит элемент который я хочу вытащить из строки, в чём может быть проблема?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    На вид всё нормально, код рабочий и выводит то что ожидается
    https://3v4l.org/X3JQA

    Думаю проблема в том что результаты работы кода смотрите в браузере, и там <id> обрабатываются как html-тег и поэтому их не видно.
    Для того чтобы убедиться в этом можно открыть исходный код страницы (Ctrl+U) и увидеть есть ли там <id> на самом деле
    Ответ написан
    Комментировать
  • Как добавить свою дату в mysql?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Я так понимаю надо создать новую запись либо обновить дату если запись существует?
    INSERT INTO `oc_product` 
    SET `product_id` = '100014', date_available = '2000-01-02' 
    ON DUPLICATE KEY UPDATE
    `date_available` = '2000-01-02'
    Ответ написан
    Комментировать
  • Как найти ближайшие верхние число в двумерном массиве?

    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 просмотренных постов каждым пользователем, что уже не такие большие числа.
    Ответ написан