Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Hej wam... Walczę od jakiegoś czasu z PHP i tym drugim no i napotkałem niesamowity fenomen :D Otóż:
Tak mniej więcej wygląda kod. Więcej nie trzeba i reszta wszystko działa.
... $var = pg_query($uchwyt,"SELECT * FROM forumphp WHERE login='$_GET[login]' OR email='$_GET[email]'"); $osoba = pg_fetch_all($var); $l=$osoba[0][login]; $e=$osoba[0][email]; if( ($l == $_GET[login]) || ($e == $_GET[email]) ){ echo "Login lub e-mail już istnieje w bazie. Proszę wybrać inne dane."; exit; }else{ echo "TWORZENIE OSOBY<br/>"; #pg_query($uchwyt,"INSERT INTO forumphp (imie,nazwisko,plec,login,email,haslo,status) VALUES ('$_GET[imie]','$_GET[nazwisko]','$_GET[plec]','$_GET[login]','$_GET[email]','$_GET[haslo]','U');"); echo "Rejestracja się powiodła!"; } ?>
No i teraz jest tam jeden komentarz #pg_query(...); I to jest ten fenomen. Jeśli jest tak jak teraz i warunek if'a ma wartość FALSE to wchodzi do else jak powinien, wyświetka komunikat "TWORZENIE OSOBY", no ale jej nie tworzy bo jest # (to nikogo nie dziwi).
Ale jeśli spełnię następujące warunki:
1. Wpiszę osobę (do rejestracji) która już kiedyś była (te same loginy hasła wszystko) w bazie PSQL tylko ją wywaliłem z jakiś tam powodów poleceniem (w innym pliku php, wogóle inna bajka):
pg_query($uchwyt, "DELETE FROM forumphp WHERE id='$_GET[id]'");
id typ SERIAL;
2. Odkomentuje powyższą linijkę pg_query(...).
To... Uwaga, uwaga (sam w to nie mogę uwierzyć):
Wyświetla komunikat z if'a i robi (bez komunikatow) to co jest w else... o_0 Tego jeszcze nie było nie? 2w1!! Niby działa poprawnie bo w bazie takiej osoby nie ma więc ją tworzy. Ale czemu bez komunikatu TWORZENIE OSOBY, no i czemu wyświetla komunikaty, że ta osoba już istnieje??
Pewnie mi nie uwierzycie, że tak jest, no ale po co miałbym kłamać... Sprawdziłem to (nie tylko ja) setki razy, i taki jest objaw...
Co wy na to?
Ostatnio edytowany przez P@blo (2011-12-14 14:41:21)
Offline
Po wywaleniu rekordu osoby sprawdzałeś czy nie istnieje inny rekord z taki e-mailem lub loginem? Jeśli wchodzi do kodu po spełnieniu warunku w if to na pewno nie wykonuje else, stąd nie masz komunikatu i nie robi inserta. Jeśli wydaje ci się, że robi to pewnie masz tam jeszcze innych użytkowników z takim loginem lub hasłem.
Offline
kamikaze napisał(-a):
Po wywaleniu rekordu osoby sprawdzałeś czy nie istnieje inny rekord z taki e-mailem lub loginem?
Aktualnie są tam 3 krotki więc jestem wstanie nad tym panować i nie ma innej osoby.
kamikaze napisał(-a):
Jeśli wchodzi do kodu po spełnieniu warunku w if to na pewno nie wykonuje else...
A jednak?
Ostatnio edytowany przez P@blo (2011-12-14 15:13:02)
Offline
A czy przypadkiem strona nie odświeża się po dodaniu nowej osoby? Wówczas najpierw wejdzie do else, wykona się odświeżenie, i za drugim razem wejdzie do if.
Offline
A jest tam jakiś komunikat w tym else o odświeżaniu? Jeśli pg_query tak działa, że najpierw wykonuje a potem odświeża stronę to miałbyś rację, ale chyba tak nie jest... Poza tym twoje rozumowanie nie tłumaczy faktu, dlaczego nie wyświetla komunikatu z else, bo jak pisałem wykonuje tylko pg_query a echa są z if'a...
Offline
Nie znamy całej aplikacji dlatego możemy tylko gdybać. Sytuacja podpada mi pod podwójne wykonanie spowodowane np. odświeżeniem strony.
Dlaczego nie widać komunikatów z else? Ponieważ zanim przeglądarka je wyświetliła, otrzymała nową/odświeżoną stronę z komunikatami z if.
Dlaczego nastąpiło odświeżenie? Przychodzi mi do głowy kilka możliwości:
- podwójne kliknięcie na link (jeżeli rejestracja odbywa się przez kliknięcie na link, a nie wysłanie formularza)
- odświeżenie strony HTML, np. <meta http-equiv=”refresh” content="...">
- odświeżenie strony przez JavaScript, np. window.location.href =unescape(window.location.pathname);
- odświeżenie strony przez PHP (nagłówki HTTP), np. header( "refresh:5;url=register.php" ); header('Location: http://www.example.pl');
Zalecałbym podejrzenie komunikacji przeglądarki z serwerem.
Offline
No też nie chce umieszczać całego kodu... Nie mam javy, nie mam header(...), nie mam klików, bo mam formularz. Odświeżam stronę przez <meta...>, ale we wcześniejszych ifach, lecze też mam pewność że do nich nie wchodzi.
EDIT:
Tak dokładnie odświeżam, ale podkreślam, że ta składnia jest prze tym wszystkim w kilku ifach do których nie wchodzi więc wątpię, że one się wykonują np:
... if( $_GET[haslo] != $_GET[p_haslo] ){ echo "Hasła różnią się. Wpisz obydwa te same."; echo '<meta http-equiv="refresh" content="3; http://inna_strona.pl" />'; exit; } ...
Ostatnio edytowany przez P@blo (2011-12-14 18:36:22)
Offline
Może włącz raportowanie błędów w PHP. Nikt nie pisał o Javie.
Offline
Chodziło mi o javascript. Może źle się wyraziłem... A jak to się włącza to raportowanie? No i co by miało być błędem? Wg mnie nie ma błędów składniowych, to co by miał krzyczeć...
Offline
Na samym początku skryptu:
error_reporting(E_ALL);
ini_set('display_errors', true);
Offline
Ok... Długo nie pisałem za co przepraszam...
Okazało się, że serwer na którym pisałem skrypt, z dziwnych przyczyn czasami złapie zawieche. Tzn działa, ale CTRL+R na stronie nie odświeża jej tak jakbyśmy chcieli (szybko), no i z tego są błędy. Ja to rozumiem tak jakby kod 'nakładał' się na siebie. Zły i dobry. Wygląda to w ten sposób, że np piszemy if'a (tak jak ja) serwer złapie zawieche, potem zmieniamy warunek w ifie no ale on pamięta jakiś czas tego starego...
Może ktoś wie co jest nie tak? Słyszał o takim problemie? Może bym adminowi coś powiedział, żeby coś tam dorobił, pozmieniał, bo z tego co słyszałem wszystkich to denerwuje, ale nikt nie wie co to jest... Jak trzeba jakieś configi to może będę mógł podejrzeć (nie wiem czy mam do tego taką 'moc').
A może to jest normalne???
Nie znam się na tym kompletnie (stawianie serwerów), raczej je wykorzystuje. To też potraktujcie mnie ulgowo :)
Offline
a moze zacznij od tego ze napiszesz skrypt porzadnie i porzadnie zaprojektujesz baze? czy pola login i email sa unique ? jesli nie to masz problem z race condition. a jesli tak , to po prostu rob inserta i jesli zwroci blad ze jest duplikat to am wiesz. zadne selekty nie sa potrzebne
Offline