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ć):
[b]Wyświetla komunikat z if'a i robi (bez komunikatow) to co jest w else... o_0[/b] 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
[quote=kamikaze]Po wywaleniu rekordu osoby sprawdzałeś czy nie istnieje inny rekord z taki e-mailem lub loginem?[/quote]
Aktualnie są tam 3 krotki więc jestem wstanie nad tym panować i nie ma innej osoby.
[quote=kamikaze]Jeśli wchodzi do kodu po spełnieniu warunku w if to na pewno nie wykonuje else...[/quote]
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 [i]else[/i], wykona się odświeżenie, i za drugim razem wejdzie do [i]if[/i].
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.
[b]EDIT:[/b]
[url=http://forum.dug.net.pl/viewtopic.php?pid=187569#p187569]Tak dokładnie odświeżam[/url], 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
Time (s) | Query |
---|---|
0.00016 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00123 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.219.11.19' WHERE u.id=1 |
0.00102 | UPDATE punbb_online SET logged=1716008535 WHERE ident='18.219.11.19' |
0.00057 | SELECT * FROM punbb_online WHERE logged<1716008235 |
0.00126 | DELETE FROM punbb_online WHERE ident='185.191.171.5' |
0.00073 | DELETE FROM punbb_online WHERE ident='47.128.50.204' |
0.00083 | SELECT topic_id FROM punbb_posts WHERE id=190331 |
0.00174 | SELECT id FROM punbb_posts WHERE topic_id=20232 ORDER BY posted |
0.00069 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=20232 AND t.moved_to IS NULL |
0.00007 | SELECT search_for, replace_with FROM punbb_censoring |
0.00091 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=20232 ORDER BY p.id LIMIT 0,25 |
0.00095 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=20232 |
Total query time: 0.0102 s |