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
16.10.2010, 22:25:58
rozumiem to tak za kazdym dodawaniem zmienna $_SESSION['full_announcement_no'] ma być inna ?
W pliku
enter_announcement.php zrób cos takiego
function kasuj(){
}
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
18.10.2010, 06:49:24
Jeśli dobrze zrozumiałem, to powinno rozwiązać Twój problem:
<img src="images/home.png"><a href="enter_announcement.php?clear=1">Powrót na stronę główną
</a>
w pliku enter_announcement.php:
if(is_set($_GET['clear']))
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?
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
2.11.2010, 06:56:13
Po co robisz lokowanie tabelo przy transakcji??
ze względu na współbieżność (wielu użytkowników) przy generowaniu numeru kolejnego ogłoszenia
wookieb
2.11.2010, 08:45:55
A dlaczego nie korzystasz po prostu z autoincrement?
Bo numer ogłoszenia składa się z trzech części: rok, miesiąc, nr kolejny w miesiącu.
CuteOne
12.11.2010, 08:38:29
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 }
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.