Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ponowny zapis do bazy po odświeżeniu strony
Forum PHP.pl > Forum > Przedszkole
odo
Dane z formularza przekazuję do strony na której zapisuję je w bazie:
<?php
mysql_query("INSERT INTO tabela VALUES ...")...
?>

Po odświeżeniu tej strony dane zostają ponownie zapisane. Jak się przed tym zabezpieczyć?

Wiem, że po zapisaniu danych mogę skorzystać z przekierowania do innej strony: Header("Location: plik.php")

Ale może jest inna metoda
mike
Jeśli koniecznie chcesz ominąć header() to możesz:
1. Po każdym zapisie ustawiać datę zapisu w sesji i przy ponownej próbie sprawdzać, jeśli to było dalej niż nimutę temu to pozwalasz na zapis.
2. Przed każdym zapisem sprawdzać czy taki rekord w tabeli istnieje;
3. Założyc klucze unikalne na pola w tabeli i przechwytywać wyjątki z bazy;

Zbierze się pewnie jeszcze klika pomysłów, ale header() jest najprostsze.

Choć sam używam przeważnie rozwiązania z pkt. 3.
ActivePlayer
mozna tez ustawiac cookies smile.gif tylko po co snitch.gif
odo
Dzięki za odpowiedź mike_mech

Mogę prosić o rozwinięcie tego punktu: Założyc klucze unikalne na pola w tabeli i przechwytywać wyjątki z bazy;
mike
To będzie przykład dość poglądowy (jest to jakiś skrawek jednej z moich aplikacji):
  1. <?php
  2.  
  3. // ...
  4.  
  5. try
  6. {
  7.  
  8. $objModel->addQuestion();
  9.  
  10. }
  11. catch( SQLException $objException )
  12. {
  13.  
  14. switch( $objException->getCode() )
  15. {
  16.  
  17. case 1062 : 
  18. $objRequest->setError( 'question', 'Takie pytanie już istnieje.' );
  19. break;
  20.  
  21. default : 
  22. $objRequest->setError( 'error', 'Nie można dodać pytania.' );
  23. break;
  24. }
  25.  
  26.  
  27. return View::ERROR;
  28.  
  29. }
  30.  
  31. //...
  32.  
  33. ?>


Klasa obiektu $objQuestion przy dodawaniu artykułu korzysta z AdoDB, które to wyrzuca wyjątek, jeśli wykonywane jest zapytanie, naruszające unikalność pól w tabeli z artykułami.

Kodem naruszenia takiej unikalności jest kod MySQL'a 1062.

A tabela z pytaniami może wyglądać tak:
  1. CREATE TABLE `faq` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `languageId` int(2) NOT NULL DEFAULT '0',
  4. `position` int(10) NOT NULL DEFAULT '1',
  5. `question` varchar(255) NOT NULL DEFAULT '',
  6. `answer` text NOT NULL,
  7. PRIMARY KEY (`id`),
  8. UNIQUE KEY `question` (`languageId`,`question`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Czyli nie może być rekordu o takiej samej kombinacji id języka i pytanie.
Kristof
A ja bym w najprostszy sposob zastosowal header() ale nie moge bo juz raz jest uzyty i wyskakuje blad. wyglada to mniej wiecej tak:

require "include.php";
menu(); //tu jest zawarty juz header
----dalsza czesc pliku

i nie moge podac headera w dalszej czesci pliku bo wyskakuje blad. Jak sobie z tym poradzic ?
LBO
ob_start" title="Zobacz w manualu php" target="_manual i powiązane funkcje.
surf
tez mialem taki problem i wpadlem na pewien pomysl w sumie dzieki podpowiedzi miłej TomASS przy okazji dzięki ;]

każdorazowy wpis tworzy tymczasowy plik w którym umieszczana jest zawartość jego treści

dalej na początku skryptu obsługującego formularz dodaje coś takiego:

$a=fopen("temp.txt","r");
$temp=fread($a, filesize("temp.txt"));
fclose($a);

i dalej

if ($polewpisow == $temp)
{echo("to odświerzenie nie doda drugi raz tego samego wpisu ha")}

else{echo("i tu caly skrypt obsługujący formularz");}

$a=fopen("temp.txt","w");
fputs($a, $polewpisow);
fclose($a);

gdzie
$a jest prypadkowa
$polewpisow jest zmienna tresci z formularza

-------------
a wiec skrypt nie zostanie wykonany jeśli treść pliku temp.txt będzie taka sama jak zmiennej polawpisów
w innym wypadku skrypt bedzie wykonywany

na koncu otwieranie na nowo pliku i zapisywanie w nim wartości z nowej zmiennej itd. już to koniec z koszmarami odświeżania.
dzieki pap


-------------------------
odkopywanie wątku tak starego
to mało lubiana tutaj praktyka
do tego jeszcze brak ogonków
no i poprawiony ort
~Cienki1980

i bark bbcode
~kwiateusz
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.