Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Includowanie plików i przekazywanie wartości
Forum PHP.pl > Forum > PHP
elwierka
Piszę aplikację i w miarę dodawania nowych funkcji, zauważyłam pewien problem.
Do tej pory poruszanie się po stronie było możliwe dzięki linkom typu: www.adresstrony.pl/?a=costam

Za pomocą metody GET przekazywałam wartość i w zależności od niej, includowane są do strony różne pliki,
np:

  1. if(!empty($_GET)){
  2. switch($opcja) {
  3. case($opcja == $_GET['a']):
  4. if($_GET['a'] == 'zaloguj'){
  5. naglowek_logow('');
  6. wyswietl_zawartosc_www();
  7. wyswietl_form_logow();
  8. stopka_logow();
  9. exit();
  10. } elseif($_GET['a'] == 'wyloguj') {
  11. require_once('./wyloguj.php');
  12. exit();
  13. } elseif($_GET['a'] == 'przypomnij'){
  14. require_once('./form_zapomHaslo.php');
  15. exit();
  16. } else {
  17. echo '<h1>Błąd!</h1>Zły adres strony!';
  18. }
  19. break;
  20. case($opcja == $_GET['c']):
  21. if($_GET['c']=='home'){
  22. require_once( './zaloguj.php');
  23. } elseif($_GET['c']=='opcje'){
  24. require_once('./admin/opcje.php');
  25. } elseif($_GET['c']=='zmienHaslo'){
  26. require_once('./admin/form_zmianyhasla.php');
  27. } elseif($_GET['c']=='raporty'){
  28. require_once('./admin/raporty.php');
  29. } else {
  30. echo '<h1>Plik nie istnieje!</h1><br />';
  31. }
  32. break;
  33. default: echo 'Błąd. Strona nie istnieje.';
  34. }
  35.  
  36. ...


Powiedzmy, że chcę usunąć z bazy danych informacje o produkcie o id = x...
Niech skrypt do usuwania danych o produkcie jest dostepny pod linkiem www.mojastrona.pl/?d=usunProdukt (metodą GET pobierana jest wartość d=usunProdukt i dołączany jest plik obsługujący skrypt)...chcę też, żeby ten plik za pomocą metody GET pobierał również parametr id produktu, który ma usunąć
Przykładowo, klikam link o postaci www.mojastrona.pl/?d=usunProdukt&id=9

I tu właśnie pojawia się problem....

Skrypt działa i wykonuje polecenie poprawnie, ale :
1. chcę, żeby skrypt nie obsługiwał wartości wpisanych w adresie przeglądarki, a tylko wartości przekazane wcześniej metodą GET
2. Gdyby jednak nie udało się spełnić założenia 1, to chcę, aby skrypt rozpoznawał, czy istnieje produkt o podanym id i jeśli w adresie www.mojastrona.pl/?d=usunProdukt&id=9 będzie nieprawidłowy id, to pokaże komunikat, że jest zły adres lub nie ma produktu o takim id i nie można uruchomić usuwania produktu.
3. jaki warunek powinnam napisać, żeby sprawdzał czy jest wpisany prawidłowy adres www i wybierał odpowiednią opcję?
czy:
  1. if($_GET['d'] == 'usunProdukt'){
  2. //to wywołaj skrypt
  3. exit();
  4. }


czy może
  1. if($_GET['d'] == 'usunProdukt' && $_GET['id']){
  2. //to wywołaj skrypt
  3. exit();
  4. }


Zależy mi też na tym, żeby nawet po ręcznej zmianie wartości zmiennych w adresie www, skrypt nie wykonywał żadnych poleceń, tylko wywalał od razu błąd (zeby było zabezpieczone przed czymś takim, jak np. zmiana wartości zmiennych lub ich nazw
www.mojastrona.pl/?d=usunProdukt&zmienna=XXX
)

Chcę oczywiście uwzględnić fakt, że skrypt jest uruchamiany dopiero po sprawdzeniu, czy istnieje sesja zalogowanego użytkownika i czy użytkownik ten jest administratorem systemu.

Czy ewentualnie nie będzie problemu, jesli jednocześnie w skrypcie użyję metody i GET i POST, np. do linków GET, do wysyłania danych POST?
Tomplus
możesz wykorzystać formularze ale również wykorzystać sesję, czyli

  1. if($_GET['d'] == 'usunProdukt' && $_SESSION['id']){
  2. //to wywołaj skrypt
  3. exit();
  4. }


tylko wcześniej będziesz musiał umieścić w kodzie:

  1. if (isset($_GET['id'])) $_SESSION['id'] = $_GET['id'];


Blame
Cytat(elwierka @ 9.09.2010, 15:30:00 ) *
1. chcę, żeby skrypt nie obsługiwał wartości wpisanych w adresie przeglądarki, a tylko wartości przekazane wcześniej metodą GET

Tablica superglobalna $_GET zawiera właśnie wartości wpisane do okna przeglądarki, żadne inne.

Z całości twojego tekstu zrozumiałem, że chcesz się ustrzec od tego aby nikt niepożądany nie namieszał ci w bazie. Od razu mówię, że udostępnianie tego wszystkim, tak jak chcesz to zrobić, to czysta głupota. Najpierw trzeba pomyśleć o jakimś logowaniu na administratora opartego na sesje. Potem jeśli istnieje odpowiednia sesja pozwalasz na użytkownikowi na używanie skryptu, ew. zabezpieczasz się przed SQL Injection sprawdzając na przykład czy id podane w adresie jest liczbą. Nie trzeba aż tak kombinować winksmiley.jpg
elwierka
Jest logowanie do systemu i tylko administrator systemu ma dostęp panelu administracyjnego. W sumie powinno starczyć, ale tak na wszelki wypadek chcę, żeby nie można było sobie wprowadzić jakichś tam danych w pasku adresu, z palca, tylko zeby zmienne i wartości były przekazywane metodą GET do adresu tylko przez skrypt....czy da sie to jakoś zrobić?
Blame
Nie. Przecież mówiłem, że $_GET posiada parametry wprowadzone z paska adresowego. I IMHO zabezpieczanie skryptu przed administratorem strony można w twoim wypadku ograniczyć do zabezpieczenia przed SQL Injection tak jak napisałem wcześniej.
elwierka
OK rozumiem...w takim razie drążę temat dalej...Nie jestem tylko pewna, czy mogę w tym wątku...

utknęłam na pewnym etapie....
Pod adresem strony www.mojastrona.pl/?d=grupyTowarow znajduje się lista nazw wszystkich grup towarowych...(do pliku index.php includowany jest plik gt.php, który odpowiada za wyświetlanie listy grup towarowych).

Teraz chcę zrobić stronicowanie wyników ... wg książki którą się wspomagam, numery stron itd...przekazuję też metodą GET - ale już tu skrypt nie chce działać.
Nie wiem co zmienić, czy w ogóle dobrze zrobiłam, ze zdecydowałam się na poruszanie się po stronie za pomocą adresów ze zmiennymi GET, czy lepiej było zostawić adres w postaci normalnej...www.mojastrona.pl/strona1.php... itd....?

Oto mój kod - includowany plik - "gt.php"

  1. $tab_gt = wyswietl_wszGt();
  2. GTwyswietl($tab_gt);


oraz funkcje:
  1. function wyswietl_wszGt(){
  2. $lacz = con_to_db();
  3. $display = 5;
  4. // wyznaczenie numeru i liczby stron
  5. if(isset($_GET['nrStr'])){ //gdy ustalona
  6. $nr_strony = $_GET['nrStr'];
  7. } else { //ustalamy
  8. //zliczamy rekordy
  9. $zapytanie = "SELECT COUNT(*) as ile FROM grupa_towarow";
  10. $wynik = $lacz->query($zapytanie);
  11. $rzad = $wynik->fetch_object();
  12. $ilosc = $rzad->ile;
  13. echo 'Wyników na stronie: <b>' . $ilosc . '</b><br />';
  14.  
  15. //wyznaczanie liczby stron
  16. if($ilosc > $display){ //jeśli ilość jest większa niż wartość $display to wyświetla ilość stron
  17. $nr_strony = ceil($ilosc/$display); // funkcja ceil zaokrągla wynik dzielenia do całkowitej wyższej liczby
  18. } else {
  19. //w przeciwnym wypadku - jeśli jest mniejsza, to wystarczy 1 strona
  20. $nr_strony = 1;
  21. }
  22.  
  23. } // koniec instrukcji warunkowej dla zmiennej nrStr
  24.  
  25. //określam punkt początkowy wyników w bazie
  26. if(isset($_GET['startPage'])) {
  27. $start = $_GET['startPage'];
  28. } else {
  29. $start = 0;
  30. }
  31.  
  32. //zapytanie do bazy danych o grupy towarów
  33.  
  34. $zapytanie = "SELECT gt_id, opis, podkat_id from grupa_towarow ORDER BY opis ASC LIMIT $start, $display";
  35. $wynik = $lacz->query($zapytanie);
  36. if (!$wynik) {
  37. // throw new Exception('Brak danych w bazie danych.');
  38. echo 'Błąd zapytania. <br />';
  39. }
  40.  
  41. $ilosc = $wynik->num_rows;
  42. if($ilosc == 0){
  43. return false;
  44. echo 'Brak wyników! <br />';
  45. }
  46.  
  47. $wynik = kat_do_tablicy($wynik);
  48. return $wynik;
  49.  
  50. }
  51.  
  52. function kat_do_tablicy($wynik){
  53. $tablica = array();
  54. for($i=0; $rzad = $wynik->fetch_assoc(); $i++){
  55. $tablica[$i] = $rzad;
  56. }
  57. return $tablica;
  58. }

  1. function GTwyswietl($tab_gt){
  2. if(!is_array($tab_gt)){
  3. echo '<span>Brak dostępnych grup towarowych.</span>';
  4. return;
  5. }
  6. ?>
  7. <table class="form" cellspacing="1" cellpadding="5">
  8. <tr><td colspan="6">
  9. <form method="post" action="./admin/gt_usun_wsz.php">
  10. <input type="submit" name="usun" class="submit" value="Usuń wybrane" /></td></tr>
  11. <tr>
  12. <td><img src="./includes/img/delete.GIF" width="13" height="13" /></td>
  13. <td><h3>Id grupy towarów</h3></td>
  14. <td><h3>Nazwa</h3></td>
  15. <td><h3>Przypisana do</h3></td>
  16. <td colspan="2"><h3>Akcja</h3></td>
  17. </tr>
  18.  
  19. <?php
  20. //nrStr
  21.  
  22. $bg = '#ffffff;';
  23.  
  24. foreach($tab_gt as $rzad){
  25. $bg = ($bg == '#ffffff'? '#f4f7f8' : '#ffffff');
  26. echo "<tr style=\"background-color:".$bg.";\">
  27. <td><input type=\"checkbox\" name=\"wybrano[]\" value=\"".$rzad['gt_id']."\" /></td>
  28. <td>";
  29. echo $rzad['gt_id'];
  30. echo '</td><td>';
  31. $url = "pokaz_gt.php?idgt=".($rzad['gt_id']);
  32. $tytul = $rzad['opis'];
  33. tworz_HTML_URL($url, $tytul);
  34. echo "</td><td>";
  35. $nazwa = pobierz_nazwe_podkat($rzad['podkat_id']);
  36. echo $nazwa;
  37. echo "</td><td>";
  38. $url1 = "?f=GtEdytuj&idgt=".($rzad['gt_id']);
  39. $url2 = "?f=GtUsun&idgt=".($rzad['gt_id']);
  40. tworz_HTML_URL($url1,'Edytuj');
  41. echo "</td><td>";
  42. tworz_HTML_URL($url2,'Usuń');
  43. echo "</td></tr>";
  44.  
  45. }
  46. echo "</form></table>";
  47.  
  48.  
  49. //utwórz łącza do innych stron jeśli to konieczne
  50. if($nr_strony>1){
  51. //echo '<br /><p>';
  52. //Określamy bieżącą stronę
  53. $biezaca_str = ($start/$display) + 1;
  54. // jeśli nie jest to pierwsza strona, tworzę łącze do poprzedniej
  55. if($biezaca_str != 1){
  56. $url = "?d=grupyTowarow&startPage=".($start - $display) . "&nrStr=" . $nr_strony;
  57. tworz_HTML_URL($url,'Poprzednia');
  58.  
  59. }
  60. // łącza dla pozostałych stron:
  61. for($i=1; $i <= $nr_strony; $i++){
  62. if($i != $biezaca_str){
  63. $url = "?d=grupyTowarow&startPage=".(($display * ($i-1))) . "&nrStr=" . $nr_strony;
  64. tworz_HTML_URL($url,$i);
  65. } else {
  66. echo $i . ' ';
  67. }
  68. }
  69. if($biezaca_str != $nr_strony){
  70. echo '<a href="?d=grupyTowarow$startPage='. ($start + $display) . '&nrStr=' . $nr_strony . '">Następna</a>';
  71. }
  72. echo '</p>';
  73. }
  74.  
  75.  
  76. }


Od razu mówię: z wyświetlaniem wyników nie ma najmniejszych problemów. Problem jest ze stronicowaniem.
Może coś pominęłam...
kuba32
  1. <?php
  2. $str=$_GET['str'];
  3. if($str==0){$str=1;}
  4. $na_str=2; // Liczba wynikow na jednej stronie
  5. $wpisy=mysql_query("SELECT * FROM wpisy ORDER BY id DESC");
  6.  
  7. $ile_str=mysql_num_rows($wpisy);
  8. $ile_str=ceil($ile_str/$na_str);
  9. for($i=1;$i<=$ile_str;$i++){
  10. echo '<a href="?str='.$i.'">Strona '.$i.'</a>';
  11. }
  12. $nr_wpis=0;
  13. while($w=mysql_fetch_assoc($wpisy)){
  14. $nr_wpis++;
  15. if($nr_wpis<=$str*$na_str&&$nr_wpis>$str*$na_str-$na_str){
  16. echo '<p>'.$w['tresc'].'</p>';
  17. }
  18. }
  19. ?>


Myślę, że się przyda winksmiley.jpg
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.