Ответы пользователя по тегу PHP
  • Exec (или ffmpeg) игнорирует get параметр. Как заставить его увидеть?

    @rPman
    Из консоли у меня всё работает, НО там тоже была загвоздка с ссылкой и её пришлось указывать в двойных кавычках (одинарные не принял)

    так поставь их:
    exec("ffmpeg.exe -rtsp_transport tcp -i \"$url\" -c copy -map 0 -t 10 out2.mkv 2>&1", $output, $return_var);
    Ответ написан
    Комментировать
  • Где в сети можно найти php коды для отладки?

    @rPman
    Правильное создание забагованного кода это отличный способ обучаться.

    Задавайся вопросом, как ведет себя та или иная функция когда на вход подаются неправильный данные. Пустые, не того типа, слишком большие, закрытые дескрипторы, писать в заблокированные файлы, проблемы с сетью в той или иной функции типа работы с базами данных или ожидании post данных от пользователя и т.п.
    Ответ написан
    Комментировать
  • Как авторизоваться на сервисе проверки чеков?

    @rPman
    у них какая то проблема с сертификатом
    vxh5ejgygibsv896odmn5lk7yn0.png
    Ответ написан
    Комментировать
  • Как в строке найти любой первый непечатный символ средствами php?

    @rPman
    preg_replace (или если надо utf8 к примеру то mb_ereg_replace )
    примерно так
    preg_replace('/[^a-z0-9\n\r ,\.]/','',$str)

    в регулярке указываешь списком символы, которые надо оставить, символ ^ переворачивает список на 'все кроме указанных'
    Ответ написан
  • Как распарсить такие данные?

    @rPman
    в php готовых инструментов нет, может отдельно кто писал

    parse_ini_str мог бы разобрать такое но без поддержки массива item[x] так же нет поддержки вложенных полей xxx.yyy.zzz

    так что ручками в цикле, построчно, либо регуляркой либо preg_split выделяешь сначала =, затем все что между . и в цикле набираешь поля в объекты
    Ответ написан
  • Почему не выполняется пользовательская функция?

    @rPman
    Попробуй ccxt там поддержка больше сотни бирж (криптовалютных) в частности для твоего binance поддержка торговли спот точно поддерживалась, несколько месяцев назад когда я смотрел, фьючи глючили (еще не обновили поддержку в библиотеке и я пользовался nodejs от jaggedsoft либой).
    Ответ написан
  • Почему происходит такое с WebSocket?

    @rPman
    Можно ли как-то это поправить? Или есть альтернатива может?

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

    @rPman
    Классический алгоритм обхода дерева по линейному списку - рекурсивный.
    твой метод должен искать элементы в списке, у которых parent_id указанный в параметрах вызова, возвращает метод html код отрисовки найденных элементов (кстати что возвращать так же зависит от того, как именно ты собираешься рисовать дерево, есть два подхода, рекурсивный и линейный с отступами)

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

    Если нужно сгенерровать дерево без не раскрытых ветвей, то где то надо хранить какая ветвь выбрана (раскрыта) и пропускать генерацию вывода для не раскрытых.

    Часто генерируют все дерево но для не раскрытых веток указывают стиль - display:none, меняя его при перемещении пользователя по дереву.
    Ответ написан
    Комментировать
  • Как посчитать символы после точки и до единицы?

    @rPman
    Задача - подсчет значимы цифр после десятичной запятой в строковм представлении.
    Интересно, у меня впереди маячит решение этой маленькой задачи, но только максимально эффективно на c++ ибо данных много.

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

    p.s. осторожно, данный алгоритм на php может оказаться медленнее других, менее адекватных с первого взгляда.

    Например, в цикле делишь на pow(10,x) берешь intval и снова умножаешь на этот же pow, начиная с максимально большого значения x (для double это где то 15, для криптовалютных бирж тебе скорее всего нужно 8 или 9) и уменьшаешь его до тех пор, пока полученное значение не станет не равно изначальному. Очень может оказаться что деление в php сравнимо по скорости работы со строками
    Ответ написан
    Комментировать
  • Как объединить два файла на php?

    @rPman
    Окей, буду умничать, если нужно объединить файлы именно на php (лимит памяти, нельзя вызывать сторонние утилиты shell_exec и т.п.) то делать это придется по частям.

    Читаем от файла сколько то килобайт в память, пишем столько же в результирующий, снова читаем кусочек... потом повторяем со вторым.

    fopen
    fread
    fwrite
    fclose

    больше работы с отслеживанием граничных ситуаций (пустые или отсутствующие файлы или нехватка места)
    Ответ написан
    5 комментариев
  • Как сделать сопоставление данных?

    @rPman
    Все данные у тебя уже агрегированные и не подходящие для работы и сравнения (точнее любые инструменты без семантики будут выдавать ошибки)

    Попробуй найти нормальную базу лекарственных средств, с наименованиями производителями и прочим, а уже на ее основе анализируй строчку

    https://esklp.egisz.rosminzdrav.ru/esklp?smnn_date...
    https://portal.eaeunion.org/ru-ru/_layouts/15/Cit....
    и т.п. это первое что гугл выдал
    Ответ написан
    2 комментария
  • Как сделать множественный поиск по БД?

    @rPman
    Подавляющее большинство реализуют подобную задачу именно так, в лоб, теряя полезную информацию о типах данных, объединяя их в текстовую строку.

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

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

    Это сложнее, но в особых сложных случаях это может быть оправдано.

    Полнотекстовый можно проапгрейдить до поддержки подобных случаев, расширяя текстовую строку, по которой идет поиск всеми вариантами поисковых запросов, но это повышение затрат ресурсов, причем заметное но главное, не позволяет лучше ранжировать результаты.
    Ответ написан
    Комментировать
  • Как узнать наличие IP в листе?

    @rPman
    $query2 = $db->prepare("SELECT count(*) FROM accounts WHERE userName LIKE :userName");
    ...
     if ($regusrs > 0) {
        echo "-2";
    этот кусок кода проверяет, есть ли пользователь с таким именем, и если есть, выдает 'ошибку' -2 (кстати почему бы и не 42?), т.е. добавь в sql запрос проверку на ip (храни их тоже в базе) и проверяй по нему.

    Приведенный код отвратителен. Почему методы exploitPatch для проверки данных пользователя называются remove? я правильно понимаю ты удаляешь из емейла, логина и пароля пользователя опасные символы, и с полученными строками их регистрируешь? А потом, когда ты поменяешь эту логику, пользователи с паролями с " начнут обламываться

    Обычно методы проверки называют validate и они должны проверять валидность и возвращать boolean разрешено/запрещено
    Ответ написан
    2 комментария
  • Не поддерживает русский язык, формат xls?

    @rPman
    Во первых, ты создаешь html а не excel, да офис умеет открывать такие файлы и даже не ругается, но если хочешь работать с документами напрямую, работай с .xlsx или .ods (open document стандарт поддерживается везде и всеми, это стандарт для документооборота, пользуйся лучше им) - это по факту архив с текстовыми xml документами

    По факту, настрой кодировку, с которой ты будешь общаться с базой данных set_charset либо поменяй свою кодировку в php коде на ту же что выдает база данных (utf-8) и пропиши в твоем html в в заголовке
    Ответ написан
    Комментировать
  • Рефакторинг кода. Как оптимизировать количество if?

    @rPman
    Вместо if в таких случаях используют switch case.

    Альтернатива - определи map с ключом твои сравниваемые значения и значением делегат Func или экземпляр класса с виртуальным методом. Но что бы ты не делал, синтаксически это не добавит тебе простоты, а просто переместит в другое место определение кода и сравниваемое значение.

    Есть еще препроцессор #if или даже собственный кодогенератор, иногда оно оправдано.

    Городить что то сложнее switch нужно, когда логика, стоящая внутри кода около каждого из вариантов значения, может быть свернута в общий единый код или наоборот, он весь сводится к коротким инструкциям,красиво смотрящимся в виде анонимных функций, которые неплохо смотрятся в виде констант иннициализатора map
    Ответ написан
    Комментировать
  • Что произойдет, если крон запускать каждую минуту но скрипт не успеет выполниться?

    @rPman
    Не пользуйся крон, это худший способ запуска кода 'как можно чаще'.

    Правильно - создать скрип с бесконечным циклом запуска нужного кода, там и паузу можно гибко подстраивать и встроенная гарантия от одновременного запуска.

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

    @rPman
    В вопросе сказано 'автоподключение', это значит в коде нет желания писать где то connect или аналогичную ему строку иннициализации.

    Если хранить объект подключения в нестатичных полях класса, то код создания экземпляра объекта и будет этой строкой подключения.

    И вот тут возникает вопрос о месте хранения настроек. Если для всего проекта предполагается одна база данных с одним одномоментным подключением, то значит настройки должны храниться глобально (в подавляющем большинстве случаев это отдельный подключаемый файл config.php с инициализацией констант в define) либо в конфигурационном файле, десериализаторов которых пруд пруди, используй хоть .ini (parse_ini_file) хоть .json хоть что угодно.

    Я пользовался разок определением констант в виде статичных мемберов класса, подключаемых прямо внутри определения класса с помощью include (синтаксически это красивее define и не требует городить громоздкие уникальные имена)

    Так же возможна ситуация, когда вообще нет глобального объекта для работы с базой данных, точнее когда этот объект никто не удерживает кроме 'его самого', а доступ к нему организован через функцию, например:
    function db()
    {
      static $db=false;
      // до появления static у функций можно было хранить и запрашивать объект у самого класса статичным методом
      if(!$db) $db=new Database();
      return $db;
    }
    
    ....
    
    db()->query(...)
    в этом случае подключение к базе будет сделано в момент первого доступа к ней, что иногда даже полезно
    Ответ написан
    Комментировать
  • Как в php определить кодировку строки?

    @rPman
    Кодировку не нужно угадывать
    Ее нужно брать из заголовков (добавь к curl опцию -D имя_файла, куда будут помещены все заголовки запроса)
    Content-Type: text/html; charset=UTF-8

    и что лучше, из тега
    <meta charset="utf-8">

    p.s. чтобы угадать кодировку, пользуйся консольной утилитой enca, очень мощная вещь, угадывает множественные перекодирования, когда создатель накосячил (например открыть cp1251 в far в koi8 кодировке и скопировать через содержимое экрана)
    Ответ написан
    Комментировать
  • Конвертация криптовалютой, как реализовать?

    @rPman
    Все на так просто как кажется!

    Первое, так как экономика у нас в мире все еще фиатная, то платежи в криптовалюте должны восприниматься просто как еще одна платежная система.

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

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

    Поэтому - выбираешь биржу/банк, где у тебя будут храниться твои фиатные резервы, соответственно брать котировки нужно именно у этой биржи (а везде они разные). Брать нужно не тикер, а стакан depth (список bid/ask лимитных ордеров клиентов биржи) и из него вычислять, в зависимости от объема сделки! по какой цене исполнятся ордера на покупку вашей криптовалюты (bids), минус комиссия за сделку, получишь нужную цену. Это сделки - по маркету. Повторяю - в зависимости от объема сделки, стоимость криптовалюты - разная, чем выше объем тем больше спред между купи продай. Ты можешь разработать торговый алгоритм, который, изучая текущее поведение рынка, совершать сделки покупки и продажи не по маркету (так как сделки по маркету при крупных сделках - заметно дороже, да и при мелких по факту удваивает/утраивает комиссию совершения сделок) но создание надежного такого алгоритма уже вопрос на миллион (и если ты такой создашь, то ты уже сможешь зарабатывать как трейдер, извлекая доход из спреда и волатильности, зачем тебе тогда магазин?).

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

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

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

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

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