Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] automatyczne tworzenie linków
Forum PHP.pl > Forum > Przedszkole
CconradD
Witam
Chciałbym sie zapytać jak można stworzyć takie linki: index.php?funkcja=50. Mam w bazie mysql kilka kategorii, np. kategorie filmów, czy rok produkcji. Jak wyświetlić właśnie za pomocą takiego linku horror (index.php?gatunki=horror), czy np i horror i film z roku 2000 (index.php?gatunki=horror&rok=2000). Czy można "podpiąć" do tego jakąś funkcje i np wartość którą funkcja będzie modyfikować (ndex.php?funkcja=50)? Bardzo dziękuje za wszelką pomoc.
pyro
Cytat(CconradD @ 22.04.2008, 15:24:05 ) *
Witam
Chciałbym sie zapytać jak można stworzyć takie linki: index.php?funkcja=50. Mam w bazie mysql kilka kategorii, np. kategorie filmów, czy rok produkcji. Jak wyświetlić właśnie za pomocą takiego linku horror (index.php?gatunki=horror), czy np i horror i film z roku 2000 (index.php?gatunki=horror&rok=2000). Czy można "podpiąć" do tego jakąś funkcje i np wartość którą funkcja będzie modyfikować (ndex.php?funkcja=50)? Bardzo dziękuje za wszelką pomoc.


w adresie takie rzeczy sie przekazuje za pomoca $_GET, przykład:

index.php
  1. <?php
  2.  
  3. $wyraz = $_GET['wyraz'];
  4. echo $wyraz;
  5.  
  6. ?>


jezeli np. teraz wywolasz stronw w ten sposob index.php?wyraz=ciasteczko to na stronie pojawi ci sie "ciasteczko"
CconradD
Dzięki wielkie. Mam jeszcze pytanie, jak stworzyć z nazw w bazie takie linki. Czyli np mam 'ciasteczko', 'tort', 'ciasto' i w jaki sposób to zrobić.
webdice
  1. <?php
  2. $query = mysql_query ('SELECT `column` FROM `table`');
  3.  
  4. while ($field = mysql_fetch_assoc ($query))
  5. {
  6. print $field['column'] . '<br />';
  7. }
  8. ?>


O coś takiego Ci chodzi?
CconradD
Dzięki webdicepl ale nie chodzi mi o samo ich wyświetlenie. Chodzi mi o taka sytuacje: mam w MySQLu 3 filmy gatunku horror, 4 dramat. Chciałbym żeby po wpisaniu index.php?gatunek=horror wyświetlało mi tylko filmy gatunku horror. Przy czym żeby sam umaił wczytać jakie są gatunki (żeby nie definiować je ręcznie).
webdice
Pokaż strukturę tabel z bazy danych.
CconradD
Tak wygląda moja baza (jeżeli to jest struktura):

  1. CREATE TABLE movies(
  2. ID INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ,
  3. NUM INT,
  4. DATEADD DATE,
  5. COUNTRY TEXT,
  6. CATEGORY TEXT,
  7. YEAR INT,
  8. LENGTH INT,
  9. ACTORS TEXT,
  10. URL TEXT,
  11. DESCRIPTION TEXT,
  12. COMMENTS TEXT
  13. );
Piniek
  1. SELECT * FROM movies WHERE category={$_GET['gatunek']}

oczywiście przed zapytaniem musisz walidowac zmienna $_GET['gatunek'] aby uniknąć wstrzyknięcia klodu
webdice
  1. <?php
  2. $query = mysql_query ("SELECT * FROM `movies` WHERE `category` = '" . $_GET['kategoria'] . "'");
  3.  
  4. while ($field = mysql_fetch_assoc ($query))
  5. {
  6. print $field['column'] . '<br />';
  7. }
  8. ?>


Link będzie wyglądał mniej więcej tak:

Kod
index.php?kategoria=horror


Oczywiście umieszczenie _GET w zapytaniu jest dość ryzykowne, ale to już odsyłam Cię do tematu o bezpieczeństwie skryptów.
CconradD
No działa super biggrin.gif Właśnie o takie coś mi chodziło. Dzięki wam za pomoc. Jeszcze poczytam o bezpieczeństwie, w razie problemów to będę sie pytał.

Z tego co zrozumiałem, to żeby zapobiedz dostaniu się obcego kodu, to należy walidować zmienne (uściślać jak mają wyglądać). Czy np jeżeli w zmiennej będą cyfry, to sprawdzić czy w zmiennej są cyfry. Ale w zmiennej DESCRIPTION jest tekst, to prócz zamiany cudzysłowów, to inaczej nie mogę tego walidować. Czy dobrze to zrozumiałem? Czy też jest jakiś inny sposób na zabezpieczenia się przed _GET.
Piniek
Istnieje bardzo wiele możliwości zabezpieczenia.
wiesz ze to na pewno będzie sam tekst wiec możesz dac wyrażenie regularne które bedzie przepuszczać sam tekst nic więcej winksmiley.jpg
CconradD
Teraz jeszcze trochę poczytałem, a taka forma zabezpieczenia (zamiast walidacji):
  1. <?php
  2. $get = $_GET['kategoria']; 
  3. $query = mysql_query ("SELECT * FROM `movies` WHERE `CATEGORY` = '" . mysql_real_escape_string($get) . "'");
  4.  
  5. while ($field = mysql_fetch_assoc ($query))
  6. {
  7. print $field['column'] . '<br />';
  8. }
  9. ?>

Sorry, że tak zarzucam pytaniami ale pierwszy raz pisze skrypt w którym mi dość zależy na bezpieczeństwie.
pyro
Cytat(CconradD @ 22.04.2008, 21:02:43 ) *
Teraz jeszcze trochę poczytałem, a taka forma zabezpieczenia (zamiast walidacji):
  1. <?php
  2. $get = $_GET['kategoria']; 
  3. $query = mysql_query (&#092;"SELECT * FROM `movies` WHERE `CATEGORY` = '\" . mysql_real_escape_string($get) . \"'\");
  4.  
  5. while ($field = mysql_fetch_assoc ($query))
  6. {
  7. print $field['column'] . '
  8. ';
  9. }
  10. ?>

Sorry, że tak zarzucam pytaniami ale pierwszy raz pisze skrypt w którym mi dość zależy na bezpieczeństwie.


zabezpieczenie dobre, ale zamiast:
  1. <?php
  2. </br >print $field['column'] . '';
  3. ?>


proponuje dac:

  1. <?php
  2. print htmlentities(stripslashes($field['column']));
  3. ?>



niepotrzebne cudzyslowy i stripslashes dla upiekszenia tongue.gif
</br >
marcio
I ogolnie jesli to user podaje dane ktore sie potem zapisuja do bazy to daj tez htmlspecialchars() przy zapisywaniu lub wyswietlaniu bo jak nie to bedzie ladny XSS chyba ze sam dodajesz do bazy to jeszcze ujdzie ale lepiej zawsze dac smile.gif
CconradD
Dzięki wam wielkie smile.gif biorę sie za pisanie

Jeszcze jedno pytanie do walidacji. Czy tak zbudowana funkcja (w formularzu ma wybrać plik o rozszerzeniu .xml) jest bezpieczna i poprawna?
  1. <?php
  2. $import_xml = htmlspecialchars(strip_tags(trim($HTTP_POST_VARS['import_xml'])));
  3. if(isset($HTTP_POST_VARS['import_xml']) && !preg_match( '@.xml$@', $import_xml) )
  4. {
  5.  echo 'Pik musi być xml';
  6.  return false;
  7. }
  8. ?>
marcio
Nie uzywaj starych tablic po co uzywaj tylko $_POST/$_GET potem nie wiem czy preg_match masz dobry bo nie znam wyrazen regularnych ale lepiej rozbij nazwe pliku za pomoca explode() lub klasa @Nospor'a i sprawdzaj jakie ma rozszerzenie chyba ze plik uploadujesz czy co tam robisz za pomoca input'a

P.S o gory nie widze zadnej deklaracji funkcji wiec return jest tam chyba zbedne jak cos to daj exit; albo die(); chyba ze to tylko kawalek kodu
CconradD
To jest fragment (część z return jest w funkcji). Co do starych tablic to nawet nie wiedziałem że lepiej jest używać $_POST. Preg_match działa więc chyba jest poprawny. Do wczytania nazwy pliku używam inputa. Ale jak oceniasz bezpieczeństwo?
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.