За последние 24 часа нас посетили 15516 программистов и 1487 роботов. Сейчас ищут 887 программистов ...

Как сохранить значение переменной?

Тема в разделе "PHP для новичков", создана пользователем Sergey_Tsarev, 17 мар 2016.

  1. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Доброго времени суток!
    Есть вот такая проблема:
    Код (PHP):
    1. <?php
    2.  
    3. function genRand() {  //функция для генерации случайного числа
    4.         $gensalt = '';
    5.         $length = rand(5,10);
    6.         for($i=0; $i<$length; $i++) {
    7.              $gensalt .= chr(rand(48,57));
    8.         }
    9.         return $gensalt;
    10. }
    11.  
    12. $id = time().genRand();
    13. $_SESSION['id'] = $id;
    14.  
    15. echo '<form>
    16.          <input type="submit" name="submit">
    17.         </form>';
    18.  
    19. if($_POST['submit']) {
    20. echo $id;
    21. }
    22. ?>
    Проблема в том, что значение переменной $id в сессию записывается одно, а после нажатия кнопки "Submit" на экран выводится другое. Я понимаю, что значение переменной генерируется в момент обращения к ней. Подскажите пожалуйста как сделать так, чтобы значение переменной сохранялось сразу после загрузки страницы?
    Есть вариант конечно вывести значение изначально в "input", но мне не хотелось бы этого делать. Заранее спасибо за помощь!
     
  2. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Так ты при каждой загрузке страницы генерируешь новое число и забиваешь его в сессию. Может просто добавить проверку, если переменная сессии не существует то создавать её.

    Код (PHP):
    1. if (!isset($_SESSION['id'])) {
    2.   $id = time().genRand();
    3.   $_SESSION['id'] = $id;
    4. } 
    Добавлено спустя 5 минут 23 секунды:
    Может число проще можно генерировать:
    Код (PHP):
    1. rand(35000, 50000); // Случайное число в диапазоне 35000-50000
    2. rand(); // Случайное число  
    Зачем такие сложности? Что ты хочешь сделать?
     
  3. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Да, спасибо, генерацию числа можно сделать проще. Но, к сожалению, проблема не в ней. Проблема вот в чем: у меня на странице есть загрузчик фотографий. Сохранение фото идёт через Ajax. Имя папки для сохранения фото и есть переменная $id. Переменную я передаю скрипту загрузки при помощи сессии. А в базу данных имя папки сохраняю только после нажатия кнопки Submit. По сути получается, что я обращаюсь к переменной два раза: первый раз когда записываю её значение в сессию, и второй раз когда отправляю форму. Значения получаются разные, а мне нужно чтобы были одинаковыми :) Нужно как-то сохранить значение переменной при первом обращении к ней, чтобы при следующих обращениях она не изменялась.

    Добавлено спустя 13 минут:
    А! Перечитал твой ответ и понял. Проблема из-за того, что форма обрабатывается на этой же странице, а соответственно происходит перезагрузка страницы и как следствие генерится новое значение переменной и переписывается её значение в сессии. Проверка не подойдёт, так как нужно чтобы при каждом обращении к этой странице генерился уникальный id. Какой выход? Только обрабатывать форму на стороне?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    Ответ тот же: не генерить новое число когда не надо.
     
  5. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Так это случайное число это и есть имя папки? А если такая папка уже существует?
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А если не нажму? Файл же так и останется валяться бесхозным.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.591
    Симпатии:
    1.763
    Ну так а почему бы не записать в форму, а не капча какая-нибудь? Всё равно потом светить будете, чтоб юзверь мог иметь доступ к файлам
     
  8. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Она не может существовать так как в переменной используется айди пользователя, тайм и случайное число.
    В этом случае, папка с файлами через сутки будет удалена.
    Потому, что если я ее пропишу в инпут, то юзер сможет легко изменить этот айди и в базу запишется неправильное значение.

    В общем объясню вкратце, что это за форма. Юзер отсылает заявку с прикрепленными фото. Так как фото заливаются достаточно большие по размеру, то загрузка их может занять длительное время. Поэтому в верхней части страницы находится окошко для загрузки фото. Юзер выбирает фото и пока они загружаются, спокойно заполняет поля формы (их там около 30). Фотки обрабатываются скриптом, создается папка имя у которой переменная ID, и туда фотки сохраняются. Юзер заполнил форму и нажимает кнопку сабмит. И мне нужно чтобы в базу записался тоже значение переменной, что и отправлено было скрипту который обрабатывал фото. Но так как при отправке формы страница перегружается, то и ID генерируется новое. Единственный выход я вижу в том, чтобы не обрабатывать форму на этой же странице, а отправлять ее другому скрипту, тогда скрипт обработчика сможет взять значение из сессии, которое будет таким же как и то, что мы отправляли скрипту загрузки фото.
     
  9. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Вот случайное число здесь точно не подойдёт. Интервал у случайного числа хоть и большой, но всё же есть вероятность повторения чисел. Я думаю тебе не хотелось бы раз в три месяца при полнолунии сталкиваться с перезаписью файлов, удалением или чем то подобным.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Есть же uniqid()
     
  11. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Ну так там же еще time() используется, даже если случайное число и совпадет, время все равно будет разное.

    Добавлено спустя 2 минуты 31 секунду:
    Код (PHP):
    1. $id = айди пользователя
    2. $idApp = $id.'_'.time().'_'.rand();
    3.  
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, результаты array/object dump и т. д.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    Точно так же пользователь может подменить session_id, например, или что угодно. Просчитай что будет при таком раскладе и реши как реагировать.

    Можно вообще без этого рандомного id обойтись:

    Если пользователь проходит аутентификацию прежде чем ему позволят аплоадить что-то, то можно просто сохранять файлы со ссылкой на пользователя. Для имени папки использовать user_id. Какое-то время они будут непривязаны ни к чему. При сохранении формы привязывать все непривязанные пользовательские файлы к новой записи.

    Даже если пользователь не зареган пока, допустим эта форма и есть его регистрация, нет проблем: в качестве папки используй производную от времени или от file_id, который ты получаешь при сохранении.
    $folder = $up_root . intval($file_id / 1000); — гарантируешь не более 1000 файлов в одной папке, нормуль же? )))

    У нас три действия:
    1. создание формы
    2. прием файла
    3. сохранение данных формы

    В (2) получаем файл, возвращаем в ответе file_id (или путь, неважно), который записывается в hidden поле формы. Либо вернем сообщение об ошибке и файл не сохраняем.
    В (3) создаем новую запись, получаем её автоинкрементный ключ, а данные о файлах из скрытых полей связываем с этой записью. Но только если этот файл существует и ещё никуда не привязан, так мы избегаем обмана!

    Дополнительно должен быть обработчик, который удаляет старые и непривязанные ни к чему файлы, допустим суточной давности. Можно делать это по крону или просто в начале (1) или (2).
     
  13. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Для всего остального у меня есть функция, которая проверяет входящие данные. И если значение ей неизвестно, то подставляет значение по умолчанию. Так, что, тут более или менее безопасно.

    Так наверное и сделаю. Буду помещать файлы во временную папку, а при отправке заявки перемещать их в папку, где именем будет служить ID заявки.

    Да, это уже реализовано. Крон запускает скрипт раз в сутки и тот удаляет все временные файлы, которые более суток были не востребованы.

    Всем спасибо за советы!!!