За последние 24 часа нас посетили 21023 программиста и 1107 роботов. Сейчас ищут 473 программиста ...

Не передается переменная через $_SESSION

Тема в разделе "PHP для новичков", создана пользователем Bazil, 13 май 2021.

  1. Bazil

    Bazil Новичок

    С нами с:
    12 май 2021
    Сообщения:
    2
    Симпатии:
    0
    Доброго дня! Только начинаю осваивать PHP. Задача создать простую форму которая будет отдавать данные в mysql базу. Перед отправкой данных они должны вывестись на экран, для проверки. Далее после нажатия кнопки подтверждения должен выполниться sql запрос.
    Есть два файла. Собственно сама форма.
    HTML:
    1. <!DOCTYPE html>
    2.   <head>
    3.     <title>Добавление статьи</title>
    4.     <link href ="style/style.css" rel="stylesheet">
    5.   </head>
    6.   <body>
    7.   <form action="scripts/create_article.php" method="post">
    8.   <p>Заголовок статьи (не больше 200 символов)<br/><input name="title" size="70" type="text" reuired></p>  
    9.   <p>Основной текст статьи <br/><textarea cols="170" rows="40" name="content" required></textarea></p>
    10.   <p><input type="submit" value="Отправить"></p>
    11.   </form>
    12.  
    13. </body>
    14.   </body>
    15. </html>
    И скрипт предпросмотра и отправки данных
    PHP:
    1. <?php
    2. require_once 'connect.php';
    3.  
    4.  
    5. if (isset($_POST["submit_to_db"])) {
    6.  
    7.   echo $_SESSION['title'];
    8.   echo $_SESSION['content'];
    9.     $query = "INSERT INTO articles (title, content) VALUES ('".$title."', '".$content."')";
    10.     if (!$mysqli->query($query)) {
    11.     printf("Сообщение ошибки: %s\n", $mysqli->error);
    12. }
    13. }
    14. else {
    15. $_SESSION['title'] = $_POST['title'];
    16. $_SESSION['content'] = $_POST['content'];
    17.  
    18. echo '<h1>' . $_POST['title'] .  "</h1>" . "\r\n";
    19. echo '<p>' . $_POST['content'] . '</p>';
    20.  
    21. }
    22.  
    23. ?>
    24.  
    25. <!DOCTYPE html>
    26. <html>
    27.   <head>
    28.     <title>Проверка заполненной формы</title>
    29.     <link href ="style/style.css" rel="stylesheet">
    30.   </head>
    31.   <body>
    32.   <form action="create_article.php" method="post">
    33.   <p><input type="submit" name="submit_to_db" value="Все нормально?"></p>
    34.   </form>
    35.  
    36. </body>
    37.   </body>
    38. </html>
    При отправке данных из первой формы все хорошо. Но при нажатии кнопки "все нормально?" для отправки данных в базу, $_SESSION['title'] и $_SESSION['content'] оказываются пустыми. Новая строчка в базе данных создается, но с пустыми значениями в столбцах title и content. Видимо я плохо представляю что детально происходит при нажатии кнопки отправки данных при условии, что код обработки формы находится в том же файле где и форма. Слышал, что так лучше не делать, но все же решил не плодить множество файлов для обработки, по сути, одной формы.
    Подскажите как быть?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    нда.. собрано все самое неправильное что можно было )))
    1. session_start() должны быть самой первой строкой, мало ли какие у вас символы и вывод в connect.php
    2. логика - второй кусок формы с "подтверждением" у вас будет выводиться всегда, и при отправке первой формы и при отправке второй, и даже когда никто ничего не отправляет а зайти на страницу по адресу просто
    3. SQL иньекция возможна
    4. обычно перед записью в БД проверку данным делают.... а не пишут все что попало, в том числе и пустые строки
    5. Так как запись в сессию идет всегда, когда это не вторая форма, то например заход по адресу скрипта хоть и будет по протоколу get - точно так же запишет в сессию что? пустые значения
     
    #2 ADSoft, 13 май 2021
    Последнее редактирование: 13 май 2021
    don.bidon нравится это.
  3. Bazil

    Bazil Новичок

    С нами с:
    12 май 2021
    Сообщения:
    2
    Симпатии:
    0
    Да действительно connect.php выводил одну строку на экран, в этом все дело. Остальные замечания учту.
    Спасибо!
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    845
    Симпатии:
    131
    Очень полезно
    PHP:
    хотя бы на dev-сервере.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Что пользователь в форме не может что ли проверить? Для пущей важности можно разместить сброшенный или установленный флажок «Я подтверждаю, что данные корректны».
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    845
    Симпатии:
    131
    Может там такое хитросношенное ТЗ ))
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    @don.bidon, может, но можно же сказать, что ТЗ – отстой и нужно делать так-то. Или ТС – раб, боящийся потерять заказ? Вообще по коду не скажешь, что это оплачиваемая работа. Заказчик – вдвойне дурак? :) Хотя вполне может быть :D
    --- Добавлено ---
    Сельский банк пилит ЛК доморощенными кадрами? :D
    --- Добавлено ---
    Вообще, если речь реально об articles, можно использовать флажок «черновик/опубликовано» прямо в таблице. Дефолтом – черновик, после подтверждения менять состояние на «опубликовано» ;)
    --- Добавлено ---
    P.S. При создании можно даже черновик публиковать по обычному адресу, но не показывать его в списках статей.
    --- Добавлено ---
    P.P.S. У нас во всех статейниках это именно так устроено, только вместо флажка обычно используется спец. категория «Черновик».