Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]osługa błędów js+php
Forum PHP.pl > Forum > Przedszkole
jacusek
Stworzyłem sobie plik wrzucający dane do bazy. Chcąc uniknąć powtarzania rekordów chciałem wymusić sprawdzenie czy dane osoby będące już w bazie (MYSQL) nie są już raz wpisane. Sprawdzam to na podstawie pytania:
  1. $sql="select concat(nazwisko,imie,rok_ur) dane_os from klienci where concat(nazwisko,imie,rok_ur)='$dane_os'";
  2. $result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

gdzie
  1. $dane_os=$_POST['nazwisko'].$_POST['imie'].$_POST['rok_ur'];

Wymyśliłem sobie, że będę informował użytkownika, żeby sprawdził czy dana osoba czasami nie jest już w bazie (a przecież te same nazwiska i rok urodzenia mogą się zdarzyć). Takie ostrzeżenie miałoby mieć formę komunikatu js w następującej formie:
  1. $result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));
  2. if(mysqli_num_rows($result)>0){
  3. $naz=$_POST['nazwisko'];
  4. $imn=$_POST['imie'];
  5. $tekst='Dane prawdopodobnie znajdują się w bazie. OK->wyszukiwarka, Anuluj->wpisze dane do bazy';
  6. $header="wyszukaj_robocze2.php?nazwisko=$naz&imie=$imn";
  7. echo "<script>if(confirm(\"$tekst\"))
  8. {
  9. window.location.href = '$header';
  10.  
  11. }
  12. else
  13. {
  14.  
  15. }
  16. </script>";
  17. }}

No właśnie - kiedy warunek jest spełniony to owszem pokazuje mi się informacja o konieczności sprawdzenia, ale kiedy potwierdzam to owszem przekierowuje mnie do wyszukiwarki, ale już z wpisanymi danymmi, czy ze zduplikowanym rekordem. Z kolei po naciśnięciu anuluj jest tak jak sobie założyłem - tzn wpisuje mi dane do bazy.
Cały problem wydaje się polegać na konieczności zatrzymania działania skryptu PHP przy spełnieniu tych warunków (tzn. przekierownia do wyszukiwarki). Niestety exit w js nie spełnia swojej funkcji. Czy może mi ktoś pomóc jak ten problem rozwiązać.
Z góry dziękuję.
ghost1511
Przecież JS działający w przeglądarce nie zatrzymuje działania PHP na serwerze. Musisz zdefiniować akcję po kliknięciu potwierdzenia która doda rekord do bazy. Pomijam już sposób sprawdzania czy dana osoba jest już w bazie który jest... hmm dziwny smile.gif
L0k0
Witam!

Po co robić sprawdzanie czy ktoś istnieje w bazie skoro może się zduplikować? Na jakiej podstawie określisz czy jednak ktoś ma być dodany czy nie?

Wg mnie to sprawdzanie traci sens. Nawet jeśli się ktoś powtórzy i dostaniesz komunikat to co wtedy? Poszukasz w bazie? Ale czego? A co z użytkownikiem, który takiej możliwości nie ma?

Jeśli coś może się potarzać sprawdzanie nie ma sensu.

Jeśli jednak patrzymy już czysto technicznie to sprawdzanie i działanie sprawdzania należy zrobić w PHP. Jak napisał Kolega wyżej - js nie zatrzyma PHP.
Musisz więc zrobić coś na sposób:

  1. if(cos_istnieje) { return false; } else { dodaj_do_bazy return true; }


Następnie na podstawie danych z return'a wyświetlasz odpowiedni komunikat o powodzeniu lub powtórzeniu.

Jeśli w przypadku wystąpienia powtórzenia mimo wszystko chcesz dodać do bazy to musisz obsłużyć kolejny element.

Według mnie najlepiej to zrobić przy użyciu Ajax'a i jQuery.

Pozdrawiam!

P.S. Rozwalił mnie tekst 'Dane prawdopodobnie znajdują się w bazie.' biggrin.gif
jacusek
Dlaczego uważasz, że taki sposób jest dziwny?W bazie mam aktualnie trochę powtórzonych rekordów. Masz jakiś lepszy pomysł, bo na niego nie wpadłem niestety. Po PESELu (jak mam) to już sprawdzam. Ale chętnie jakiś inny pomysł wdrożę.
Co do js to wiem, ze nie zatrzymuje php (to by było kompletnie nielogiczne) ale nie miałem pomysłu jak to inaczej zrobić dlatego napisałęm pierwszego posta.

Nie zauważyłem nowej odpowiedzi. smile.gif
@L0k0
pozwolę się nie do końca z Tobą zgodzić. To sprawdzanie chce wprowadzić po 2 latach prowadzenia bazy. Ludzie wpisujący różne rzeczy są z natury leniwi, a ja nie chcę dwa razy wpisywać do bazy tej samej osoby. To nie są jedyne dane, które posiadam (jest też adres, nr tel i inne), dlatego bez sensu po dwa razy wpisywać to samo.
A jeżeli ktoś się powtórzy to użytkownik, żeby sprawdzić jest przekierowywany do przeglądarki, gdzie może sobie zweryfikować czy osoba, którą wprowadza jest już raz wprowadzona (choćby po tych dodatkowych danych, które już posiadam). Właśnie dlatego napisałem, że dane PRAWDOPODOBNIE znajdują się w bazie.
Mimo wszystko dziękuję za sugestię i pozdrawiam
ghost1511
Chodziło mi o to że robisz konkatenację łańcuchów i po niej wyszukujesz rekordy. W ten sposób nie korzystasz m.in. z indeksów (o ile masz takie założone).

--edit
Poza tym jeżeli zbierasz numery pesel to dlaczego nie sprawdzasz czy taki jest już w bazie? W przeciwnym wypadku i tak nie masz pewności czy Jan Kowalski jest tym Janem Kowalskim którego masz już w bazie?
L0k0
No to sprawa wydaje się być bardzo prosta:

1. Sprawdzasz czy pewne dane już istnieją w bazie
2. Jeśli istnieją pobierasz rekord
3. Zwracasz rekord i wyświetlasz go w komunikacie (jakiś dialog czy coś)
4. Dialog posiada przyciski 'Dodać mimo wszystko' oraz 'Nie dodawaj'
5. Po wciśnięciu odpowiedniego wykonujesz kod PHP

Czyli masz PHP + jQuery (dialog) + Ajax (jedna funkcja).

Pozdrawiam!
jacusek
Już się tłumaczę wink.gif.
Po numerach PESEL też sprawdzam i tam oczywiście nie mam problemów - tylko nie zawsze ten numer PESEL posiadam (z różnych historycznych już powodów). W momencie kiedy sprawdzam PESEL to oczywiście nie sprawdzam już dalej konkatenacją, bo to rzeczywiście byłoby bez sensu.
W takim przypadku nie mogę założyć indeksów bo i na czym i jakich? Indeks ma na id rekordu, PESEL unique i właściwie to wszystko co ma sens żeby zrobić.

Z ajaxem czuję się słabo, wiem, że można to zrobić w ten sposób, ale muszę jeszcze doczytać smile.gif. Niemniej dziękuję za pomoc. Powalczę i mam nadzieję, że mi się yda.
ghost1511
No nie wiem... wydaje mi się że "klasyczny" sposób jest bardziej elastyczny i łatwiejszy do modyfikacji.

Co do AJAX'a to użyj np jQuery, które odwala za Ciebie 90% roboty związanej z ajaxem.
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.