Ответы пользователя по тегу HTML
  • Как запретить работу функции за пределами страницы с формой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед тем как строить движки сайтов по MVC, надо сначала прочитать букварь по веб-разработке.
    И узнать из него, что
    - РНР запускается на сервере. А все формы отображаются в браузере у пользователя.
    - РНР запускается заново на каждый запрос.
    - на странице с формой никаких функций РНР нет. РНР со всеми своими функциями остался на сервере
    - РНР знать ничего не знает ни про какие страницы. Он видит только НТТР запросы. Который приходят не "со страниц", а от НТТР клиента. Который может быть браузером, а может быть какой угодно другой программой. Но даже если и браузер, то опять же, запрос приходит не "со страницы". А из НТТР клиента. В теории, клиент может сообщить серверу, какую страницу он запрашивал перед этим, но как правильно сказано в соседнем ответе, эту информацию легко подделать.
    - все значения констант, установленные про вызове одного скрипта, тоже остались на сервере, и если после этого обратиться к совсем другому скрипту, то он знать ничего не знает про то что делал первый.

    И уже самостоятельно сделать из этой информации вывод о том, что
    Запретить "ссылке отрабатывать самостоятельно, за пределами страницы с формой" невозможно.

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

    Для того, чтобы они перестали, достаточно просто назвать вещи своими именами. И со страницы регистрации отправлять клиента не на скрипт, который отправляет почту, а на скрипт, который занимается регистрацией.
    Ответ написан
    Комментировать
  • Как добавить данные в БД через HTML-форму?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала учимся правильно соединяться.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    И никаких ужасов с "Соединение не установлено" тут быть не должно.

    После этого выполняем запрос INSERT. Причем запросы мы всегда пишем так, чтобы данные в БД попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

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

    Весь код, который добавляет запись в БД, должен быть расположен ДО любого вывода.
    После обработки запроса методом POST необходимо перенаправить клиента куда-нибудь методом GET и завершить работу скрипта. Делается это функцией header с заголовком location: . после которой написать exit;
    Соответственно, никаких ужасов с "Запись добавлена".

    Кстати, немного удобнее с БД работать не через mysqli, а чрез PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);


    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    1 комментарий
  • Как добавить id в titile при выводе DOM через php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    третьим буду
    echo "<option title='$row[id]'>";

    но вообще, конечно, должно быть

    <option title="<?= htmlspecialchars($row['id']) ?>">


    а не этот ужас с загогулинами
    Ответ написан
    Комментировать
  • Как можно заставить обрабатывать HTML теги в языковых файлах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо включить логику и использовать языковую поддержку для перевода, а не для вывода HTML, JS или canvas

    $lang['use_top_up_cards']       = 'Оплатить с препей карты';
    $lang['available_sum']       = 'Доступная сумма:';
    $lang['pre_deposit']        = 'Оплатить с депозита';
    return $lang;

    В шаблоне
    {$Think.lang.use_top_up_cards}<br><span class="fl ml30">{$Think.lang.available_sum}</span>
    {$Think.lang.pre_deposit}<br><span class="fl ml30">{$Think.lang.available_sum}</span>
    Ответ написан
    Комментировать
  • Как указать канонический адрес страницы, если сайт делается в open server и домена пока что нет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не нужен никакой "канонический адрес". Вообще не нужно никогда в ссылках писать url.

    Писать надо только путь, причем абсолютный. То есть /question/var.php

    И все будет всегда работать на любом домене
    Ответ написан
    Комментировать
  • Где лучше прописывать PHP код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    index.html чисто для HTML и server.php для PHP бывает только в самых примитивных учебных проектах.
    В реальном коде такого разделения не бывает, и все файлы, содержащие HTML, код обрабатываются интерпретатором РНР.

    Другое дело, что HTML пишется не в прямо в РНР файлах которые обрабатывают данные, а в отдельных *шаблонах* - файлах со специальным синтаксисом, которые содержат HTML и некоторую логику для вывода. РНР читает такой файл и исполняет его, заполняя данными. В самом примитивном случае это опять же просто РНР файлы.
    Ответ написан
    5 комментариев
  • Как сделать запрос с сайта в Google Таблицы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Комментировать
  • Как после авторизации переходить на другую страницу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В файле auth.php
    Ответ написан
    Комментировать
  • Как сделать правильный вывод фото/изображения?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для каждой переделывать размеры при загрузке. Для мутроной работы у тебя компьютер есть.
    Ответ написан
    Комментировать
  • Почему HTML теги выводятся из JSON как есть, а не рендерятся?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    К базе данных (и тем более к mysqli, в которой ничего в принципе не может храниться) вопрос не имеет ни малешйего отношения.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если это путанное объяснение означает что пользователь переходит с сайта А на сайт Б, там заполняет форму, в которой экшеном стоит скрипт на сайте А, то обрабатывать как обычно.

    Если задача какая-то другая, то надо родить нормальное описание.

    Но для начала надо открыть для себя, что "форма на сайте" не бывает. Форма всегда в браузере. С какого сайта форму браузер загрузил - совершенно неважно. Важно на какой сайт ведет экшен формы.
    Ответ написан
    Комментировать
  • Какие есть best practices при смешивании вёрстки с php?

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

    <div blabla>
    <?php foreahch(): ?>
        <div blah>
    <?php    if(): ?>
            <table>
    <?php        foreach(): ?>
                <tr>

    Получилось в теории ровно но на практике еще более уродливо.
    А потом стал пользоваться шаблонизаторами и забыл про все эти куличики в песчнице
    Ответ написан
    2 комментария
  • Чего не хватает в коде PHP для вывода полного html кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    внутри функции отдельная область видимости переменных
    поэтому

    function guest_single($number, $photo_id, $our_guests_images)

    ну или вызывать acf_photo_gallery внутри
    Ответ написан
  • Как отображать изображения на тестовом сайте, если они лежат на основном?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    можно наладить редирект в оппаче, Redirect /uploads http://main.site/uploads
    но я бы просто перенес картинки на тестовый.
    Ответ написан
    Комментировать
  • Как обойти защиту от пасеров?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Попробовать раз в жизни не тырить мелочь по карманам, а побыть для разнообразия честным человеком.
    Ответ написан
    Комментировать
  • Ошибка при отправке данных в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    вместо
    $mysql = new mysqli('localhost', 'root', '', 'factotum_base');
    
    if ($mysql) {
     	echo ":)";
     } else {
      echo ":(";
     }

    Написать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysql = new mysqli('localhost', 'root', '', 'factotum_base');

    А этот ужас
    if ($res == false) {
        printf("Ошибка при выполнении запроса\n");   //вылетает ошибка :(
      } else {
        printf("Запрос выполнен :)");
      }

    убрать целиком
    Ответ написан