Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]dziwne użycie session_destroy()
Forum PHP.pl > Forum > Przedszkole
RAM
Dzień dobry,
Mam małe doświadczenie w pisaniu aplikacji WWW.
Mam stronę enter_announcement.php (główna, wprowadzanie ogłoszenia) zawierającą
session_start() i stronę summary.php (podsumowanie, też z session_start()).
Kiedy użytkownik chce cofnąć się wstecz strzałką w lewo przeglądarki z
podsumowania to przechodzi do modyfikacji ogłoszenia (formularz
enter_announcement.php wypełniony danymi ogłoszenia). Na zmiennej
$_SESSION['full_announcement_no'] przekazywany jest numer ogłoszenia w bazie. Na
stronie z podsumowaniem jest też link do strony głównej (żeby móc DODAĆ nowe
ogłoszenie):

<img src="images/home.png"><a href="java script:goToMain();">Powrót na stronę
główn±</a>

Nie mogłem zrobić po prostu href="enter_announcement.php" bo wtedy
przechodziłoby się do edycji ogłoszenia o numerze
$_SESSION['full_announcement_no'] a nie do dodawania nowego.
Oto funkcja goToMain():

function goToMain() {
document.announcement.action = 'goto_main.php';
document.announcement.submit();
}

A oto plik goto_main.php:

<?php
require_once 'include/functions.inc.php';
session_start();
$_SESSION = array();
session_destroy();
headerLocation('enter_announcement.php');
?>

Jak widać aby przejść do dodawania ogłoszenia a nie modyfikacji, czyszczę
zmienną sesji.

Nie podoba mi się to rozwiązanie (użycie sztucznego pliku goto_main.php) ale nie
wymyśliłem lepszego. Czy macie jakiś lepszy pomysł jak rowiązać przechodzenie do
dodawanie ogłoszenia ze strony podsumowania żeby przy cofaniu się wstecz
otrzymywać edycję ogłoszenia?
wolacinio
rozumiem to tak za kazdym dodawaniem zmienna $_SESSION['full_announcement_no'] ma być inna ?

W pliku enter_announcement.php zrób cos takiego

  1. function kasuj(){
  2. }
  3.  
  4. echo kasuj();

RAM
Nie, przy dodawaniu ogłoszenia zmienna $_SESSION['full_announcement_no'] powinna być pusta. Dlatego czyszczę ją w goto_main.php. Numer ogłoszenia jest generowany w transakcji po submicie forumlarza z enter_announcement.php. Musi być tak zrobione, by generować kolejne numery ogłoszeń. Nie mogę generować numeru ogłoszenia w enter_announcement.php przed edycją formularza bo z góry nie wiem czy użytkownik nie zaniecha edycji i numer nie zostanie wykorzystany, co spowodowałoby "dziury" w numeracji, a to u mnie jest niepożądane.

> zrób cos takiego
Zmienna $_SESSION['full_announcement_no'] nie może być bo prostu wyzerowana, bo to by spowodowało, że przy cofaniu się ze strony podsumowania otrzymywalibyśmy dodawanie ogłoszenia, a ja chcę edycję istniejącego ogłoszenia, którego numer jest zapisany na $_SESSION['full_announcement_no'].
norbis
Jeśli dobrze zrozumiałem, to powinno rozwiązać Twój problem:

  1. <img src="images/home.png"><a href="enter_announcement.php?clear=1">Powrót na stronę główną</a>


w pliku enter_announcement.php:

  1. if(is_set($_GET['clear']))
  2. $_SESSION = array();


I jeszcze jedna kwestia na marginesie, z tego co opisałeś domyślam się, że masz straszną dziurę w skrypcie. Nie wiem w jaki sposób znasz numer ogłoszenia przed dodaniem, a już po wczytaniu strony, ale mam nadzieję, że wziąłeś pod uwagę to, że kilka osób na raz może dodawać ogłoszenie? smile.gif
RAM
Dokładniej rozwiązanie działa tak, że strona enter_announcement.php na submicie ma stronę submit_announcement.php, która na koniec dopiero wywołuje summary.php.
Oto szkic submit_announcement.php:

START TRANSACTION
LOCK TABLES announcements WRITE
if (empty($_POST['announcement_no'])) { // nowe ogłoszenie
$announcement = new Announcement;
$announcement->initializeWithPOST();
INSERT INTO announcements z nowym numerem MAX+1
} else { // modyfikacja ogłoszenia
$announcement = new Announcement;
$announcement->initializeWithPOST();
$announcement->initializeWithNumber($_POST['announcement_no']));
UPDATE announcements
}
UNLOCK TABLES
COMMIT
header('Location: summary.php');
wookieb
Po co robisz lokowanie tabelo przy transakcji??
RAM
ze względu na współbieżność (wielu użytkowników) przy generowaniu numeru kolejnego ogłoszenia
wookieb
A dlaczego nie korzystasz po prostu z autoincrement?
RAM
Bo numer ogłoszenia składa się z trzech części: rok, miesiąc, nr kolejny w miesiącu.
CuteOne
A zamiast babrać się w dodawanie miesiącÓw lecisz po ID [co jest nie tylko wygodne ale i wydajniejsze]

ps. nie możesz wstawić dodatkowego pola do session? Jeżeli ktoś rozpoczął edycje wstawiasz $_SESSION['edit_start'] = true; a przy zapisie sprawdzasz if(!$_SESSION['edit_start']) { //edytuj } else { //dodaj }
RAM
Przyznam jednak, że nie jestem pewien czy (pozostając przy mojej metodzie generowania numerów) lokowanie tabel wewnątrz transakcji jest potrzebne. Czy ktoś wie?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.