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

    @rPman
    На будущее, когда вариант Rsa97 не прокатит, нужно передавать объекты по ссылке
    class MyClass {
        private $array;
    
        public function __construct(&$array) {
            $this->array = &$array;
    	$this->array['123']='456';
        }
    }
    
    $array = [];
    $grid = new MyClass($array);
    print_r($array);
    Ответ написан
  • Как записать в базу пустое поле?

    @rPman
    Не надо так делать, откуда вы берете такие инструкции?
    VALUES ('.$user_id.','.$a
    пользоваться нужно prepared statements (они есть для всех драйверов, вот например mysqli), это не только исключит разные проблемы с типами (например строки придется экранировать) но и даст бонусом защиту от sql-иньекций

    Причина, почему у тебя не работает - конкатенация NULL со строкой ничего не делает (добавляет пустую строку), а нужно писать NULL либо исключить поле из sql запроса а при создании таблицы у поля написать default null
    Ответ написан
    Комментировать
  • Почему у меня неправильно определяется IP пользователя?

    @rPman
    $_SERVER['REMOTE_ADDR'] устанавливает твой веб сервер, ему вы доверяете.
    Но, если пользователь заходит через прокси сервер - то тут будет выходной ip адрес этого прокси.

    Если прокси сервер не скрывает информацию о своих клиентах то
    $_SERVER['HTTP_X_FORWARDED_FOR'] и $_SERVER['HTTP_CLIENT_IP'] должны содержать ожидаемое, но это значит нужно доверять этому прокси серверу.

    Хочешь узнать реальный ip адрес, используй javascript в браузере пользователя (т.е. придется доверять уже пользователю в плане, а отреверсит ли он твой код и не подсунет что угодно).

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

    Это не защитит от vpn, тут никакими способами определить ip адрес пользователя не получится, потому что с точки зрения сетевых технологий, vpn - это как бы проводок пользовательского компьютера подключили к vpn-серверу, и никакие коммуникации не пойдут иначе, если пользователь не укажет иного (можно настроить маршрутизацию на выход через разные шлюзы в зависимости от геолокации, кстати этим можно воспользоваться, разместив кучу своих серверов в разных локациях и, обращаясь к ним из браузера клиента, сравнивать ip адреса)
    Ответ написан
    2 комментария
  • Возможна ли sql инъекция?

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

    Чтобы воспользоваться уязвимостью нужно серьезно зарыться в исходники php или mysql и понимать как обрабатываются ими мультибайтовые кодировки.

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

    @rPman
    Если у тебя 'устаревший' http rest подход с функционалом server side only (т.е. браузер не будет требовать javascript) то лучшим решением в твоем случае будет использование фреймов. Размести каждую или эту конкретную форму в своем фрейме - тег IFRAME

    В этом случае, если нужно будет из одного фрейма по ссылкам менять адрес всей страницы, то у тега A нужно будет установить атрибут target=_top

    p.s. альтернатива, сделать единую форму, и по нажатию разных кнопок отправлять содержимое всех полей, устанавливая их значение при следующем открытии страницы. Определить, какую кнопку нажал можно по ее имени (в $_POST будет установлено значение name для той кнопки, которая была нажата).
    Ответ написан
    Комментировать
  • Как ограничить доступ к странице сайта на устройстве пк браузеров?

    @rPman
    Открывамем гугл, пишем github browser mobile detector
    получаем ссылку на почти сотню проектов, отсортированных по популярности, первый какраз на php
    Ответ написан
    Комментировать
  • Почему не записываются данные в MySQL базу данных?

    @rPman
    заверши транзакцию в конце скрипта перед close - commit
    p.s. в 2024 году использовать mysqli это моветон.

    использовать видео, да еще и такое зашакаленное и на неадекватном хостинге (как так, по пробелу паузу не делает) чтобы передать исходники это прямое издевательство над теми у кого ты просишь помощи.
    Ответ написан
    9 комментариев
  • Как скачать файл на сервер по ссылке без расширения?

    @rPman
    При переходе по указанной ссылке видео в браузере не качается, а идет переход на страницу с youtube роликом, но по 'счастливой оплошности' разработчика этого сайта идентификатор youtube ролика размещен прямо в ссылке:
    presaver.com/youtube/qU5A0MLHtyE/download/22?title=treiler2023

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

    Это значит, выделяешь из ссылки этот код (например с помощью регулярных выражений метод preg_match или с помощью комбинации parse_url выделив путь с помощью PHP_URL_PATH и explode, разбив путь по '/'), и запускаешь утилиту
    yt-dlp "https://www.youtube.com/watch?v=qU5A0MLHtyE" -f код_формата

    если запустить с ключом -F то будет выведен список доступных форматов и их кодов, при наличии ffmpeg в можно будет объединять аудио и видео потоки

    все это запускать из php с помощью `обратных ковычек` либо вот список вариантов

    p.s. yt-dlp рекомендую ставить с помощью pip, там обновляется оперативнее чем тот что ставится из репозитария ubuntu и других.
    Ответ написан
  • Как получить доступ к контенту iframe?

    @rPman
    На javascript с правами вебсайта ты этого не сможешь сделать, браузер не дает доступ к сторонним доменам в iframe, за исключением доменов-потомков (типа твой domain.ru а iframe - zzz.domain.ru, такой вариант доступ имеет), потому что там сайт открывается с куками пользователя, т.е. можно было бы открывать критичные сайты в iframe и собирать доступы к ним нахяляву.

    Доступ к iframe в браузере имеют плагины и скрипты, запущенные из консоли (плюс все что управляется из selenium).

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

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

    Но если специально никто не следит, то можно поднять на своем сервере прокси, который будет заворачивать в твой домен указанный (например сайт domain.ru в iframe - yoyo.com, а ты создаешь yoyo-com.domain.ru как копию yoyo.com и открываешь уже этот сайт в iframe, доступ будет с твоими куки (а не куки пользователя).

    Особого смысла в таком действии нет, как и нет смысла проверять, что же там открылось в iframe.
    Ответ написан
  • Как правильно лоигровать ошибки php?

    @rPman
    Не получится, синтаксические ошибки не отловить, так как они появляются до запуска скрипта на выполнение.

    Но если перед запуском приложения выполнить php с ключом -l (--syntax-check) то приложение не будет запущено а только пройдет проверка на ошибки и при наличии она будет выведена, ее можно прочитать
    exec('php --syntax-check main.php',$error_str);

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

    @rPman
    Профилировать вам нужно ваш код, и не только работу с базой данных, там как раз нагрузка была бы.
    Самое простое, чего может оказаться достаточно чтобы локализовать проблему:
    * если используется cgi способ запуска php (обычно если это fastcgi/phpfpm) то все процессы php будут видны как обычные процессы (top/atop) а подробности по каждому можно посмотреть в /proc/$pid/{environ и cmdline} будет видно какой php работает и какой там запрос
    * если используется apache module, то ставишь apachetop

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

    Конечно используй php profiler, любой на выбор, считай это продвинутый логер всего что запускается и как долго работает и сколько памяти потребляет.

    p.s. с высокой вероятностью где то в коде стоит загрузка чего-либо по сети (не обязательно http), с игнорированием ошибок, ресурс стал не доступен, вот и виснет все.
    Ответ написан
    Комментировать
  • Как выполнить POST запрос PHP и получить ответ JSON?

    @rPman
    В браузере, в консоли разработчика, вкладка network, найти свой запрос и нажать на нем правую кнопку - копировать - as curl, полученную команду вставляешь на php между тильдами $result=`curl ....`, добавив к строке -q (чтобы ничего не выводило в stdout)

    можно вручную переделать на вызов curl_init, curl_setopt.... там фактически один в один заголовки в -H а данные формы в -d
    Ответ написан
    Комментировать
  • Как сделать ссылки на запуск установленных приложениий в телефоне/планшете?

    @rPman
    Первая ссылка в интернете про это.

    Коротко - нельзя, в приложении должны быть прописаны intent android.intent.action.VIEW и android.intent.category.BROWSABLE (т.е. приложение должно разрешать себя открывать из браузера)

    Как альтернатива, выдавай ссылки на google play, если приложение установлено, там будет кнопка Открыть иначе Установить типа так market://details?id=package_name
    Ответ написан
    Комментировать
  • Как разобраться с разной кодировкой строк и сконвертировать их в utf8?

    @rPman
    Не мучайся, используй утилиту enca (есть в репозитариях любого linux), если хочется сложнее, полистай эту тему к примеру, там и в комментариях накидали идей
    Ответ написан
  • Какую команду писать в Visual Studio Code чтобы он проверял файл на ошибки командой php-cs-fixer?

    @rPman
    Готового расширения не нашел но есть пример того как такое сделать
    https://stackoverflow.com/questions/53585737/vscod...
    Ответ написан
    Комментировать
  • Какой библиотекой редактировать, заполнять шаблон pdf на php?

    @rPman
    откуда вы беретесь? кто вам дает такие упоротые задания?
    Как генерировать PDF документы из шаблонов?
    Pdf - худший формат для данной задачи.

    На php не густо библиотек по работе с pdf, они обычно ориентированы на чтение но не на редактирование. А читать документ в одном формате а генерировать из него другой промежуточный (обычно это html) это очень плохая идея.

    Настоятельно рекомендую изменить данные момент в вашем бизнес-процессе, и использовать в качестве шаблона какой-либо открытый офисный формат типа open document или по старинке html

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

    @rPman
    Благодаря добавлению почти нормальных классов и некоторой типизации, php стал вполне неплохим языком программирования.

    С точки зрения изучения алгоритмов, этого более чем достаточно.

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

    Канонически для изучения именно программирования с прицелом на работу, лучше выбирать что то из c++/java/python может c# (точнее весь .net) но с оговорками.

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

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

    java - учит строгости, даст полезную базу для изучения,.. кто то поставил бы его на первое место новичкам и не только... но после него 'опускаться' до c++ будет сложно, и больших скоростей как и у python от него не жди

    Не выбирай первым языком всякие javascript (они испортят тебя как программиста) или go/rust (от них можно получить разочарование при поиске работы).
    Ответ написан
  • Как генерировать PDF документы из шаблонов?

    @rPman
    Pdf - худший формат для данной задачи.

    На php не густо библиотек по работе с pdf, они обычно ориентированы на чтение но не на редактирование. А читать документ в одном формате а генерировать из него другой промежуточный (обычно это html) это очень плохая идея.

    Настоятельно рекомендую изменить данные момент в вашем бизнес-процессе, и использовать в качестве шаблона какой-либо открытый офисный формат типа open document или по старинке html
    Ответ написан
    Комментировать
  • Как сгенерировать изображение чека из данных?

    @rPman
    Продумай вариант генерации изображения на стороне клиента средствами браузера, т.е. штатно. Ты генерируешь html на php, а браузер отображает и по ctrl+p позволяет его пользователю распечатать...

    в довесок скопировать составляющие как текст и вообще это удобнее.
    Ответ написан
    1 комментарий
  • Почему запись в файл добавляется в конец?

    @rPman
    Для позиционирования в файле нужно пользоваться fseek а для получения ftell.

    fgets смещает указатель на следующую строку, значит fwrite будет ее затирать. Значит если у тебя была последняя строка - значит указатель будет в конце файла.

    Теперь о главном - замена строки в текстовом файле нормально будет работать только если размер этой строки совпадает с прошлой, иначе при меньшем размере новой строки в файле останется мусор от прошлой, а при большем - будут затерты следующие строки. Т.е. понадобится сдвигать содержимое всего файла после текущей позиции или полностью перезаписывать весь файл, причем если оперативной памяти хватает то это легко - загрузил построчно file, изменил нужную строку в массиве, и сохранил с помощью к примеру implode+file_put_contents или циклом по массиву и fputs.

    Именно по этой причине текстовые форматы данных не подходят для хранения нескольких записей. Допускается по одному файлу на запись, а запись это текстовая строка.

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

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