Доброго времени суток! Есть вот такая проблема: Код (PHP): <?php session_start(); function genRand() { //функция для генерации случайного числа $gensalt = ''; $length = rand(5,10); for($i=0; $i<$length; $i++) { $gensalt .= chr(rand(48,57)); } return $gensalt; } $id = time().genRand(); $_SESSION['id'] = $id; echo '<form> <input type="submit" name="submit"> </form>'; if($_POST['submit']) { echo $id; } ?> Проблема в том, что значение переменной $id в сессию записывается одно, а после нажатия кнопки "Submit" на экран выводится другое. Я понимаю, что значение переменной генерируется в момент обращения к ней. Подскажите пожалуйста как сделать так, чтобы значение переменной сохранялось сразу после загрузки страницы? Есть вариант конечно вывести значение изначально в "input", но мне не хотелось бы этого делать. Заранее спасибо за помощь!
Так ты при каждой загрузке страницы генерируешь новое число и забиваешь его в сессию. Может просто добавить проверку, если переменная сессии не существует то создавать её. Код (PHP): if (!isset($_SESSION['id'])) { $id = time().genRand(); $_SESSION['id'] = $id; } Добавлено спустя 5 минут 23 секунды: Может число проще можно генерировать: Код (PHP): rand(35000, 50000); // Случайное число в диапазоне 35000-50000 rand(); // Случайное число Зачем такие сложности? Что ты хочешь сделать?
Да, спасибо, генерацию числа можно сделать проще. Но, к сожалению, проблема не в ней. Проблема вот в чем: у меня на странице есть загрузчик фотографий. Сохранение фото идёт через Ajax. Имя папки для сохранения фото и есть переменная $id. Переменную я передаю скрипту загрузки при помощи сессии. А в базу данных имя папки сохраняю только после нажатия кнопки Submit. По сути получается, что я обращаюсь к переменной два раза: первый раз когда записываю её значение в сессию, и второй раз когда отправляю форму. Значения получаются разные, а мне нужно чтобы были одинаковыми Нужно как-то сохранить значение переменной при первом обращении к ней, чтобы при следующих обращениях она не изменялась. Добавлено спустя 13 минут: А! Перечитал твой ответ и понял. Проблема из-за того, что форма обрабатывается на этой же странице, а соответственно происходит перезагрузка страницы и как следствие генерится новое значение переменной и переписывается её значение в сессии. Проверка не подойдёт, так как нужно чтобы при каждом обращении к этой странице генерился уникальный id. Какой выход? Только обрабатывать форму на стороне?
Ну так а почему бы не записать в форму, а не капча какая-нибудь? Всё равно потом светить будете, чтоб юзверь мог иметь доступ к файлам
Она не может существовать так как в переменной используется айди пользователя, тайм и случайное число. В этом случае, папка с файлами через сутки будет удалена. Потому, что если я ее пропишу в инпут, то юзер сможет легко изменить этот айди и в базу запишется неправильное значение. В общем объясню вкратце, что это за форма. Юзер отсылает заявку с прикрепленными фото. Так как фото заливаются достаточно большие по размеру, то загрузка их может занять длительное время. Поэтому в верхней части страницы находится окошко для загрузки фото. Юзер выбирает фото и пока они загружаются, спокойно заполняет поля формы (их там около 30). Фотки обрабатываются скриптом, создается папка имя у которой переменная ID, и туда фотки сохраняются. Юзер заполнил форму и нажимает кнопку сабмит. И мне нужно чтобы в базу записался тоже значение переменной, что и отправлено было скрипту который обрабатывал фото. Но так как при отправке формы страница перегружается, то и ID генерируется новое. Единственный выход я вижу в том, чтобы не обрабатывать форму на этой же странице, а отправлять ее другому скрипту, тогда скрипт обработчика сможет взять значение из сессии, которое будет таким же как и то, что мы отправляли скрипту загрузки фото.
Вот случайное число здесь точно не подойдёт. Интервал у случайного числа хоть и большой, но всё же есть вероятность повторения чисел. Я думаю тебе не хотелось бы раз в три месяца при полнолунии сталкиваться с перезаписью файлов, удалением или чем то подобным.
Ну так там же еще time() используется, даже если случайное число и совпадет, время все равно будет разное. Добавлено спустя 2 минуты 31 секунду: Код (PHP): $id = айди пользователя $idApp = $id.'_'.time().'_'.rand(); Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, результаты array/object dump и т. д.
Точно так же пользователь может подменить 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).
Для всего остального у меня есть функция, которая проверяет входящие данные. И если значение ей неизвестно, то подставляет значение по умолчанию. Так, что, тут более или менее безопасно. Так наверное и сделаю. Буду помещать файлы во временную папку, а при отправке заявки перемещать их в папку, где именем будет служить ID заявки. Да, это уже реализовано. Крон запускает скрипт раз в сутки и тот удаляет все временные файлы, которые более суток были не востребованы. Всем спасибо за советы!!!