Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]$_GET różne zastosowanie?
Forum PHP.pl > Forum > Przedszkole
SkeraPL
Witam to jest mój pierwszy post biggrin.gif Dział chyba dobry, ale tradycyjnie, jak zły to proszę o przeniesienie biggrin.gif

Mam problem. Robię taki w miarę amatorski bo sam jestem amatorem; sklep do mojej serwerowni biggrin.gif Opieram go o html/css/php. Pisze do niego własne skrypty (czasami wykorzystuję to co w necie, ale rzadko bo sam wymyślam) i teraz piszę system NEWS i tu mam problem ale nie z samym systemem news. Problem jest ponieważ chcę napisać archiwum.php, w którym będzie lista wszystkich newsów i do niego dałem taką zmienną dotyczącą kategorii newsa $_GET 'kat' o wartościach 'promocja', 'nowosc', zmiana'; oraz chcę podzielić to archiwum na strony po 10 wpisów więc dałem również $_GET: 's' (strona) o wartości równej stronie. no i mam taki problem, bo podzielenie na kategorie to MOŻLIWOŚĆ nie wymagana więc chcę aby jeżeli dzielenie nie będzie wybierane to strony można było zmieniać normalnie np. archiwum.pgp?s=1, a kiedy będzie z kategorią to żeby rozróżniało i pisało np. archiwum.php?kat=nowosc&s=2. Mam nadzieję, że to moje rozpisanie pozwoli Wam jakoś zrozumieć mój problem i mi pomoże.

Pozdrawiam.
b4rt3kk
Sprawa jest prosta, wystarczy sprawdzić czy zmienna $_GET['kat'] istnieje (opcjonalnie czy przechowuje poprawną wartość) i w zależności od tego generować link.

  1. if (isset($_GET['kat'])) $link = 'archiwum.php?kat=' . $_GET['kat'] . '&strona=' . $strona; else $link = 'archiwum.php?strona=' . $strona;


EDIT: o jeden nawias za mało.
SkeraPL
Dobra, przyznam się bez bicia smile.gif Że na takie rozwiązanie z użyciem if nie wpadłem, może dlatego, że ślęczę nad tą stroną (całościowo nie tylko nad news) dosyć długo biggrin.gif Ale wielkie dzięki za to smile.gif

No to fajnie, ale teraz mam nowy problem biggrin.gif Chcę zrobić stronę wielojęzyczną więc myślę sobie zrobię tak: domena.pl/index.php?lang=en&innazmienna=wartosc[...]. No tak niby wszystko ładnie ale mam problem biggrin.gif No bo domyślnym językiem będzie Polski i chcę aby strona wykrywała czy jest już własnie np. ta zmienna ?lang. W sensie jeżeli będzie JAKAKOLWIEK zmienna już w nagłówku (domena.pl/index.php?zmienna=wartosc) aby następna zmienna była dopisana już z znacznikiem "&", a jeżeli nie będzie żadnej zmiennej w nagłówku to żeby zmienna dopisała się z znacznikiem "?". I aby przechodzą na następną stronę jakimś guzikiem w menu jeżeli są zmienne w nagłówku one też przechodziły na następną stronę.

Pomocy.
viking
No to znajdź w adresie & albo ? i w zależności od tego co występuje generuj odpowiedni link. Albo sprawdzaj czy _GET jest jakąś tablicą niepustą.
SkeraPL
Sprawdzanie czy $_GET jest pusta będzie tak wyglądać?
  1. if($_GET != ''){
  2. //Kod
  3. }

A w takim wypadku jak dodać do adresu linijkę i jak pobrać całą tablicę $_GET aby dodać ją do menu?
!*!
Cytat(SkeraPL @ 14.10.2012, 15:22:52 ) *
Sprawdzanie czy $_GET jest pusta będzie tak wyglądać?
  1. if($_GET != ''){
  2. //Kod
  3. }

A w takim wypadku jak dodać do adresu linijkę i jak pobrać całą tablicę $_GET aby dodać ją do menu?

Nie. isset() empty()

Nie bardzo rozumiem po co chcesz operować & i ? w URI.
SkeraPL
Potrzebna jest wiadomość czy np. jest w tablicy $_GET zmienna "lang" i jeżeli jest to do menu dopisać aby po kliknięciu w dany link po za domena.pl/podstrona.php bylo jeszcze tez dopisane ?lang=en, chyba, że da się to łatwiej zrobić.

I żeby jeżeli jest np. dana strona podzielona na dodatkowe podstrony w sensie domena.pl/podstrona.php?s=2, i jeżeli będę na tej stronie (domena.pl/podstrona.php) w wersji Angielskiej (?lang=en) po czym kliknę na przejście dalej ($s=2) to żeby nie wymazywało zmiennej lang tylko dodało zmienną s albo jeżeli nie ma zmiennej lang napisało tylko ?s, oczywiście zamiast lang może być każda inna zmienna, więc żeby wykrywało to.
!*!
Napisz funkcje która będzie to robić.

  1. function link($link)
  2. {
  3. if(isset($_GET['lang']))
  4. {
  5. $new_link .= '?lang='.$_GET['lang'];
  6. }
  7. }
  8.  
  9. <a href=link('link')> // efekt ?lang=pl&link

Oczywiście w dużym uproszczeniu, pokombinuj z tym.
SkeraPL
A może zadziała coś takiego?

  1. <?
  2. if(isset($_GET)){
  3.  
  4. $get = $_GET;
  5. $get .= '&s=' .$strona;
  6.  
  7. } esle {
  8.  
  9. $get = '?s=' .$strona;
  10.  
  11. }
  12. ?>
  13. <a href="domena.php<? echo $get; ?>">2</a>
fate
witam co by nie tworzyc nowego zapytam tu,

do wyswietlania podstron uzywam takiej knstrukcji:

  1. <?php
  2. // zmienna $show przekazana metoda GET
  3. $show = $_GET['show'];
  4. // sprawdzamy czy zmienna $id nie jest pusta
  5. if(!empty($show))
  6. {
  7. // sprawdzamy czy plik o danej nazwie (php) znaki cyfry - istnieje
  8. if( (file_exists("$show.php")) && (preg_match('|^[[:alnum:]-]+$|', $show)) ) include "$show.php";
  9. // jezeli plik nie istnieje wyswietla się komunikat
  10. else include '404.php';
  11. }
  12. // jezeli zmienna $id jest pusta wyswietla się strona glowna
  13. else include 'news.php';
  14. ?>


Linki wygladaja tak:

CODE
a href="index.php?show=


Dlaczego nie działa linkowanie w przypadku wpisania:

CODE
a href="index.php?show=XXX/YYY


czyli plik zaglebiony w folderze co_jest.gif
Uwazalem iz ten fragment jest winny:
CODE
&& (preg_match('|^[[:alnum:]-]+$|', $show))

ale po usunieciu tej czesci zamiast wczytywac mi 404.php po prostu nie wyswietlalo nic nawet błędu..

Czego ja nie wiem a wiedzieć powinienem graduated.gif z góry dziex!


!*!
@up
  1. var_dump(preg_match('|^[[:alnum:]-]+$|', $show))
Wyrażenie jest złe, podobnie jak cały skrypt, wpisując link mogę skakać po plikach i katalogach? wink.gif
SkeraPL
Mój skrypt nawet działa
  1. if(!empty($_GET)){
  2.  
  3. $get = $_GET;
  4. $get .= '&s=' .$strona;
  5.  
  6. } else {
  7.  
  8. $get = '?s=' .$strona;
  9.  
  10. }

ale nie ma opcji przypisania $get = $_GET; więc może mi ktoś podać jak przypisać do zmiennej wszystkie informacje z $_GET?

Problem załatałem w taki sposób:
  1. <?
  2. $strona = 2;
  3.  
  4. if(isset($_GET)){
  5.  
  6. $get = $_SERVER['QUERY_STRING'];
  7. $get .= '&s=' .$strona;
  8. } else {
  9.  
  10. $get = 's=' .$strona;
  11.  
  12. }
  13.  
  14. ?>
  15. <a href="index.php?<? echo $get; ?>">2</a>

Tylko w tym wypadku za każdym razem dopisuje się $s=2, jak można sprawić aby jeżeli wykryje, że już istnieje dana zmienna to ją podmieniło, a nie dodawało ponownie?
b4rt3kk
Nieco inna metoda przepisania zmiennych GET:

  1. $link = '?';
  2. foreach($GET as $key => $value) {
  3. if ($key == 's') $link .= $key = 'jakas_wartosc'; else $link .= $key . '=' . $value; // możesz wstawić dowolny warunek, zarówno dla tej jak i innych zmiennych GET
  4. if ($key < sizeof($_GET) $link .= '&';
  5. }
fate
!*!
Profesjonalista nie jestem... to co ratuje ten skrypt sesji musze sie uczyc zeby temu zapobiec czy jakos da sie naprawic inaczej i czemu nie da sie pliku z folderu zincludowac?
b4rt3kk
Cytat(fate @ 14.10.2012, 20:04:23 ) *
!*!
Profesjonalista nie jestem... to co ratuje ten skrypt sesji musze sie uczyc zeby temu zapobiec czy jakos da sie naprawic inaczej i czemu nie da sie pliku z folderu zincludowac?


Każdy wpisując tylko i wyłącznie nazwę pliku w pasku adresu może sobie zaincludować dowolny plik, choćby taki do którego nie powinien mieć dostępu. Dlatego jest to zły pomysł.
fate
to zrozumialem, ale pytalem jak temu zapobiec, edycja obecnego kodu czy od nowa i jak w sensie o czym poczytac Lkingsmiley.png
pzdr
b4rt3kk
Ja osobiście uważam że includowanie podstron to generalnie zły pomysł. Jeśli już musisz tak robić to sprawdź czy wartość GET jest zgodna z oczekiwaniami.

  1. $allowed = array('index.php', 'strona.php', 'inna_strona.php'); // itd. ogólnie tablica stron które mogą występować w GET i do których użytkownik może mieć dostęp
  2.  
  3. if (in_array($_GET['strona'], $allowed)) {
  4.  
  5. if ($_SERVER['HTTP_REFERER'] == 'poprzednia_strona') { // możesz też sprawdzić czy adres został wpisany ręcznie
  6. // zaincludowanie pliku
  7. } else echo 'przekierownie np. na index';
  8.  
  9. } else echo 'przekierownie np. na index';
fate
dzieki za sugestie, przemysle jak to zrobic.. i przeinacze zeby naprawic
a potrafi ktos wytlumaczyc dlaczego moge includowac tylko z biezacego folderu a jak dam sciezke/plik jako zmienna w GET to nie trybi i wyswietla mi 404.php? oneeyedsmiley02.png
bostaf
Cytat(fate @ 16.10.2012, 22:40:02 ) *
dzieki za sugestie, przemysle jak to zrobic.. i przeinacze zeby naprawic
a potrafi ktos wytlumaczyc dlaczego moge includowac tylko z biezacego folderu a jak dam sciezke/plik jako zmienna w GET to nie trybi i wyswietla mi 404.php? oneeyedsmiley02.png

Bo preg_match w linii 8 zwraca FALSE no i cały warunek kończy się elsem w linii 10: "else include '404.php';'.
!*!
Cytat(b4rt3kk @ 16.10.2012, 19:12:48 ) *
  1. $allowed = array('index.php', 'strona.php', 'inna_strona.php'); // itd. ogólnie tablica stron które mogą występować w GET i do których użytkownik może mieć dostęp
  2.  
  3. if (in_array($_GET['strona'], $allowed)) {
  4.  
  5. if ($_SERVER['HTTP_REFERER'] == 'poprzednia_strona') { // możesz też sprawdzić czy adres został wpisany ręcznie
  6. // zaincludowanie pliku
  7. } else echo 'przekierownie np. na index';
  8.  
  9. } else echo 'przekierownie np. na index';


Ewentualnie tak:

  1. if(isset($_GET['page']))
  2. {
  3. switch ($_GET['page'])
  4. {
  5. case 'index':
  6. include_once 'index.php';
  7. break;
  8. case 'forum':
  9. include_once 'forum/forum.php';
  10. break;
  11. case 'sendmail':
  12. include_once 'mail.php';
  13. break;
  14. default:
  15. include_once 'index.php';
  16. }
  17. }

Tym sposobem oddzielasz wartość GET od pliku.
fate
Dzięki prośba do autora tematu o plusy dla tych Panów. php.gif

bostaf
no właśnie tez tak myslalem ale jak usunę preg match to wywala mi to: (wczesniej kojarze ze byl blank nie wiem co zmienilem) brzydal.gif

CODE
Warning: include(./common.php) [function.include]: failed to open stream: No such file or directory in C:\Program Files\WebServ\httpd\NAOQ\forum\index.php on line 20

Warning: include() [function.include]: Failed opening './common.php' for inclusion (include_path='.;C:\php5\pear') in C:\Program Files\WebServ\httpd\NAOQ\forum\index.php on line 20

Warning: include(./includes/functions_display.php) [function.include]: failed to open stream: No such file or directory in C:\Program Files\WebServ\httpd\NAOQ\forum\index.php on line 21

Warning: include() [function.include]: Failed opening './includes/functions_display.php' for inclusion (include_path='.;C:\php5\pear') in C:\Program Files\WebServ\httpd\NAOQ\forum\index.php on line 21

Fatal error: Call to a member function session_begin() on a non-object in C:\Program Files\WebServ\httpd\NAOQ\forum\index.php on line 24


jak printuje zmienna ze sciezka to tez sie zgadza
i oczywiście forum/index.php istnieje zincludowalem plik forum.php z przekierowaniem na forum/index.php i wtedy działa ale dlaczego niby tak naokoło musze tego właśnie nie rozumiem..

w każdym razie wrzuce i przekminie kod który mi chłopaki podrzucili graduated.gif

Cytat(b4rt3kk @ 16.10.2012, 19:12:48 ) *
Ja osobiście uważam że includowanie podstron to generalnie zły pomysł. Jeśli już musisz tak robić to sprawdź czy wartość GET jest zgodna z oczekiwaniami.

  1. $allowed = array('index.php', 'strona.php', 'inna_strona.php'); // itd. ogólnie tablica stron które mogą występować w GET i do których użytkownik może mieć dostęp
  2.  
  3. if (in_array($_GET['strona'], $allowed)) {
  4.  
  5. if ($_SERVER['HTTP_REFERER'] == 'poprzednia_strona') { // możesz też sprawdzić czy adres został wpisany ręcznie
  6. // zaincludowanie pliku
  7. } else echo 'przekierownie np. na index';
  8.  
  9. } else echo 'przekierownie np. na index';


Pewnie nikt juz tego nieczyta ale dodam ze kilka dni minęło i zrozumiałem juz ten kod co kiedys tylko znalazłem sprawdzilem dzialanie i wstawilem i kumam co tam nie halo. Mam wiec inne pytania. Skoro includowanie get jest złe to czy istnieje alternatywa oprocz ramek i wczytywania całych stron z powtarzalnymi elementami menu i baner, bo nie znam?

i drugie prośba o wyjasnienie tego i podpowiedzi jak zrobic

  1. $_SERVER['HTTP_REFERER'] == 'poprzednia_strona') { // możesz też sprawdzić czy adres został wpisany ręcznie


blanki i dziwne komunikaty były winą niepoprawnej składni (nawiasy itd)
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.