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

    Acuna
    @Acuna
    Заполнил свой профиль
    Я пользуюсь PHPMailer, она умеет получать почту с Гугла по IMAP и POP3, html тоже возвращает, но насчет сортировки не знаю, ибо на сервере мне это не нужно. Только стесняюсь спросить, вам на сервере нужно письма сортировать, или на десктопе? Если последнее - то очень рекомендую почтовый клиент The Bat!, я им как раз и пользуюсь для автоматической сортировки всех новых и старых писем по папкам, настроил кучу правил для каждого ящика в зависимости от того, что мне нужно.
    Ответ написан
  • Как исправить ошибку в open server pg_connect?

    Acuna
    @Acuna
    Заполнил свой профиль
    По дефолту в OpenServer для PostgreSQL добавлено только PDO, поэтому расскоментируйте еще

    extension = pgsql

    в php.ini
    Ответ написан
  • Зачем нужны абстрактные классы и интерфейсы в php?

    Acuna
    @Acuna
    Заполнил свой профиль
    Если совсем на пальцах для гарантированного понимания на наглядном примере: мы проектируем класс для работы с БД. Он должен работать с разными типами БД (MySQL, PostgreSQL, и т. д.). Каждый тип, с которым он может работать, мы реализовываем в виде отдельного класса (что в дальнейшем позволит просто добавлять к нашему проекту новые классы, не переписывая основной класс). Благодаря этому можно создавать другие классы на основе нашего абстрактного основного класса, не боясь, что необходимые для работы методы не будут определены (так как абстрактные методы обязаны быть переопределены при расширении функционала этого класса базовым абстрактным классом), что позволит предотвратить ситуации когда либо сам разраб забыл переопределить нужный для работы нашего расширения метод, либо другие программеры забыли/забили на это при создании своих расширений для этого класса, а тут компилятор скажет, мол, ты расширяешь свой класс базовым классом, это хорошо и правильно, но переопредели плиз эти абстрактные методы, ибо в них вообще вся суть расширения. Надеюсь хотя-бы это объяснение прольет свет. Штука крайне удобная, одна из самых удобных и нужных вещей в PHP и вообще во всех нормальных языках.
    Ответ написан
  • Как полностью выключить вывод ошибок в PHP?

    Acuna
    @Acuna
    Заполнил свой профиль
    Я бы не рекомендовал затыкать вывод ошибок полностью, это bad practice. Пишу на PHP уже лет 10, и только недавно установил уровень E_ALL, исправление всех ошибок заняло где-то неделю, но сейчас я нарадоваться не могу, ибо ругается даже на отсутствие ключей в массиве (ибо в большинстве случаев если обращаются к какому-либо ключу, он должен быть в массиве, а его отсутствие - следствие какой-то проблемы). Об отсутствии какой-либо переменной я и вовсе не говорю. Для юзера достаточно просто подавить вывод ошибок (ибо сайт не будет работать только при E_FATAL и E_COMPILE, когда вообще не получается получить байткод), а для разрабов ошибки можно писать хоть в текстовый файл, используя собственный обработчик set_error_handler ().
    Ответ написан
  • Что если несколько пользователей одновременно обратятся к скрипту?

    Acuna
    @Acuna
    Заполнил свой профиль
    Так ведь скрипт - это тот же index.php, то есть сам сайт по сути) Если уж совсем на пальцах, то сервер - это папка, где хранятся файлы, а браузер просматривает эти файлы (это и есть HTTP), что произойдет если миллион человек запросят файл index.php? Сервер им его отдаст, ибо это просто его просмотр. Это не многозадачность, это просто обращение к файлу. Другой вопрос если этот скрипт что-то пишет в другой текстовый файл (не в БД, БД это как раз многозадачность), то там будут возникать блокировки и вообще что угодно, вплоть до его повреждения. Но это уже из другой области вопрос, а вы про HTTP спрашиваете.
    Ответ написан
  • Почему в js и в php по-разному сравнивают переменные?

    Acuna
    @Acuna
    Заполнил свой профиль
    На самом деле все на удивление просто:

    1) Из-за динамической типизации и логичного кода PHP отлично заходит у новичков со всеми вытекающими, а так как они самоучки, очевидно они скорее всего никогда не слышали о том, что нужно сравнивать переменные строго, плюс PHP не ругается, поэтому зачем писать ===, когда можно написать просто ==?
    2) Из-за той же динамической типизации PHP особо не важно что и с чем сравнивать, он все приводит на лету к чему надо, ибо если бы этого не происходило, то все бы падало на каждом шагу, ибо С (на чем он написан) - параноик на типы данных, поэтому === - это по сути просто заглушка.
    Ответ написан
  • Кто писал свою CMS?

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

    Acuna
    @Acuna
    Заполнил свой профиль
    Что за предрассудки касаемо PHP? Ну реально, аж задело как-то даже. Если криворукая школота клепает на нем сайтики игровых кланов, которые через пять минут взламывают их такие же криворукие обиженные дружки - стоит ли винить в этом PHP? Всякие музыкальные файлопомойки же позволяют грузить файлы всем и вся, никто же их не ломает. Они же на С++ же написаны.

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

    Предварительно проверяйте все по банальному разрешению, просто берете его из имени файла и через in_array () проверяете наличие в массиве предварительно разрешенных для загрузки на сервер. Из пути вырезаете все спец. символы, в том числе .. обязательно, чтобы было нельзя пройти на уровень выше и не загружать и потом скачивать ваши же файлы. С изображениями вообще красота: с помощью дефолтной GD'шной imageCreateFromJPEG () создаете объект. Если создать она не смогла - выкидывайте ошибку. Если совсем паранойя - можете после этого получить через imagesX ее ширину, если не смогла - то выкидываете ошибку. При ошибке временный файл просто удаляем. Теперь фишка в том, как будет невозможно получить готовый файл еще в процессе его проверки на сервере, так как его нужно для этого загрузить: добавляете рандомную строку к концу файла и кидаете его в рандомно сгенерированную папку, и даже если злоумышленник сможет узнать директорию куда грузятся ваши файлы и даже получит к ней доступ - он не сможет узнать имя своего файла для его запуска. Полные пути к файлам храним в БД. Если файлы загружены - наверное предполагается, что их будут скачивать. Отдавайте их через простенький скрипт на PHP, с прописанными в нем заголовками типов файлов и размером, он будет делать запрос в БД по id этого файла, получать полный путь к нему и отдавать его браузеру на закачку, при этом ни юзеры, ни даже вы сами не будете знать имя скачиваемого файла. Качается и качается, не все ли равно что? C остальными файлами все то же самое, с текстовыми еще проще: если они имеют расширение .txt - их браузер чисто физически не сможет выполнить. Только напрямую не отдавайте, не выворачивайте пути, отдавайте через скачку. Вот и все. Просто и эффективно.
    Ответ написан
  • Как обновить количество товаров в корзине без перезагрузки?

    Acuna
    @Acuna
    Заполнил свой профиль
    Вот у Вас триггеры какие-то висят, они куда-то ведут? Как это часто бывает в такого рода поделках - все реализовано через заднее место. Ладно бы индусы писали, но ведь вроде бы нормальные люди пишут.

    А конкретно по Вашему примеру - что-то на подобии

    $('.elem.plus').click (function () {
      $.post ('ajax.php', { 'action':'cart', 'area':'plus' }, function (result) {
         $('.total').html (result);
      });
    });

    И теперь на словах: у Вас имеется какой-то элемент <div class="elem plus"></div> - это кнопка плюса. Мы вешаем на нее обработчик нажатия, который при нажатии шлет постом данные в какой-то скрипт ajax.php (лучше всего указывать абсолютный url к нему (который http://), этот скрипт уже выполняет нужные запросы в БД и отдает результат через echo, который затем выводится в объекте с классом .total где-то на странице. Например, каким-то таким:

    Количество: <div class="total"></div>

    Вот и все)
    Ответ написан
  • Lamp или Denwer? Объясните подробно: что такое Lamp?

    Acuna
    @Acuna
    Заполнил свой профиль
    Ставь OpenServer, у него очень удобная панелька десктопная для управления и настройки. С Денвером просто не сравнивается, это как луна с семечками.
    Ответ написан
  • Как изменить статус VK группы?

    Acuna
    @Acuna
    Заполнил свой профиль
    Вам нужен ключ доступа сообщества: https://vk.com/dev/authcode_flow_group Проходите все шаги постепенно, особо ничего сложного нет, нужно просто знать специфигу контактного API.
    Ответ написан
  • Как на PHP правильно сделать валидацию поля email в форме?

    Acuna
    @Acuna
    Заполнил свой профиль
    А это у Вас, простите-с, что за образец такой? Откуда он и каким образом Вы планируете по нему что-либо проверить? Проверять нужно регуляркой уже при отправке формы. То есть когда юзер нажал кнопку "Отправить" в форме.

    $errors = [];
    if (!preg_match ('/[\.a-z0-9_\-]+[@][a-z0-9_\-]+([.][a-z0-9_\-]+)+[a-z]{1,4}/i', $_POST['email']))
    $errors[] = 'Не валидный email';
    
    if ($errors) {
      
      $content = 'При отправке формы произошли следующие ошибки:<br/><br/>';
      foreach ($errors as $error) $content .= $error.'<br/>';
      echo $content;
      
    }

    В идеале нужно сабмитить форму на аяксе и выводить сообщение о неверном введеном адресе прямо под полем ввода красиво оформленным без перезагрузки страницы. Но это Вам навыки уже другие нужно иметь.
    Ответ написан
  • Как правильно вывести комментарии с записью?

    Acuna
    @Acuna
    Заполнил свой профиль
    Самое изящное решение, чтобы как в варианте выше не тянуть за каждой записью кучу комментов (ибо представляете, сколько тогда будет запросов, если на странице будет, например, 20 записей, к каждой из которых добавлено по 10-20 комментов) заключается в том, что в таблице нужно создать колонку `parent` и заносить туда единицу, если коммент добавляется из поля ввода новой записи, иначе, если из поля, открываемого по ссылке "Ответить" - 0. Это будет означать по сути ответ на родительский коммент, который и является записью на стенке (ибо чем не запись? Текст есть, картинка есть). При выводе комментов просто выводите записи со значением `parent` = 1 другим шаблоном, например comment_parent.htm, если шаблонизатор у Вас свой - типа с серым фоном, более крупным текстом, и т. д. А комменты - comments_answer.htm. В БД создаете колонку `thread_id`, куда заносите `id` коммента, если это запись, и его же, при добавлении коммента к ней, просто получая `thread_id` родительского коммента. И самое главное - при выводе сортируйте их по thread_id и id коммента одновременно:

    ... AND `position` <= "3"
    ORDER BY `thread_id` DESC, `id` ASC
    LIMIT 0,20

    Это поможет сгруппировать их в нужном порядке, причем не прибегая к GROUP BY, выводя помимо самой записи три последних коммента к ней. Писал экспромтом, реализовал относительно давно, детали опустил, но главное, что суть передал. При наличии определенных навыков и главное понимания сути это все реализовывается относительно просто. Для того я саму суть и изложил, что бы Вы поняли сам принцип. А реализация осуществляется конкретно для проекта.
    Ответ написан
  • Как скормить большой xml(6MB) php?

    Acuna
    @Acuna
    Заполнил свой профиль
    Дак ведь это... simple_html_dom вообще весьма медленная вещь, ибо парсит все регулярками, она же не для этого совсем. Смотрите в сторону специализированных решений для XML, например XMLReader. Открываете этим свой файл через file_get_contents (), и вперед.
    Ответ написан
  • Привязка через php платёжной системы к сайту?

    Acuna
    @Acuna
    Заполнил свой профиль
    1) У Робокассы, Яндекс.Денег, QIWI и остальных платежек имеются готовые скрипты на PHP.
    2) Эти скрипты просто банально обращаются курлой к API этой платежной системы, вот и все.
    3) Скрипт делает запрос к API, успешный ответ API платежки должен перекинуть юзера на шлюз самой платежки, где он уже сам делает что ему нужно. Далее платежка сама делает нужные ей запросы на свой же API, и если ей все понравилось - кидает юзера на вашу ссылку (колбек), которую Вы указываете при настройке этой платежки. По этой ссылке Вы уже делаете нужные Вам действия если юзер все оплатил. Либо заносите в БД в колонку количество денег юзера в зависимости от того, сколько он заплатил на предыдущем шаге, либо переадресуете его на какой-то закрытый раздел сайта, и т. д. Тут уже смотря что Вы хотите позволить юзеру после оплаты, это уже Ваш сайт.

    А условие, что по этой ссылке нельзя попасть иначе, как только через шлюз платежки после успешной оплаты - должен быть передан токен, который берется из адреса этого колбека и сравнивается с токеном, выданный платежкой после после успешной оплаты. То есть если юзер просто так на нее войдет, ему нужно выдать ошибку, типа не верный токен. Собссно, система весьма примитивная, как это ни парадоксально, самое сложное - это научить Ваш скрипт слать на сервер правильные подписи, чтобы генерился правильный токен, который как раз и будет сравниваться с сервером платежки для перехода на эту Вашу секретную страницу на Вашем сайте. Или пользоваться готовыми скриптами самой платежки, обычно этот процесс намного облегчается этим.
    Ответ написан
  • Как связать PHP и GO?

    Acuna
    @Acuna
    Заполнил свой профиль
    Cамый простой вариант - заставить GO возвращать свой результат обработки на JSON, на PHP написать простенький API, и уже на PHP с помощью API курлой возвращать ответы от GO. JSON просто легче всего распарсить с помощью PHP. Да его, соббсно, любым ЯП легче всего распарсить :/
    Ответ написан
  • Нужно ли учить ООП (PHP)?

    Acuna
    @Acuna
    Заполнил свой профиль
    Статья - неслабый вброс для поддержки активности в своем блоге, как это любит делать Mail.ru, когда писать дельного нечего, а надо.

    Учить надо хотя-бы потому, что это удобно. Приведу наглядный пример: у Вас есть метод для подключения к чему-либо (к какой-то БД, FTP, не важно). Он называется query (). Класс с этим методом Вы можете определить при запуске Вашего проекта (например, в index.php). Например, так:

    $db = new DB ([
      'server' => '127.0.0.1',
      'user' => 'root',
      'password' => '',
      'database' => 'my_db',
    ]);

    Как видите, этот класс инициализируется с нужными настройками. При его создании в методе __construct () Вы можете инициализировать само подключение к БД, выбор нужной БД и т. д. И уже в остальных методах Вы можете использовать эту переменную ($db), вводя ее в любой метод с помощью оператора global. Например, $db->query () выполняет запрос в БД (помните, что мы уже инициализировали подключение к БД при создании класса для работы с ней, поэтому мы можем выполнять запросы в нее из любого места Вашего скрипта). Я уж не говорю о том, что при этом методы могут иметь одинаковые названия в разных классах, но Вы всегда будете знать из какого экземпляра этот метод, и чем он занимается.
    Ответ написан
  • Стоит ли все function собирать в одном файле?

    Acuna
    @Acuna
    Заполнил свой профиль
    Определенно любые функции нужно иметь в отдельных файлах, а не в самом коде, ибо если вдруг нужно будет найти какую-либо функцию, чтобы отредактировать ее тело, найти ее будет весьма проблемно. xmoonlight хорошо описал, что стоит разные виды функций раскладывать по разным файлам. Плюс этого еще и в том, что тогда можно подключать файлы с разными функциями только по мере необходимости в них. Что-то сродни библиотекам. Хотя на самом деле в PHP большое количество кода - это экономия на спичках, это же не JS.
    Ответ написан
  • Как правильно сделать get запрос?

    Acuna
    @Acuna
    Заполнил свой профиль
    Мой коллега хочет сказать, что эта ошибка говорит о том, что он не может найти файл expample.php) Во первых, судя по всему, он пытается найти его в папке testajax, но его там нет. Скорее всего он лежит где-то в другом месте. Если уж используете относительные пути к файлам, то кладите их в ту же папку, где у Вас лежат html-файлы, в которых Вы будете выполнять код. Однако чтобы такого не было - всегда (всегда!) указывайте абсолютные пути к файлам. Иначе если Вы перенесете какие-либо файлы в другое место - у вас может все перестать работать, ибо скрипт будет искать файлы в папке с самим собой, где их уже давно нет.
    Ответ написан
  • Пишу приложение на PHP, подкинете идею, что можно еще добавить?

    Acuna
    @Acuna
    Заполнил свой профиль
    Ну наконец-то растет поколение, которое учится программировать не в теории, а на практике! Неужели я этого дождался, неужели? Отличное начинание!)

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

    Хотя я-бы рекомендовал начать с проекта, а потом уже с админки. Просто чтобы ее писать, нужно вообще хоть самому знать что это за проект вообще, чтобы потом уже в нее нужные фишки добавлять.
    Ответ написан