2009-12-15 6 views
2

У меня есть своего рода неопределенный вопрос, что вы, ребята, идеально подходят для ответа. Я много раз сталкивался с точкой, где у меня была форма для моего пользователя, чтобы заполнить, где она состояла из множества разных страниц. До сих пор я спасал их на сессии, но я немного беспокоюсь об этой практике, так как сессия может истечь, и это кажется довольно изменчивым способом ее выполнения.Отслеживание информации на многих страницах для сайта

Я мог видеть, например, таблицу для временных форм в SQL, которую вы сохраняете в конце каждой страницы. Я мог видеть публикацию всех данных, взятых до следующей страницы. Вещи вдоль этих линий. Как вы, ребята, это делаете? Какая хорошая практика для этих ситуаций?

ответ

1

Да, вы определенно можете сохранить промежуточные данные в базе данных, а затем переверните некоторый бит, чтобы указать, что запись закончена, когда пользователь отправляет на конечный результат. В зависимости от того, как вы разделяете сбор данных, каждая страница может создавать строку в другой таблице (с некоторым ключом, связывающим их вместе).

Вы также можете рассмотреть возможность сохранения данных в форме более свободной формы, например XML в одном столбце. Это позволит вам поддерживать сложные структуры данных в простой схеме данных, но это затруднит запрос данных (если ваша база данных не поддерживает типы столбцов xml, которые делают большинство современных баз данных предприятия).

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

Сохранение промежуточных данных в БД также позволяет пользователю переходить с одной страницы на другую и повторно просматривать предыдущие страницы.

Скрытые поля также являются хорошим подходом, но они не позволят пользователю вернуться позже.

Я бы не хотел хранить большие структуры данных в сеансе, так как если пользователь не делает недействительным сеанс явно, и если у вас нет хорошего механизма для очистки старых сеансов, эти истекшие сеансы могут много времени.

В конце концов, это действительно зависит от ваших конкретных потребностей бизнеса, но, надеюсь, это дает вам о чем подумать.

+0

Но, как я уже сказал, вам, возможно, придется очищать таблицы от «незавершенных» данных. Это не недостаток, я просто хочу отметить. –

+0

Правда, но вы также должны быть осторожны с устаревшими, истекшими данными сеанса, которые торчат на сервере (часто в папке/tmp) – pkaeding

0

Почему бы просто не передать вещи по скрытым параметрам?

+1

Они не обязательно линейны – Ethan

1

Я бы придерживался данных на сессии, поскольку на данном этапе он более или менее временен: что бы вы сделали, если пользователь не заполнил формы? Вам придется проверять таблицу SQL для незавершенных данных, что делает ваше приложение более сложным.

Кстати, есть причина для окончания сессии, а именно безопасности. И вы можете определить себя, когда закончится сеанс.

+0

Вам нужно быть осторожным с устаревшими данными об истекшем сеансе, хранящимися на сервере (часто в папке/tmp). Устаревшие данные, связанные с проблемой, не ограничиваются хранением данных в БД. – pkaeding

+0

Это прекрасно, пока бизнес-логика в порядке, когда пользователь не может пройти один и тот же поток в двух окнах одновременно. Представьте, что вы пытаетесь купить два рейса одновременно, когда все было сохранено в сеансе. Вероятно, вы получите два билета в тот же рейс. – Bialecki

+0

@pkaeding: Вы правы в отношении истекшего сеанса. И я понял, что с некоторыми фреймворками вы можете настроить базу данных для хранения данных сеанса в любом случае. @Bialecki: Вы также правы, это сильно зависит от вариантов использования (что должен делать пользователь). Но даже полет можно делать с сеансами без проблем. –

0

Ahh, хороший вопрос.

Я нашел, что это отличный способ справиться с этим (если он линейный). Следующее будет работать особенно хорошо, если вы включаете в себя другой контент (страницы) на одну страницу PHP (например, MVC). Однако, если вам нужно перейти от URL к URL-адресу, это может быть сложно, потому что вы не можете отправлять POST через перенаправление (ну, вы можете, но ни один браузер не поддерживает его).

Вы можете заполнить детали.

$data = array(); 
//or// 
$data = unserialize(base64_decode($_POST['data'])); 


// add keys to data 


// serialize 
$data = base64_encode(serialize($data)); 


<input type="hidden" name="data" value="<?= htmlspecialchars($data, ENT_QUOTES); ?>" /> 
Смежные вопросы