Задать вопрос
Ответы пользователя по тегу PHP
  • Как правильно отправить данные из формы POST-запросом и записать их в бд?

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

    Ведь настоящий вопрос звучит "Я написал код, который отправить данные из формы POST-запросом и записать их в бд, но он не работает. Как понять, по какой причине он не работает, чтобы я мог это исправить?" - ну разве не так?

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

    Для mysqli это делается командой
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Которая пишется перед коннектом.
    Для РНР всё стандартно - error_reporting всегда в E_ALL плюс display_errors в 1 на домашнем компьютере.

    И после этого РНР сам всё расскажет и покажет. И где опечатка в запросе, и любые другие ошибки.
    Ответ написан
    Комментировать
  • Почему не воводятся данные из БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что никто никогда не читает документацию.
    В которой написано, например - какой массив возвращает fetchAll(). И можно ли из него получить что-то в виде $user_data['id'].
    А ещё в мануале написано, какая на самом деле функция подойдёт в данном случае.

    Также, там написано, что делает функция fetchColumn(). Которая, во-первых, делает совсем не то что думает автор кода, а во-вторых, даже если бы и делала, то всё равно здесь никаким боком не нужна.

    И я уже не говорю, что в мануале написано темно-красным по светло-красному, что MD5 нельзя использовать для хэширования паролей.
    Ответ написан
    6 комментариев
  • Resource: что из себя представляю потоки в php?

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

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

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

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

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

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

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    есть немного замороченный способ, но в целом он требует куда меньше кода
    WHERE (account_id=? OR ? is null)  AND (priority=? OR  ? is null)

    Чтобы его использовать, надо всего лишь передавать каждую переменную в запрос по два раза (и следить, чтобы пустые переменные содержали null).

    Другим вариантом является условная сборка запроса.
    Для этого мы собираем условия и переменные для них в массивы

    $conditions = [];
    $parameters = [];
    if ($account_id)
    {
        $conditions[] = 'account_id=?';
        $parameters[] = $account_id;
    }
    if ($priority )
    {
        $conditions[] = 'priority =?';
        $parameters[] = $priority;
    }

    собираем из условий запрос и выполняем его, привязывая все переменные разом
    тут из сложного будет привязка переменных из массива, но благодаря оператору распаковки аргументов это не так уж и сложно.
    if ($parameters)
    {
        $sql .= " WHERE ".implode(" AND ", $conditions);    
        $stmt = $db->prepare($sql);
        $stmt->bind_param(str_repeat("s", count($parameters)), ...$parameters);
        $stmt->execute();
        $result = $stmt->get_result();
    } else {
        $restult = $db->query($sql);
    }
    Ответ написан
    3 комментария
  • Как вытащить данные из stmt?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    вместо store_result(); надо писать get_result();
    этот метод даст вам привычный ресурс, из которого уже можно получить данные обычным способом
    $stmt = $link->prepare("SELECT * FROM users WHERE id=?");
    $stmt->bind_param('i', $value);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    Ответ написан
    5 комментариев
  • Многоязычный сайт php twig - как лучше реализовать?

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

    То есть берется готовый или делается кастомный фильтр. Который и занимается поиском соответствия для переводимой фразы. Которая выводится, как {{ message|trans }}

    Вот пример реализации такого фильтра в Симфони

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ту, в которой перечислить разрешённые символы.
    Чёрные списки никогда не работают. Работают только белые.
    Ответ написан
    2 комментария
  • Как вложить шаблон в шаблон (исправить мою ошибку проектирования в коде)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я же уже отвечал на этот вопрос. С готовым примером кода, где как раз и показано, как вкладывать шаблоны друг в друга.
    А вас настолько подкосила детская проблема с путями к файлам на кривом сайте, что сам ответ вы, похоже, даже не прочитали. Зачем было спрашивать?
    Ответ написан
  • Как получить значение из многомерного массива php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Все верно, циклом

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

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

    Или, может быть, рука промахнулась, хотели удалить вопрос, а удалился ответ?
    Можно ещё раз попытаться.
    Ответ написан
    1 комментарий
  • Как написать код в php чтобы он определял цвет светофора в конкретное время используя инпуты?

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

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

    Дерзайте.
    Ответ написан
    Комментировать
  • Как записать данные из json_decode(file_get_content()) в переменную?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $peremennaya = json_decode(file_get_contents());
    не благодарите
    Ответ написан
  • В чём ошибка подключения к безе по PDO?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ошибку указывает сама PDO.
    Для этого в настройках надо указать PDO::ERRMODE_EXCEPTION - это уже сделано.
    После этого, в случае, если выполнение запроса завершится ошибкой, РНР об этом сообщит.
    Надо только, опять же, не забыть включить отображение (на домашнем компьютере) или логирование (на боевом сервере) ошибок РНР.

    Если же РНР никаких ошибок не выводит, то их и нет.
    Ответ написан
    4 комментария
  • Что нужно отправить на сервер, чтобы php понял это, как null?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос неверный. В стиле анекдота "у таракана уши в ногах".
    Разумеется, сервер всё прекрасно видит.
    чтобы РНР принял null, надо отправить на сервер null. Удивительно, но факт.
    var_dump(json_decode('{ 
        "name": ["i", "b"], 
        "val": [null]
    }',1));


    А вот что там делает код на этом сервере - никто не знает.
    И обращаться надо к автору кода. А не в Спортлото

    Скорее всего там либо array_filter, либо isset/empty($array['val']);
    Ответ написан
    4 комментария
  • Как обработать запрос с формы на сервере?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для этого очень давно придумали https://en.wikipedia.org/wiki/Common_Gateway_Interface
    Фактически это тот же самый cli но на стероидах: перед тем как вызвать бинарник и передать ему на stdin строку с закодированным постом, надо установить несколько обязательных переменных окружения

    В составе РНР до сих пор поставляется бинарник php-cgi, который сам всё раскодирует, а так же, в качестве бонуса, сформирует все нужные заголовки ответа.

    Пара ссылок:
    https://stackoverflow.com/questions/4030147/how-to...
    https://www.oreilly.com/openbook/cgi/ch04_02.html
    Ответ написан
    Комментировать
  • В чем идея и как работают шаблоны?

    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 комментариев
  • Сложно ли подделать IP апдрес при запросе $_SERVER['REMOTE_ADDR']?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Насколько я помню сетевые технологии, к которым на самом деле относится вопрос "Можно ли подделать IP адрес", подделать исходящий адрес в TCP заголовке можно. И такой запрос пройдет проверку. Но ответ на него уйдет на этот поддельный IP. То есть соединение оборвется на этапе TCP хэндшейка

    Отсюда можно сделать вывод: подделать адрес можно, но это не поможет сделать что-то вредоносное.

    Если поставить этому вопросу нормальные теги, а не взятые с потолка, то ответят настоящие специалисты в этом вопросе.
    Ответ написан
    3 комментария
  • Как связать новость на одной странице с ее развернутой формой на другой?

    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 ;-)
    Ответ написан
    Комментировать
  • Как запретить PHP следовать HTTP заголовку Location?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос редкий в своей бессмысленности.
    Причем с самого начала. С какой стати "запрет просматривать каталоги" имеет хоть какое-то отношение к "безопасности сайта"?
    Дальше уже смешно. Что это за "технические причины", которые позволяют написать в .htaccess какой-нибудь, скорее всего, RewriteRule, но Options -Indexes написать вдруг не дают?
    Дальше идет совсем уже какое-то безумие, "не могу запретить, поэтому сделал редирект на него". ШТА? Может быть всё-таки не на него, а из него?

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

    Я уже не говорю про то что "PHP" не следует никаким заголовкам. Есть несколько разных способов сделать НТТР запрос из РНР, и соответственно, для каждого способа запрет следования заголовку Location будет разным. То есть, не указывая способ, которым делается запрос, надеяться на ответ несколько наивно.
    Ответ написан
    Комментировать
  • Как прикрепить файл с сервера к письму через phpmailer?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для правильного решения этого вопроса, надо освоить две важные концепции. Нет, три.
    1. Начать отличать файлы от виртуальных адресов. Не то чтобы это обязательно было причиной, но указывать URL вместо пути к файлу некорректно.
    2. Освоить такое понятие, как отладка. Если что-то не работает, то скорее всего пишет ошибки. Ошибки надо обязательно читать, чтобы исправить. Не бывает волшебного кода, который работает вообще всегда, стоит только его "обнаружить на просторах интернета". Любой код может не работать по миллиону причин, от него не зависящих.

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

    3. Учить английский. И не просто наобум копировать код, найденный на просторах интернета, но и стараться разобраться - что он делает. Это видно даже из названий функций. И таким образом отбрасывать заведомо нерабочие варианты типа $mail->addAttachment(file_get_contents($path));
    Ответ написан
    1 комментарий