Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Closed TopicStart new topic
> Ponowny zapis do bazy po odświeżeniu strony
-odo-
post
Post #1





Goście







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
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


mozna tez ustawiac cookies (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) tylko po co (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
-odo-
post
Post #4





Goście







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;
Go to the top of the page
+Quote Post
mike
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Kristof
post
Post #6





Grupa: Zarejestrowani
Postów: 33
Pomógł: 1
Dołączył: 15.12.2005

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
LBO
post
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


ob_start" title="Zobacz w manualu php" target="_manual i powiązane funkcje.
Go to the top of the page
+Quote Post
surf
post
Post #8





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 24.02.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Closed TopicStart new topic
3 Użytkowników czyta ten temat (3 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.10.2025 - 20:37