Задать вопрос
  • Как написать код в php чтобы он определял цвет светофора в конкретное время используя инпуты?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Любую задачу, если она сразу не решается в голове, надо решать на бумажке с ручкой
    причем без алгоритмов, тупо перебором.
    рисуем шкалу времени, на ней сигналы светофора по очереди, и дальше берем даты внутри этой шкалы и тупо руками смотрим, какой сигнал.

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

    Дерзайте.
    Ответ написан
    Комментировать
  • Что такое API в PHP?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    грубо говоря, html странички - для живых юзеров, которые по ним ходят, жмут кнопки и читают буквы
    api - для служб, которые ходят друг к другу, читают информацию в виде массивов или объектов (json, xml, и др.) и собственно взаимодействуют посредством вызовов api

    UI - user interface
    api - advanced program interface
    Ответ написан
    Комментировать
  • Стоит ли уволняться для поиска работы java разработчиком?

    Zoominger
    @Zoominger
    System Integrator
    как работодатель отнесется к тому, что в данный момент у меня есть работа. Будут ли меня ждать 2 недели (если я подойду компании)?

    Часто в таких случаях идут навстречу. Или договоритесь с текущим работодателем, чтобы уволили раньше, без отработки.

    Не важно, кем и куда вы собираетесь пойти - всегда лучше иметь запасной аэродром.
    Увольняться можно, если у вас есть денежная подушка на месяц-два.
    Ответ написан
    3 комментария
  • В чем идея и как работают шаблоны?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос очень хороший.
    А ответ на него очень простой.

    Шаблоны нужны для отделения логики приложения от логики отображения.
    Разделив их, мы получим сразу кучу выгод:
    • Нормальную структуру приложения, когда вывод начинается только после того, как отработала вся логика. То есть у нас никогда не будет проблем с ошибкой headers already sent, с возвратом json-а вместо html, с выводом в page header-е тех данных, которые появляются только в процессе работы скрипта
    • Мобильность - один и тот же движок можно будет использовать на нескольких сайтах, меняя только шаблоны, но весь код оставляя одинаковым. Что поможет, в частности, вносить обновления в движок и исправлять ошибки на всех сайтах разом.
    • Разделение труда - сейчас обычно над отображением работают фронтендеры, то есть, когда бизнес-логика отделена от шаблонов, то любой фронт сможет с ней работать


    Соответственно, главное, что надо знать про шаблоны - это то, что любой вывод в РНР скрипте начинается только после того, как отработала вся бизнес-логика.
    Также важно понимать, что в самом по себе смешивании "кода и разметки" ничего ужасного нет. В шаблоне всегда будет код. Без него невозможно выводить динамический контент. Важно только - какой это код, к чему он относится? Код в шаблоне должен относиться только к самому шаблону. На первых порах новичку сложно это отличить. И это еще один плюс специализированных шаблонизаторов.

    После этого есть варианты, которые отличаются в основном удобством работы с кодом шаблона.
    Править HTML код записанный в виде РНР строки - это САМЫЙ неудобный .

    Дальше идут всякие наколенные решения, типа
    бизнес-логика
    include header
    ?>
    хтмл конкретной страницы
    <?php include footer ?>

    или чуть более продвинутый, когда шаблоны хранятся отдельно и могут вкладывться друг в друга. Сначала пишем функцию,
    function render_template($filename, array $data = [])
    {
        ob_start();
        extract($data);
        require __DIR__ . '/' . $filename;
        return ob_get_clean();
    }

    а потом в коде страницы пишем
    бизнес-логика
    ...
    $page_html = render_template('page.tpl.php', [
        'data' => $data,
    ]);
    echo render_template('main.tpl.php', [
        'navigaton' => $nav_list,
        'title' => $title,
        'page' => $page_html,
    ];

    где сами шаблоны это
    ...
            <?php foreach ($navigation as $item): ?>
                <li>
                    <a href="<?= e($item['href']); ?>"><?= e($item['title']); ?></a>
                </li>
            <?php endforeach ?>
    Важно! Любой вывод в этих шаблонах должен экранироваться в обязательном порядке (кроме очевидных случаев, когда мы выводим результат рендера).

    Ну и наконец нормальные шаблонизаторы, из которых я горячо рекомендую Twig.
    Главное, что про него надо знать - даже самые зелёные нубы осваивают его без затруднений. И настоятельно рекомендую сразу перейти на него, после того как наиграетесь с решениями на коленке.
    Ответ написан
    9 комментариев
  • Builder: нужна ли фабрика, или можно в билдере оставить метод?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    1) создать класс-обертку для этого логгера, сконфигурировать его внутри (в методе init, метод init засунуть в конструктор)
    2) изучить реализацию service container в текущем фреймворке/приложении и передавать уже сконфигурированный логгер через dependency injection в нужные классы
    Ответ написан
    Комментировать
  • Как реализовать проверку и подгрузку файлов между серверами?

    Stalker_RED
    @Stalker_RED
    git и системы деплоя не рассматривали?

    Если нужно именно на уровне файлов, то есть rsync, syncthing, и прочее, вплоть до дропбокса, прости господи.
    Ответ написан
    Комментировать
  • Как связать новость на одной странице с ее развернутой формой на другой?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Поднимаем глаза наверх. Только не к Небу, а чуть ниже. К адресной строке своего браузера (пока она ещё там есть, и её не отменили улучшаторы из компании альфабет).
    И - о чудо! - видим там ссылку вида qna.habr.com/q/1077518
    Казалось бы, что могут означать эти загадочные цифры?.. ;-)
    spoiler

    Для "моего первого скрипта на пхп" правда там будет не /q/1077518, а news.php?id=1077518.
    После чего в скрипте news.php вожделенное число будет доступно в переменной $_GET['id']
    Содержимое которой можно будет использовать для запроса строки из БД.
    Только не так как это показано во всех видео на ютубе, а нормально:

    $query = "SELECT * FROM news WHERE id=?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $_GET['id']);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    в переменной $row будет содержимое нужной строки из БД


    А так-то вопрос, конечно, про SQL ;-)
    Ответ написан
    Комментировать
  • Как корректно реализовать автовход пользователя на сайт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Очень правильный вопрос. Разумеется, с таким подходом зайдет кто угодно.

    поэтому надо в таблицу users добавить поле autoenter, и если пользователь выбирает автологин, то в него записывать значение bin2hex(random_bytes(16)); и его же записывать в куку.
    Ответ написан
  • Почему интерпретатор php не воспринимает кириллицу?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Перед тем, как писать веб-серверы на C#, надо учиться описывать проблемы не языком домохозяек.

    Не существует такой кодировки - "кириллица". Есть конкретная кодировка, которую необходимо указать в вопросе.
    Нет такой команды в C# -"послать интерпретатору". Есть конкретная команда или действие, которое надо описать в вопросе.
    Нет такой команды - "сказать, что находится по пути". Есть конкретный код, который надо привести в вопросе.
    РНР - не посетитель в ресторане, чтобы "отказываться". Это программа. Которая либо работает, либо выдаёт сообщение об ошибке. Которое программист должен прочитать. Или по крайней мере, если не понял в нем ни одного слова, то аккуратно скопировать в свой вопрос.

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

    Для того чтобы убедиться в том, что РНР прекрасно работает с русскими буквами, надо создать скрипт test.php
    <?php
    header('Content-Type: text/html; charset=utf-8');
    echo hex2bin('d0bfd180d0b8d0b2d0b5d182'); 
    // текст UTF закодировн в hex чтобы избежать влияния кривых ручек тестировщика/выкрутасов Виндоус


    перейти в папку с ним
    запустить встроенный веб-сервер
    php -S localhost:8081
    и открыть в браузере адрес localhost:8081/test.php

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

    Судя по классической картинке, https://habr.com/en/post/147843/ где-то происходит перекодирование utf-8 -> 866(!)
    Ответ написан
    1 комментарий
  • Как можно ускорить работу Exception?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Если вас беспокоит скорость работы исключений, вы что-то делаете неправильно"

    Ускорить нельзя.
    В данном случае все проблемы не из-за исключений, а из-за говнокода.

    Ошибка валидации при валидации - это не исключительная ситуация, а совершенно нормальная. Часть бизнес-логики. То есть в процессе валидации всего массива данных исключения кидаться не должны.
    Если исключения используются для управления ходом выполнения программы - это УЖЕ ошибка.

    По результатам валидации исключение может кидаться ОДНО. В самом конце. По результатам валидации всего набора данных. Или не кидаться - зависит от конкретной бизнес-логики. Но если и кидать, то только одно, по результатам.
    Это будет правильное использование исключений, которое вообще никак не скажется на скорости работы кода.
    Ответ написан
  • Фриланс: какие специальности не оккупировали "индусы"?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    С таким уровнем я бы рекомендовал набраться опыта в офисе или где-то в работе по найму.
    Лезть во фриланс с нуля - это крест на своей карьере.

    Нормальные опытные люди вообще не конкурируют с индусами.
    Ответ написан
    Комментировать
  • Как улучшить код?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Для начала можно удалить весь DocBlock. Во-первых, он не добавляет ровным счётом никакой информации, а во-вторых, ещё и не все параметры содержит.

    Название returnFullOrderInfo можно переименовать в makeFullOrderInfoResponse - в названиях функций слово return не несёт ценности.

    Метод fullInfo тоже можно переименовать в (to|make|get)FullInfo для того, чтобы по названию было понятно, что метод делает.

    Метод responseSuccess тоже криво назван.

    Почему у параметра $warning не указан тип?

    Если $warning связан непосредственно с заказом, то его имеет смысл передавать в качестве аргумента в fullInfo, чтобы инкапсулировать и не менять объект снаружи. Если же не связан, то формат ответа лучше поменять на ['data' => $orderInfo, 'warning' => $warning].
    Ответ написан
    Комментировать
  • Как лучше реализовать корзину для магазина?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На все эти вопросы легко ответить самостоятельно, если просто немного подумать.
    Никакое знание РНР тут не требуется - только здравый смысл и минимальное понимание принципа работы веб-сайта.

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

    Eridani
    @Eridani
    Мимо проходил
    Вас отсутствие name'ов у инпутов не смущает?
    Ответ написан
    Комментировать
  • Какие существуют события для фиксации выхода пользователя сайта?

    Adamos
    @Adamos
    Дурь это все. Максимум, что вы можете контролировать - это пребывание пользователя на сайте.
    А когда айфон спит, но вкладка открыта, или когда юзер просто сбросил браузер (например, зависший от нехватки памяти) - ни хрена вы не зафиксируете.
    Ответ написан
    Комментировать
  • Как получить список из массива без дублей?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    CREATE TABLE categories (
    	id int auto_increment primary key,
      	name varchar(64)
    );


    <?php
    function getRightCategories($db)
    {
    	$result = $db->query('SELECT id, name FROM categories');
    	return $result->fetchAll(PDO::FETCH_KEY_PAIR);
    }
    
    $categories = getRightCategories($pdo);
    
    print_r($categories);


    Test PDO fetch online
    Ответ написан
    Комментировать
  • 7 жил из 8, должна ли работать сеть?

    Если 1, 2, 3, или 6 в обрыве - работать не будет совсем. 1 и 2 - это одна пара, 3 и 6 - вторая пара. При обрыве любого из этих проводков линка не будет.
    Решать как - переобжать оба конца и проверить. Если то же самое - значит обрыв где-то в кабеле. Тогда можно либо найти место обрыва и там "бочку" поставить или кабель переложить... Ну или взять коричневую или синюю пару вместо зелёной (соответственно, 1ГБит/с сделать не получится, только 100МБит/с).
    Ответ написан
    9 комментариев
  • Как реализовать не могу понять как убрать фон?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Формат jpeg в который вы сохраняете картинку в конце imageJpeg($image); не поддерживает прозрачность
    Используйте для сохранения формат поддерживающий прозрачность, например: png, webp, gif
    Ответ написан
    1 комментарий
  • Почему в парсере перестают работать куки или как изменить чтобы работало?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    1. используй CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE
    2. у кикис заканчивается срок жизни и поэтому они становятся не действительными т.ч. лучше перелогиниваться при каждом сеансе, а потом отправлять остальные запросы с тем же дескриптором $curl
    Ответ написан
    1 комментарий