Ответы пользователя по тегу PHP
  • Как оставить в UTF-8 строке только 2х байтовые символы?

    @rPman
    Почти наверняка проблема в обработке строк в csv
    Если наверно обрабатывать все символы включая \n то логично что содержимое колонок перемещается и будет мусор

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

    @rPman
    Может сначала задачу свою озвучишь?

    Глобальная переменная закрывает возможность переиспользования кода на большее количество экземпляров объекта, т.е. завязывая свой код на глобальные переменные (или если ты спрячешь свою переменную в глобальной функции или статичной переменной) ты ограничиваешь себя в своих возможностях.

    Так же тестировать такой код сложнее, ведь если поведение класса определяется только его внутренним состоянием, это состояние проще симулировать.

    Но если логика программы даже не подразумевает подобного, то почему нет? Отличный пример - объект базы данных, если программа даже в самых жутких кошмарах не предпологает работу с несколькими базами одновременно, зачем описывать объект Database и таскать ссылку на него в каждом объекте проекта, когда глобальный его экземпляр более чем достаточен (кстати в таких случаях может хватит статики, синтаксически это удобнее).
    Ответ написан
    Комментировать
  • Многопоточность в PHP?

    @rPman
    Зачем на каждое значение из первого файла перечитывать второй?

    Речь не о языке программирования, а о архитектуре приложения. Тебе нужен индекс, некий массив, лоучше в быстрой памяти (оперативной) который бы позволил за минимальное время 'константу' или хотя бы 'логарифм' найти запись во втором файле.

    Обычный массив key-value (array в php) очень эффективно работает, в крайнем случае вместо значений можно хранить хеши (пракда проверить на случай коллизий все же рекомендуется), т.е. тебе достаточно загрузить в оперативную память второй массив, сохранив значения в ключах массива $index[$value]=0, и затем построчно загружать данные из первого файла и проверять isset($index[$value])

    p.s. если же данные в оперативную память сохранять не вариант, используй базы данных, там готовые индексы, оптимизированные на работу с диском, самое простое, начни работать с sqlite
    Ответ написан
    Комментировать
  • Как поставить условие, при невыполнении которого удаляется запись в бд через n-ое время?

    @rPman
    Попробуй переверни логику по другому:
    Не удалять 'по крону' запись, а при чтении из базы выводить только те записи, которые удовлетворяют условию - запись не старее 24h и email_status!=0
    Само же удаление производить когда-нибудь потом, время выбирать уже тебе и разово для всей базы а не для одной записи.
    Ответ написан
    9 комментариев
  • Как, используя PHP, скачать страницу с динамической подгрузкой?

    @rPman
    У тебя 2 основных способа:
    1. разобраться в том как работает этот сайт, какие http запросы отправляет, как их собирает (можно отследить в инспекторе в браузере по F12 закладка network, можно сохранить запросы в json . har файл и анализировать позже, в худшем случае придется анализировать js код) и написать свое приложение, которое будет отправлять те же самые запросы, библиотек полно, например curl, есть одноименная утилита так и поддержка в языках программирования, в т.ч. на php, кстати в инспекторе браузера, нажав правую кнопку мыши на запросе можно скопировать curl команду для его повтора.

    этот подход очень сложен, реверс инженеринг чужого приложения, особенно если там используется javascript (если нет то обычно проще), но наиболее эффективен по затратам ресурсов, и одна слабая машина может симулировать работу одновременно нескольких пользователей (десятки и даже сотни), этот подход используют когда нужно собрать данные с веб сайта, который не защищается от подобной автоматизации

    2. используя полноценный браузер, например инжектить свой javascript на его страницу с помощью расширения или вставив код прямо в консоль, или используя удаленное управление из своей программы, например selenium

    этот подход заметно проще, например javscript который будет нажимать на кнопку Подписаться на странице хабр qna:
    $('.btn_subscribe').click()
    Помимо всего, этот способ позволяет обойти большинство защит от автоматизации, так как это буквально кликать мышкой по кнопкам но главный недостаток - на каждого пользователя будет требоваться полноценный браузер (иногда можно сэкономить), что очень затратно по ресурсам
    Еще одна проблема этого способа - нет универсального способа определить момент, когда окончилась загрузка страницы, в каждом случае придется выявлять самостоятельно критерии (например появление определенного html элемента), большинство просто выставляют таймаут по больше, но если будут проблемы с интернетом или на стороне веб сервиса, этот подход даст сбой.
    Ответ написан
  • Как скрывать часть ссылки в адресной строке?

    @rPman
    На php это делают на строне сервера, обычно этим занимается сам веб сервер а не бакэнд, например к apache mod_rewrite, к nginx мод rewrite

    На javascript напрямую так делать нельзя, ведь сервер должен все равно должен понимать ссылку /coil и возвращать ту же страницу что и /a/coil но если у тебя SPA (single page application) и генерация контента происходит на стороне клиента, то почти наверняка ссылки у тебя уже будут site.com/#a/coil а значит подмену нужно будет делать прямой перезаписью в window.location.href
    Ответ написан
    2 комментария
  • Как к 00000001 прибавить 1, чтобы получить 00000002?

    @rPman
    $b=sprintf("%08d",intval($a)+1);
    граничные случаи типа число не влезает, не число, сам обработаешь
    так же аккуратно на 32-битных машинах, если у тебя там не 8 символов а к примеру 10 (int в 32-битном php при превышении 2^31 становится double)
    Ответ написан
    Комментировать
  • Как работать с другими сайтами?

    @rPman
    У тебя 2 основных способа:
    * разобраться в том как работает этот 'другой сайт', какие http запросы отправляет, как их собирает (можно отследить в инспекторе в браузере по F12 закладка network) и написать свое приложение, которое будет отправлять те же самые запросы, библиотек полно, например curl, есть одноименная утилита так и поддержка в языках программирования, в т.ч. на php
    * используя полноценный браузер, например инжектить свой javascript на его страницу с помощью расширения или вставив код прямо в консоль, или используя удаленное управление из своей программы, например selenium

    первый подход очень сложен, реверс инженеринг чужого приложения, особенно если там используется javascript (если нет то обычно проще), но наиболее эффективен по затратам ресурсов, и одна слабая машина может симулировать работу одновременно нескольких пользователей (десятки и даже сотни), этот подход используют когда нужно собрать данные с веб сайта, который не защищается от подобной автоматизации

    второй подход заметно проще, например javscript который будет нажимать на кнопку Подписаться на странице хабр qna:
    $('.btn_subscribe').click()
    Помимо всего, этот способ позволяет обойти большинство защит от автоматизации, так как это буквально кликать мышкой по кнопкам но главный недостаток - на каждого пользователя будет требоваться полноценный браузер (иногда можно сэкономить), что очень затратно по ресурсам
    Ответ написан
    Комментировать
  • Что нужно прописать в php файле, чтобы при написании php path/to/file в командной строке вызывалась по умолчанию функция index()?

    @rPman
    php path/to/file arg1 arg2
    в php:
    echo "Количество аргументов: $argc, массив арументов:";
    print_r($argv)

    $argv массив строк с аргументами, нулевая - имя файла path/to/file
    Ответ написан
    4 комментария
  • Как в yii2 создать модель формы с неизвестным количеством и типом полей?

    @rPman
    это называется модель entity-attribute-value (EAV)
    для YII погуглю за тебя, может немного устарело, но идею думаю ты уловил
    Ответ написан
  • Как отправить такой же JSON запрос методом POST?

    @rPman
    Реверсинженеринг не простой и творческий процесс.
    для начала тебе нужно определить правило, по которому формируются запросы и порядок их отправки.
    а затем, если используется http, использовать, к примеру, популярную библиотеку curl, доступную для всех платформ, например на php (идет в поставке с php - php-curl)

    p.s. примеров не будет, так как в вопросе ничего не сказано кроме нескольких несвязных скриншотов дампов запросов
    к тому же, тем кто способен провести реверсинженеринг приложения, объяснять как пользоваться curl не нужно
    Ответ написан
  • Как узнать загрузилась ли страница PHP?

    @rPman
    Александр Нестеров правильно написал
    добавлю что определить конец загрузки страницы в браузере на самом деле не так просто как кажется даже на javascript, например если используются сторонние элементы (изображения, скрипты), загружаемые не с вашего сервера (например плеер)

    в некоторых случаях можно управлять предзагрузкой самостоятельно, и надеяться на работающее кеширование в браузере, т.е. ты загружаешь изображение на javascript, и получаешь гарантию что если ты в скрипте его загрузил то значит оно точно будет загружено на странице (кстати так можно в принципе формировать содержимое страницы полностью скриптами, прописывая уже загруженное изображение создаваемым элементам)

    Официально html имеет onload атрибут на событие окончания загрузки самой html страницы, если содержимое страницы формируется на сервере то оно будет вызвано когда все элементы будут загружены. Как я уже сказал, для активного содержимого, заполняемого скриптами это не сработает.

    Поэтому в скрипте на это событие делай запрос на веб сервер (fetch или XMLHttpRequest или любую библиотеку, например jquery ajax) а уже на веб сервере сохраняй это событие где-надо, в базе или в сессии
    Ответ написан
    Комментировать
  • Как распечатать 4 массива?

    @rPman
    если размеры массивов одинаковые, то:
    foreach($arr1 as $i=>$v) echo "{$arr1[$i]}, {$arr2[$i]}, {$arr3[$i]}, {$arr4[$i]}\n";
    Ответ написан
    2 комментария
  • Как назначить варианты входящих типов в php?

    @rPman
    Почему не работает? все работает
    но осторожно в php все базовые типы могут быть строками, т.е. числа и boolean
    Ответ написан
    4 комментария
  • Как сделать задержку перед редериктом с полной загрузкой страницы?

    @rPman
    без javascript редирект делают с помощью тега meta
    <meta http-equiv="refresh" content="2;URL=https:/site.ru">


    тут 2 - количество секунд перед редиректом
    Ответ написан
    1 комментарий
  • Как преобразовать float(2.86E-6) в float(0.0000286)?

    @rPman
    Ответ написан
    Комментировать
  • Как добавить проверку дополнительного значения из базы в конструкцию if?

    @rPman
    неправильно используешь or так как php считает что ты сделал такое (цвет = красный) или (красноватое это истина), любое значение не 0 и не пусто это true поэтому Красное срабатывает

    правильно - if(in_array($apple->color,['Красное','Красноватое'])...

    еще более правильно, если html отличается только цветами или именами классов, то завести массив и подставлять только изменяющиеся значения в шаблон типа так:

    где то определяешь в константах:
    $colors=['Красное'=>'#FF0000','Красноватое'=>'#FF0000',...];

    а в коде подстановки цвета будет что то такое:
    <?php=make_color_html($colors[$apple->color]??UNKNOWN_COLOR); ?>

    либо сразу html шаблон
    <text style="color:<?php = $colors[$apple->color]??UNKNOWN_COLOR; ?>">
    Ответ написан
    1 комментарий
  • Можно ли передать POST запрос на 2 сраницы разом?

    @rPman
    либо делай 2 запроса с помощью javascript (гуглить ajax, или например штатный браузерный XMLHttpRequest) либо реализуй отправку двух post запросов со своего сервера, а с этой страницы запрос делай не на целевой сайт а на свой промежуточный
    Ответ написан
    Комментировать
  • Как реализовать на php экспорт данных вида json из SQL - в csv?

    @rPman
    Ты неправильно создаешь csv, строки в валидном csv могут содержать \n и разделитель (дублируется), используй штатную функцию fputcsv, записывающую строчку в файл (аналогично читать fgetcsv)

    Для json потоково одним проходом не получится, не зная структуры этих json для csv нужно будет два прохода: первый - определяет все возможные колонки (и если надо сохраняет значения), а второй - заполняет массив строки (для передачи fputcsv) пустыми значениями для тех колонок, значения которых отсутствуют. Чтобы порядок был верный первый проход должен сформировать массив - список названий колонок, а второй проход в цикле формирует массив пробегая по этому массиву названий колонок.

    p.s. а у тебя в json точно только один уровень? если есть вложенности на это нужно проверку делать и как то реагировать
    Ответ написан
    Комментировать