За последние 24 часа нас посетили 17905 программистов и 1656 роботов. Сейчас ищут 942 программиста ...

Как объединить три php-файла в один ?

Тема в разделе "Прочие вопросы по PHP", создана пользователем init01, 22 июн 2011.

  1. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    В общем разобралася я кое-кака с этими ComboBoxами.
    НО
    Теперь они у меня в трёх разных файлах. Выбираем параметр в первом ComboBoxe, жмём OK, появляется второй файл, происходит select и заполняется второй ComboBox, выбираем, жмём, третий.
    А хотелось бы сделать, чтобы всё это было в одном.
    Чтобы ComboBoxы обновлялись автоматически, а кнопка OK была одна, когда всё выберешь.

    Структура таблица такова: PROJECT, LINE, DATASET, DATE, SIZE.
    Это сейсмические проекты, но чтобы было проще понять представим, что
    PROJECT / LINE / DATASET - это будто СТРАНА / ГОРОД / УЛИЦА.
    Сначала выбираем страну, во втором ComboBoxe появятся города, которые есть в этой стране, выбираем город, появятся улицы и потом смотрим на определённую дату количество жителей на данной улице.

    Вот мои три файла:

    PHP:
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    4. </head>
    5. <body>
    6. <form method="post" action="file2.php">
    7. <select name="projs">
    8. <?php
    9. try
    10. {
    11. $db1 = new PDO('sqlite:setsize.db');
    12. $result1 = $db1->query("SELECT PROJECT FROM DATASETSIZE GROUP BY PROJECT ORDER BY PROJECT");
    13. foreach ($result1 as $row1)
    14. {
    15. echo "<option value='". $row1['PROJECT'] ."'>". $row1['PROJECT'] ."</option>";
    16. }
    17. ?>
    18. </select>
    19. <input type="submit" value="OK">
    20. </form>
    21. <?php
    22. }
    23. catch(PDOException $e)
    24. {
    25. die($e->getMessage());
    26. }
    27. ?>
    28. </body>
    29. </html>

    PHP:
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    4. </head>
    5. <body>
    6. <form method="post" action="file3.php">
    7. <?php
    8. echo "project: <b>".$_POST['projs']."</b><br>";
    9. ?>
    10. <select name="lines">
    11. <?php
    12. try
    13. {
    14. $db = new PDO('sqlite:setsize.db');
    15. $result2 = $db->query("SELECT LINE FROM DATASETSIZE WHERE PROJECT LIKE '".$_POST['projs']."' GROUP BY LINE");
    16. foreach ($result2 as $row2)
    17. {
    18. echo "<option value='".$row2['LINE']."'>". $row2['LINE'] ."</option>";
    19. }
    20. ?>
    21. </select>
    22. <input type="submit" value="OK">
    23. </form>
    24. <?php
    25. }
    26. catch(PDOException $e)
    27. {
    28. die($e->getMessage());
    29. }
    30. ?>
    31. </body>
    32. </html>

    PHP:
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    4. </head>
    5. <body>
    6. <form method="post" action="file4.php">
    7. <?php
    8. echo "line: <b>".$_POST['lines']."</b><br>";
    9. ?>
    10. <select name="datasets">
    11. <?php
    12. try
    13. {
    14. $db = new PDO('sqlite:setsize.db');
    15. $result3 = $db->query("SELECT DATASET FROM DATASETSIZE WHERE LINE LIKE '".$_POST['lines']."' GROUP BY DATASET");
    16. foreach ($result3 as $row3)
    17. {
    18. echo "<option value='".$row3['DATASET']."'>". $row3['DATASET'] ."</option>";
    19. }
    20. ?>
    21. </select>
    22. Ну тут ещё дату выбираем, но она у меня на javascripte, поэтому я её убрала отсюда, чтобы не загромождать листинг.
    23. <input type="submit" value="OK">
    24. </form>
    25. <?php
    26. }
    27. catch(PDOException $e)
    28. {
    29. die($e->getMessage());
    30. }
    31. ?>
    32. </body>
    33. </html>
    И вот как бы это всё в один файл запихать?
    Чтобы с одной кнопкой OK.
    Точнее запихать-то я пробовала, но, кроме первого ComboBoxa, ничего не работает.
    К тому же, если в третий файл запихнуть $_POST['projs'].", то он оказывается уже пустым.
     
  2. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    Видимо 22 июня сказывается.
    Всех, блин, убили.

    Ладно.
    Тогда хотя бы подскажите как из первого файла в третий передать projs.
    Во втором файле $_POST['projs'] - нормальный, а в третьем - пустой
    Делаю во втором файле переприсваивание:
    $curproj = $_POST['projs']
    Во втором файле curproj - нормальный с нужным значением, а в третьем и $curproj - пустой и $_POST['curproj'] - пустой.
    Присваивание делала и в форме и за формой - результат одинаковый.
     
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Для php - каждый файл это новый вызов, новое обращение к серверу. И третий файл о первом ничего знать не знает, не говоря уже о каких-то там переменных.

    Где хранить информацию между запросами - тут куча вариантов
    - БД
    - сессии
    - куки
    - файлы
    - передача всех переменных в новом ГЕТ/ПОСТ запросе

    В вашем варианте я бы выбрал сессии
     
  4. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    Ну я же во втором файле уже в форме с методом post вставляю присваивание:

    PHP:
    1. <form method="post" action="file3.php">
    2. <?php
    3. {
    4. echo "project: <b>".$_POST['projs']."</b><br>";
    5. $curproj = $_POST['projs'] ;
    6. echo "project: <b>".$curproj."</b><br>";
    7. }
    8. ?>
    9. <select name="lines">
    10. <?php
    11. try
    12. {
    13. $db = new PDO('sqlite:setsize.db');
    14. $result2 = $db->query("SELECT LINE FROM DATASETSIZE WHERE PROJECT LIKE '".$_POST['projs']."' GROUP BY LINE");
    15. #$result2 = $db2->query("SELECT LINE FROM DATASETSIZE GROUP BY LINE");
    16. foreach ($result2 as $row2)
    17. {
    18. #echo "line: <b>". $row2['LINE'] ."</b><br>";
    19. echo "<option value='".$row2['LINE']."'>". $row2['LINE'] ."</option>";
    20. }
    21. ?>
    22. </select>
    23. <input type="submit" value="OK">
    24. </form>
    Почему же $_POST['lines'] передаётся в третий файл, а $_POST['curproj'] не передаётся?

    А можно чуть подробнее?
    Сессий ещё никогда не касалась.

    В принципе, поэтому и хотелось всё в один файл соединить, чтобы не было вот этих ненужных пересылок данных через 3 файла.
     
  5. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    чему присваивается?
    При отправке формы в массиве пост передаются значения элементов формы. К какому элементу формы относится $curproj ?
    (подсказка - ни к какому, просто выводится как текст.)

    В приведенном куске кода из элементов формы у вас только <select name="lines"> и <input type="submit" value="OK">
    Вот в посте и будет $_POST['lines'], а сабмита по ходу не будет, так как у него даже имени нет)

    В работе с сессиями ничего сложного нет
    Есть 2 обязательных момента.

    1) До любой работы с $_SESSION надо вызывать session_start();
    можете это в самом начале скрипта делать, после <?php

    2) session_start(); нужно вызывать ДО любого вывода, т.е. до html-кода, до echo, до header()
    Опять же - самое место после <?php
    Главное чтобы перед <?php не было пробелов, html-кода и прочее

    А дальше всё просто - $_SESSION['var'] = 123; - записать в сессию
    echo $_SESSION['var'] - например вывести на экран переменную
     
  6. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    Поняла.
    И сразу возник дурацкий вопрос:
    А можно создать какой-то невидимый элемент формы?
    Его не будет видно, а через него будет передаваться переменная.

    Ну это я так, для общего развития спросила.
    А вообще пошла тренироваться с сессиями.
    Спасибо за объяснение.

    А какова жизнь сессии?
    То есть пользователь выбрал какой-то проект, у него присвоился curproj, а потом он тупо в браузере нажал назад, попал опять в первый файл и выбрал другой проект - curproj поменяется?
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    init01
    Да можно.
    <input type="hidden" name="projs" value="<?php echo $_POST['projs'];?>">

    Время жизни сессии в php.ini настраивается

    Переменная сессии меняется каждый раз, когда ты её переприсваиваешь) Или я не понял вопроса)
     
  8. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    О! Огромное спасибо!

    Да, именно это меня и интересовало.
    Огромное спасибо!
     
  9. init01

    init01 Активный пользователь

    С нами с:
    22 дек 2009
    Сообщения:
    73
    Симпатии:
    0
    ВСЁ ГЕНИАЛЬНОЕ - ПРОСТО!
    И я, конечно же, гениальна.

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

    HTML:
    1. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    2. <title>Size of Datasets on Period of Dates</title>
    3. </head>
    4. <FRAMESET rows=20%,80% frameborder=0>
    5. <FRAMESET COlS=25%,25%,50% frameborder=0>
    6. <FRAME SRC="datasets1.php" NAME="frame1">
    7. <FRAME SRC="" NAME="frame2">
    8. <FRAME SRC="" NAME="frame3">
    9. </FRAMESET>
    10. <FRAME SRC="" NAME="frame4">
    11. </FRAMESET>
    12. </html>
    А в каждом файле в form вставляю target="frame№".

    Получилось как раз так, как я это всё видела в голове.
     
  10. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    init01
    фреймы не любят за:
    1. - они игнорируются поисковыми системами
    2. - на некоторое содержимое, сгенерированное во фрейме, нельзя дать ссылку
    3. - они устарели морально :)

    а так вариант с фреймами вполне работоспособный

    всё гениальное просто, но не всё простое - гениально ;)