| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
dragosm
Data înscrierii: 04/Dec/2003
Mesaje: 2
Locație: Bucuresti
|
| Trimis: Joi Dec 04, 2003 1:24 pm Titlul subiectului: Dublarea inregistrarilor la "Refresh" |
|
|
| Am un formular de adaugare a unor date.Dupa ce utilizatorul apasa butonul "Adauga", informatiile sunt adaugate in baza de date.Totul ok pana aici, insa daca cineva da "Refresh" din click dreapta informatiile sunt dublate in baza de date ! |
|
| Sus |
|
ottonel
Data înscrierii: 03/Dec/2003
Mesaje: 5
Locație: Brasov
|
| Trimis: Joi Dec 04, 2003 1:38 pm Titlul subiectului: |
|
|
asa este, ai dreptate :D . aceeasi problema o am shi eu.
intrebare:
se poate ca atunci cind fac refresh pe o pagina de genul "index.php?action=insert" sa nu se ia in considerare actiunea de inserare? :?: |
|
| Sus |
|
dragosm
Data înscrierii: 04/Dec/2003
Mesaje: 2
Locație: Bucuresti
|
| Trimis: Joi Dec 04, 2003 1:48 pm Titlul subiectului: |
|
|
| am primit o solutie de la un prieten, dar nu imi pare viabila....el spune sa verific tot timpul baza de date sa vad daca nu se repete inregistrarile...dar eu am tabela cu zeci de mii de inregistrari si cu 10 campuri...nu pot sa fac verificarea asta la fiecare adaugare.... |
|
| Sus |
|
DrStupid
Data înscrierii: 14/Iul/2003
Mesaje: 71
Locație: Oradea
|
| Trimis: Joi Dec 04, 2003 2:50 pm Titlul subiectului: |
|
|
| Pai are dreptate prietenul tau , sa faci o inteogare care sa verifice daca se dubleaza datele din baza de date ... daca nu sa bage informatiile in baza de date si daca da sa apare un mesaj de eroare ... |
|
| Sus |
|
ottonel
Data înscrierii: 03/Dec/2003
Mesaje: 5
Locație: Brasov
|
| Trimis: Joi Dec 04, 2003 3:03 pm Titlul subiectului: |
|
|
eu am observat o chestie:
plec de la pagina add_new unde am o forma pe care o submitez si apelez aceeasi pagina cu request in coada add_new?action=insert . inregistrarea se face in tabela shi apoi afisez ce am in tabela. pagina curenta este add_new?action=insert - daca fac refresh (oricum buton,F5, s.a.) primesc mesajul ca fereastra nu poate fi refreshata decit daca retrimite informatziile, adica face iarasi submit la formul din add_new: rezulta o noua inregistrare in tabela cu aceleasi informatii.
poate te ajuta chestia asta. succes |
|
| Sus |
|
lupuleine
Data înscrierii: 18/Iun/2003
Mesaje: 11
Locație: Timisoara
|
| Trimis: Joi Dec 04, 2003 5:22 pm Titlul subiectului: |
|
|
solutia care o ofer este valabila numai in cazul in care metoda folosita este GET adica daca se pun la capatul fisierului stuff-uri de genu add.php?idx=2&name=orice o solutie usor de aplicat si care nu incruca pe nimeni ar fi
if ($REQUEST_URI!=$PATH_INFO)
{
Header("Location:".basename($PATH_INFO));
}
pe de alta parte daca oricare din campurile din baza de date este unic de felul lui nu prea cred ca se mai introduce inregistarea
mai bat capu sa gasesc o solutie cu post-urile |
|
| Sus |
|
biban
Data înscrierii: 13/Apr/2003
Mesaje: 204
Locație: Giurgiu
|
| Trimis: Dum Dec 07, 2003 11:44 am Titlul subiectului: |
|
|
uite cum va propun eu sa faceti:
presupunem ca aveti un formular cu un buton submit cu numele adauga
pagina pe care se afla butonul se numeste pagina.php
pagina.php?adauga=submit&alte_informatii_trimise_spre_adaugare va avea ca rezultat adaugarea de informatii in baza de date.
deci undeva in pagina.php vei avea un cod de genul
...
if($adauga)
{
adauga inregistrarile
}
.....
restul scriptului
.....
Va propun ca in if-ul de mai sus , inainte de inchiderea acoladei, sa faceti o redirectionare a browserului catre pagina.php, fara nici un alt parametru.
Astfel, cand se va da refresh se va da direct pagina.php, nu pagina.php?..... |
|
| Sus |
|
iugin
Data înscrierii: 22/Mai/2003
Mesaje: 82
Locație: Oradea
|
| Trimis: Dum Dec 07, 2003 7:37 pm Titlul subiectului: |
|
|
E OK solutia lui Biban dar ideea simpla in chestia asta e sa faci redirect.
In unele cazuri ca sa mearga if($adauga) trebuie sa apesi efectiv pe buton, daca esti intrun camp text nu o ia in considerare(am patit).
Cel mai simplu elegant si corect dupa parerea mea e sa faci pagini care adaauga si pagini care afiseaza. La cele care adauga nu tiparesti nimic ssi la final dai un redirect undeva, altfel sunt baiuri |
|
| Sus |
|
lupuleine
Data înscrierii: 18/Iun/2003
Mesaje: 11
Locație: Timisoara
|
| Trimis: Lun Dec 08, 2003 12:45 pm Titlul subiectului: |
|
|
asha doar din pura curiozitate a incerc cineva sa puna chestia asta in pagina dupa ce se fac adugatile in baza de date ?!? numa asha sa vedeti ce efect are ?
//adaugi info in baza de date dupa care bagi linia de mai jos
if ($REQUEST_URI!=$PATH_INFO)
Header("Location:".basename($PATH_INFO)); |
|
| Sus |
|
Zamolxe
Data înscrierii: 14/Ian/2003
Mesaje: 126
Locație: Bucharest
|
| Trimis: Mar Dec 23, 2003 6:13 pm Titlul subiectului: re |
|
|
Cod:
//begin cod HTML
//formular aici unde se baga date
//Nume: ___________
//Prenume: _________
//Sex: _________
//Varsta: _________
[ADAUGA] //buton
//end cod HTML
//urmeaza validarea PHP
if($_POST['adauga']="ADAUGA"){
$nume=$_POST['nume'];
$prenume=$_POST['prenume'];
$sex=$_POST['sex'];
$varsta=$_POST['varsta'];
//inseram userul in baza de date
mysql_query("INSERT INTO useri (nume, prenume, sex, varsta) VALUES ('$nume', '$prenume', '$sex', '$varsta')") or die(mysql_error());
//redirectam userul pe pagina index.php unde avem GET['msg']=1 si afisam mesajul 'Datele au fost introduse cu succes'
header("Location: ./index.php?msg=1");
exit();
}
codul de mai sus este teoretic, si l-am scris pentru a demonstra ca exista metode simple pentru a scapa de problema REFRESHULUI. nu am inclus masurile de securitate, si de validare a continului (nu era nevoie in exemplu).
-------------
pentru a evita inregistrarile duble, in caz ca sa zicem nu avem incotro, ne folosim de id-uri sau de o cautare in prealabil in baza de date. sa zicem la codul de mai sus inainte de mysql_query() deci de query-ul propriu-zis de inserare a userului, bagam urmatoarul cod:
$validare=mysql_query("SELECT COUNT(*) FROM useri WHERE nume='$nume' AND prenume='$prenume'");
$validare2=mysql_num_rows($validare);
if($validare2=>1){ //daca mai mare sau egal cu 1 atunci
echo("utilizatorul exista deja in baza de date");
exit(); //codul de sub acest if nu se executa.
} |
|
| Sus |
|
luciansabo
Data înscrierii: 04/Ian/2004
Mesaje: 49
|
| Trimis: Dum Ian 04, 2004 2:41 pm Titlul subiectului: |
|
|
As dori sa fac cateva consideratii generale. Sunt cateva greseli de conceptie ale paginilor PHP pe care le-am observat din raspunsurile date.
In primul rand daca discutam de introducerea unor date intr-o baza de date nu folosim niciodata metoda GET pentru trimitere. Are exact acest efect la refresh. Vom folosi POST si vom prelua cu $_POST["var"]
apoi redirectam catre o pagina cu mesaj de confirmare eventual.
Citat: asha doar din pura curiozitate a incerc cineva sa puna chestia asta in pagina dupa ce se fac adugatile in baza de date ?!? numa asha sa vedeti ce efect are ?
//adaugi info in baza de date dupa care bagi linia de mai jos
if ($REQUEST_URI!=$PATH_INFO)
Header("Location:".basename($PATH_INFO));
Variabilele se preiau corect cu $_SERVER["REQUEST_URI"]... majoritatea configuratiilor sunt cu REGISTER_GLOBALS=OFF, unde scriptul nu va functiona din acest motiv.
PATH_INFO se umple cu ceva util doar la apelarea scriptului in forma:
http://localhost/script.php/cale/fictiva
altfel e un string gol.
Deci conditia de la if va fi intotdeauna evaluata adevarat daca apelezi http://localhost/script.php?id=5. E ca si cum ai spune if("/script.php"!="")
sau if(1!=0) |
|
| Sus |
|
Zamolxe
Data înscrierii: 14/Ian/2003
Mesaje: 126
Locație: Bucharest
|
| Trimis: Dum Ian 04, 2004 4:45 pm Titlul subiectului: re |
|
|
propun o alta metoda care poate fi luata in considerare:
Cod:
<?php
if($_POST['adauga']=="Adauga"){
$nume=$_POST['nume'];
$prenume=$_POST['prenume'];
$*=$_POST['*'];
$varsta=$_POST['varsta'];
if(empty($nume) || etc...){
afisare_formular_html(); //functia de afisare a formularului html
exit();
}
$inserare=mysql_query("etc..."); //inseram userul
}
?>
functia afisare_formular_html() va contine un formular html a carui campuri vor contine valorile <?php echo($nume); ?> etc.. pentru a reafisa utilizatorului valorile introduse, dar si campurile pe care le mai are de completat.
Apelam exit() pentru a nu executa mysql_query() si a crea duplicate.
va rog sa ma corectati daca gresesc.
Serban |
|
| Sus |
|
luciansabo
Data înscrierii: 04/Ian/2004
Mesaje: 49
|
| Trimis: Lun Ian 05, 2004 11:18 pm Titlul subiectului: |
|
|
| Este foarte corecta abordarea. |
|
| Sus |
|
aniflaviu
Data înscrierii: 02/Mar/2004
Mesaje: 67
|
| Trimis: Mie Apr 07, 2004 7:24 am Titlul subiectului: |
|
|
o alta posibilitate de a scapa de dublarea integistrarilor la refresh, in functie de modul de construire al paginii web, este folosirea unui iframe la afisarea datelor
daca gresesc corectati-ma |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |