Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Parę pytań odnośnie php/mysql
Forum PHP.pl > Forum > Przedszkole
Ulysess
witam mam parę pytań a nie chciałem kilku tematu zakładać.

1. chciałbym na swojej stronie zrobić liste online osób pytanie jak..
wpadłem na pomysł aby w tabeli gdzie mam dane o koncie dodać pole w którym była by data unix ost odświeżenia przez tego użytkownika strony i np w podstronie online.php wyświetlał bym uzytkowników którzy odwiedzili jaką kolwiek stronę w ciągu np ost 15min.
wpadłem też na pomysł aby w oddzielnej tabeli przetrzymywać użytkoników online (tak abym nie musiał wyszukiwać rekordów w tabeli gdzie może być np kilka , kilkanaście tysięcy użytkowników, na chwile obecną mam 150) ALE.. to by si wiązało z tym że przy każdym odswieżeniu witryny musiał by sprawdzać czy już jest w tek tabeli a jeśli nie to dodawać rekord jeśli tak update czyli wiąże się to z 2 zapytaniami . które rozwiązanie jest lepsze , wydajniejsze questionmark.gif

2 sprawa do tej pory gdy chciałem edytować jakieś dane użytkownika np coś dodać odjąć wpierw pobierałem jego dane poprzez select następnie dodawałem /odejmowałem i robiłem update to jest lepsze rozwiązanie czy może bez selecta od razu np `gold`+'".$nagroda."' lub `gold`+'".mysql_real_escape_string($nagroda)."' questionmark.gif

3 skoro wiem że zmienna którą dodaje edytuje jest liczbą muszę używać mysql_real_escape_string questionmark.gif

4. Na wielu podstronach normalnie wyświetlały by się NOTICE ale że mam wył ich wyświetlanie nie pojawiaja się to bład questionmark.gif mogę je zlekceważyć czy najlepiej się ich pozbyć ?

5. chciałbym zrobić wyszukiwanie użytkownika po przez wpisanie w formularzu jego nicka jak zrobić to najlepiej , bezpiecznie questionmark.gif

to chyba tyle , jeśli będę miał jakieś pytania dodam jeszcze w tym temacie . z góry dziękuje za pomoc i o ile to możliwe proszę nie odsyłać mnie na angielskie strony.. smile.gif

#luq
1. Session Handler na bazię - gdzieś na wortalu jest chyba tego opis.
2. No tak, możesz robić zapytanie:
  1. UPDATE foo SET bar = bar + 5 WHERE fooId = 1

3. No właśnie, chodzi o to, że stosuje się mysql_real_escape_string bo to user wprowadza te dane do zapytania i to on jest tym który może zmienić tą zmienną
  1. SELECT * FROM foo WHERE userId = %zmienna_php%


Możesz w %zmienna_php% dać np.
Kod
1 OR 1=1


Możesz także dać
Kod
1 OR 1=2 UNION SELECT * FROM foo WHERE userLogin = 'luq'


Tak więc ja bym filtrował takie zmienne poprzez:
  1. intval( $foo )


4. Dobry programista nie chowa, warningów/noticów etc. tylko się ich pozbywa.

5. Filtrować wejście i wstawiać do zapytania no nic innego nie wymyślisz.
Ulysess
hmm session handler wygląda mi na skomplikowane :|.. zapewne chodzi ci o linka -> http://wortal.php.pl/wortal/artykuly/php/a...handler_czesc_i sam go znalazłem no i jeszcze na innym forum gdzie też umieściłeś smile.gif.

3) no tak ale jeśli zmienna jest z sesji pobierana questionmark.gif np id usera albo zmienna pochodzi z innej tabeli i na jej zawartośc nie miał user podglądu/edycji to też mam używaćquestionmark.gif

jest jakaś różnica pomiędzy abs a intval questionmark.gif oprócz tego że abs zamienia z ujemnych na dodatnie questionmark.gif

nowe pytanie

po zalogowaniu ustawiam np SESSION['zalogowany'] = 1 , SESSION['uzytkownik'] = $id;

to błąd że nie używam session_register questionmark.gif

i pytanie trochę z innej beczki .. parę dni temu szukając łamacza tokenów trafiłem na Twoją strone , skrypt jest super i działa ale mam pewien problem.. token zamieniany jest na literki (X,Y) ale nie wyświetla mi poniżej w 'normalnej' postaci np xxxxsdfsd , czym to jest spowodowane ? smile.gif
thek
ad1) INSERT INTO tabela (id_usera, czas) VALUES ($id_usera, $czas) ON DUPLICATE KEY UPDATE czas = $time
ad2) UPDATE tabela SET pole = pole + $ileś WHERE id = $jakis
Przy czym najlepiej jednak pobierać, jesli masz warunki na pola ustawione w stylu "wartość pola nie może zejść poniżej 0"
ad3) Dla pewności zawsze warto. Używanie przykładowo ctype lub filter_var dobrze już chronią, ale wszystko co dostajesz od usera należy traktować z nieufnością.
ad4) Dobry programista stara się wykluczać wszelkie niedoskonałości zamiast je maskować. Choćby dlatego, że zamaskowane w jednym miejscu mogą wpłynąć na działanie w innym miejscu skryptu w sposób jakiego nie przewidzieliśmy.
ad5) Aby zrobić to bezpiecznie musisz: po pierwsze - walidować zmienne z formularza, po drugie - walidować zmienne z formularza i po trzecie, choć wcale nie najmniej ważne - walidować zmienne z formularza smile.gif

ad3) Nigdy nie masz pewności CO i w jakiej postaci jest trzymane w bazie lub sesji i w jakiej formie te dane dostaniesz. Dlatego to także powinno być w jakiś sposób kontrolowane.

abs - wartość absolutna liczby
intval - konwersja zmiennej do postaci liczbowej
Różnica jest taka, że abs "usuwa" znak z liczb jeśli są ujemne, ale nie poradzi sobie w sytuacji, gdy ktoś mu za liczbę walnie "Ala ma kota". Zobacz co zrobi winksmiley.jpg A intval będzie starał w tym ostatnim przypadku skonwertować zmienną do liczby.

Co do session_register, to funkcja ta jest już od wersji PHP 5.3 uznana za przestarzałą. Nie powinno się jej używać. Twoja wersja jest prawidłowa.
Ulysess
hmm wielkie dzięki za pomoc ale co do tego abs się nie zgodzę.
  1. $a = intval('ala ma kota');
  2. $b = abs('ala ma kota');
  3. echo $a,$b;

wynik: 00
smile.gif

aha i zapomniałem ..

co do ad2 - wszystkie pola liczbowe mam ustawione na UNSIGNED , czyli rozumiem że pozostawić tak jak do tej pory miałem czyli wpierw selecy następnie operacji i update ?
#luq
Cytat(Ulysess @ 8.07.2010, 13:55:32 ) *
i pytanie trochę z innej beczki .. parę dni temu szukając łamacza tokenów trafiłem na Twoją strone , skrypt jest super i działa ale mam pewien problem.. token zamieniany jest na literki (X,Y) ale nie wyświetla mi poniżej w 'normalnej' postaci np xxxxsdfsd , czym to jest spowodowane ? smile.gif

A stworzyłeś modele? winksmiley.jpg Wszystko jest opisane na blogu, jeśli dalej będziesz miał jakiś problem to pisz na PW or email.

Cytat
co do ad2 - wszystkie pola liczbowe mam ustawione na UNSIGNED , czyli rozumiem że pozostawić tak jak do tej pory miałem czyli wpierw selecy następnie operacji i update ?


A co niby zmienia pole typu UNSIGNET INT? Od razu UPDATE`a wal.
Ulysess
ok poczytam ale później. wracając do tematu czy do filatracji nazwy użytkownika wystarczą te 2 funkcje - htmlspecialchars oraz addslashes questionmark.gif
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.