Задать вопрос
  • Как переключить версию php на Laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Никак не переключить, Laravel к вашей версии PHP не имеет никакого отношения и управлять ей не может.
    Версия переключается в веб-сервере, о котором в вопросе вы не упомянули вообще. Загуглите "%ваш веб-сервер% %ваша операционная система% change PHP version".
    Ответ написан
    1 комментарий
  • Resource: что из себя представляю потоки в php?

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

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

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

    Вот даже здесь, поскольку fopen работает поверх абстракции, нельзя говорить о едином подходе.
    Если у нас самый простой случай - локальный файл - то РНР оборачивает функции для работы с файлами языка С в свою собственную абстракцию. Но ниже - на уровне этих самых функций языка С - никаких потоков нет. Есть обращение к функциям операционной системы, которые просто позволяют прочитать выбранный кусок файла.
    Тут никаких вопросов нет, всё честно - если мы прочитали из файла 5 килобайт - значит потратили ровно 5 килобайт памяти.
    Но работаем мы с файлом не считывая его весь в память не потому что поток, а потому что так устроена файловая система. А поток этой возможностью только пользуется.

    Если же мы открываем не файл, а URL, то РНР начинает извращаться, пытаясь предоставить те же самые инструменты, какие мы используем для работы с файлами, для доступа к ресурсам совершенно другого типа.
    И здесь возможны нюансы. Я не знаю, как реализован HTTP wrapper, но в теории HTTP позволяет чтение произвольного объема данных через заголовок Range:. То есть РНР вполне может читать и из НТТР кусками, а не целиком.

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

    А упомянутый в вопросе PSR-7 вообще никакого отношения к потокам в РНР не имеет. Это совершенно отдельная реализация принципа потоков, которая не имеет отношения к потокам в РНР.
    Ответ написан
    Комментировать
  • Почему возникает ошибка SQLSTATE[42000] при запросе обновления в базе данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что бессмысленный говнокод.
    У меня племянница трёхлетняя так дом строит: деревья, мишку плюшевого, колеса от грузовика - всё в дело идёт.
    Но ей хотя бы ума хватает не класть сверху мороженое. А тут всё вперемешку - SQL кривой, prepare используется там где не нужно, и не используется где нужно, каким-то боком mysqli...

    Переменные не пишут прямо в запрос. А передают отдельно. Потому что именно от этого все ошибки и происходят.
    И как раз для этого и используют PDO, с pepare и execute

    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbh = new PDO('mysql:dbname=database;host=localhost;charset=$charset', 'usr', 'password', $options);
    
    $stmt = $dbh->prepare("UPDATE posts SET content = ? WHERE id = ?");
    $stmt->execute([$content,$id]);
    echo "Пост - " . $id . PHP_EOL;
    Ответ написан
    Комментировать
  • Не получается внести данные с формы в бд, хелпанете?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Как при входе на сайт (загрузка страницы) записать единичку в файл?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Учите функцию file_put_contents()

    file_put_contents("я_лентяй.txt", "1", FILE_APPEND);
    Ответ написан
    Комментировать
  • Как сделать файл авто перескачиваемым после его обновления?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    самое тупое решение
    <script src="/path/file.js?t=<?= filemtime($_SERVER['DOCUMENT_ROOT'].'/path/file.js') ?>">
    Ответ написан
    9 комментариев
  • Почему данные заказа не отправляются в базу данных?

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

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

    К тому что написано в предыдущем ответе надо добавить только одно: перед
    new mysqli(...);
    надо всегда писать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    чтобы база данных сама сообщала, почему не может выполнить запрос. Если дело именно в нём.
    Ответ написан
  • Почему выдает ошибку при загрузке фотографии?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    То, что папка images находится в папке с product.php, не имеет вообще никакого значения.
    product.php не имеет отношения к работе веб-сервера. из неё просто читается код класса.

    При этом путь images/ является относительным. То есть, в зависимости от точки входа может вести в совершенно разные места.
    Именно поэтому все пути всегда должны быть абсолютными. Пусть даже и с помощью костыля __DIR__
    Ответ написан
    2 комментария
  • Как продолжить цепь запросов в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если отбросить всю не относящуюся к вопросу чепуху, типа каких-то "внутренних запросов"(?!), то ответ сводится цепочке вызовов.
    Ответ написан
    Комментировать
  • Почему большие проекты типа apple.com используют css переменные а не scss/less etc?

    vabka
    @vabka Куратор тега Веб-разработка
    1. Неизвестно, что там apple.com использует
    2. CSS переменные не исключают использование переменных препроцессора
    3. CSS переменные можно менять в рантайме, в отличие от переменных препроцессора.
    Ответ написан
    1 комментарий
  • Какие есть альтернативные способы представления чисел в памяти?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Да вагон таких попыток. GMP и аналоги представляют числа в виде дробей, количество знаков в числителе и знаменателе которых ограничено только объемом оперативки

    Программы символьной математики типа Maple, Maxima, Octave умеют хранить выражение в виде аналитической записи, то есть, умеют представлять всякие иррациональности точно (типа sqrt(2) он так и хранят как sqrt(2))

    Для практических инженерных вычислений, такая точность, очевидно, не нужна - там и float и double, как правило, хватает.
    Ответ написан
    1 комментарий
  • Что лучше использовать .NET Core или Django?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Лучше использовать то, что лучше знаете.
    Ответ написан
    Комментировать
  • Как написать код в 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)); и его же записывать в куку.
    Ответ написан