Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Implementazione url dinamici

    Ciao a tutti, sono nuovo sia del forum che del linguaggio (...) PHP, ed in realtà anche se sto cominciando ora a masticare qualcosa anche del web development in generale. Vorrei chiedervi gentilmente se potete darmi qualche dritta sulla struttura di un sito web del tipo:

    header
    colonna sin - content - colonna des
    footer

    dove header, le colonne e il footer sono estremamente statiche in quanto hanno semplici immagini\link e basta, qualsiasi cosa venga mostrata.

    content è invece una sezione del sito che cambia a seconda del link che un visitatore preme. Per capirci, content potrebbe essere realizzato con un iframe e i link dovrebbero semplicemente aprire ciò che deve andare in content col target giusto.

    A me però interessa che l'url cambi a seconda del content mostrato! per esempio www.miosito.boh/index.php?sezione=questasezione , ho girato un po' e ho scoperto che, correggetemi se sbaglio, php mi dà questa soluzione (il link l'ho costruito così non per caso!) tramite una funzione include() e delle variabili da inserire tramite un metodo GET, che le prende direttamente dall'url esattamente in quel modo.

    Cercando cercando ed informandomi un po' insomma sono arrivato ad un codice di questo tipo:

    codice:
    <?php
       if (isset ($_GET['content']) && $_GET['content']!=''){ 
        $content = ($_GET['content']).".html"; //le pagine sono tutte .html
        include ($content);
      } else {
        include ('default.html');
      }
    ?>
    I dubbi che ho sono però molteplici....

    Intanto io ho diverse pagine html che possono essere 'target' di content, e quindi per tenere tutto ordinato (cosa che mi piacerebbe ed anzi voglio fare) le ho predisposte tutte in sottocartelle. Diciamo pure che ho una decina di sottocartelle dove trovare questi file .html

    es.

    www.miosito.boh/cartella1/pagina.html
    www.miosito.boh/cartella2/pagina.html (sì, capita anche che si chiamino uguale)

    come faccio a includere anche la sottocartella in questo procedimento? Dovrei annidare nell'if un secondo if con dentro un altro controllo $_GET?

    Inoltre ho un altro dubbio, così, a naso... questo codice non mi sembra molto sicuro. Non mi piace che un utente random possa scrivere quello che vuole nella barra degli indirizzi ed eventualmente piazzarmi in content un suo sito che esegue codice che io non vorrei venisse eseguito!
    Ho pensato di mettere un controllo sapendo io esattamente quali e quante sono le pagine 'permesse', ma il problema è che queste pagine sono veramente TANTE! C'è un metodo più semplice? (una interessante funzione a proposito è la basename, ma non avendo capito esattamente come fare la cosa delle sottocartelle ho qualche dubbio...)

    Inoltre ecco l'altro dubbio, questa volta sull'include. Questa include come funziona terra terra? Se io nel file index.php includo un foglio di stile, le classi e id di questo vengono applicate al contenuto del file .html che io includo con questa funzione? Se per esempio ho deciso che tutto il testo venga scritto in giallo, il testo che verrà incluso tramite la funzione include verrà visualizzato in giallo o in nero?

    Grazie anticipatamente per le risposte, mi salvate la vita. So che sono tante domande ma confido che siano abbastanza basilari e di facile risposta e di essere io l'unico pirla che non sa queste cose sono ben gradite anche risposte parziali!

  2. #2
    Ciao... quante domande!!

    Vediamo, innanzitutto un sito tipo:

    header
    colonna sin - content - colonna des
    footer

    Lo puoi fare tranquillamente tutto usando la funzione include(). Lascia perdere gli iframe... sono il male!

    Guardando poi il codice che hai postato si potrebbe migliorare parecchio...
    Codice PHP:
    <?php    if (isset ($_GET['content']) && $_GET['content']!=''){      $content = ($_GET['content']).".html"//le pagine sono tutte .html     include ($content);   } else {     include ('default.html');   } ?>
    isset() va benissimo, si deve usare spesso per evitare che php lanci dei warning a ruota. Non va bene però come controlli se $_GET['content'] è vuoto. Ora come ora controlli solo che quest'ultimo non sia una stringa vuota... ma se fosse ad esempio NULL, o false, o 'pippo' ? Non dovrebbe andare bene ugualmente. In quest'ultimo caso per esempio includeresti un file pippo.html che non esiste, e avresti un E_WARNING.
    Io poi fossi in te includerei file .php, non .html, perché così ti auto-obblighi ad usare pagine statiche... una follia secondo me.
    Hai ragione poi quando dici che il codice non è sicuro. Hai pensato cosa potrebbe accadere se un cracker entra nel tuo sito e modifica l'url scrivendo tipo: http://tuosito.it/index.php?sezione=...il.com/malware ??
    Un controllo sulle pagine va messo assolutamente. Ecco come riscriverei il tuo codice:

    Codice PHP:
    <?php

    $content 
    = isset($_GET['content']) ? trim($_GET['content']) : '';

    $valid_content = array('cartella1/pagina.html','cartella2/pagina.html');

    if (!empty(
    $content) && in_array($content$valid_content)) {
        include 
    $content;
    }
    Così facendo verranno incluse solo le pagine effettivamente valide, cioè quelle specificate nell'array $valid_content.

    Però mi pare di capire che hai tante pagine... se per tante intendi 20 - 30 pagine puoi usare il mio codice, altrimenti ti consiglierei di dare un'occhiata alla funzione scandir().

    Per quanto riguarda i fogli di stile, perché non ci provi direttamente?

    Ciao!

  3. #3
    Per rendere un attimo più sicuro lo script potresti comporre un array delle pagine che hai nelle cartelle. Lo puoi implementare staticamente (crei un array e ci infili a mano dentro i nomi delle pagine senza estensione) oppure lo puoi comporre recuperando i nomi direttamente dalla cartella fisica (in questo modo aggiungendo pagine non dovrai andare a modificare l'array ma verrà "aggiornato" autmaticamente...detta in termini brutali).
    Avevo fatto questa piccola funzione che esegue lo scandir di tutte le cartelle presenti in una directory e infilava quello che recuperava in un array:
    Codice PHP:
    private function arrayComposer (){
            if(isset(
    $this->dirname) && (is_dir($_SERVER['DOCUMENT_ROOT'].$this->dirname))){
                        foreach (
    scandir($_SERVER['DOCUMENT_ROOT'].$this->dirname) as $nomefile) {
                if(
    is_file($_SERVER['DOCUMENT_ROOT'].$this->dirname.$nomefile)){
                                
                                    
    $this->filelist[] = $nomefile;
                                }
                             
                }
            }
                     
            return 
    $this->filelist;
          } 
    dirname è il percorso da indicargli per fargli fare la scansione, basta che dichiari normalmente la variabile e le assegni il percorso.
    Fare o non fare....non c'è provare!

  4. #4
    Grazie a entrambi per le risposte!

    @Simo990

    Il codice consigliato da te funziona, anche se in effetti (è secondario) però mi pare bruttino vedere miosito.boh/index.php?content=dir/pag.html (a proposito, le pagine sono statiche e per quel tipo di sito va benissimo così , solo l'index ha questa necessità, altrimenti non mi ci sarei nemmeno messo prima di studiare un po' di php!).

    Ed in effetti le pagine che dovrei mettere nell'array sono qualcosa come un centinaio, e non venti-trenta... è un po' lunghetto come lavoro... mi guarderò la scandir se dite che ci posso arrivare masticando molto poco il php.

    @Sbidiguida

    Senza neanche provarlo il tuo codice, immagino di dover cambiare struttura per implementarlo... mi pare di capire che si riferisca a codice OO (da quel private function) che io ho visto, ma in java... non saprei come modificarlo per togliergli quella componente (dubito sinceramente che basti togliere la parola private).

    Per ultima cosa, esiste un modo per cambiare un url del tipo miosito.boh/index.php?content=dir/pag.html in miosito.boh/dir/pag.html ?

    Grazie a chi risponderà

  5. #5
    Metodo più comune ModRewrite (non chiedermi lumi su questo che anche per me è estremamente ostico) altrimenti ti crei un controller che recuperi l'url senza querystring, lo parsi dividendo le sue componenti e includa il resto ma per te è veramente troppo visto che è praticamente tutto html il tuo.

    Per la funzione...quella fà parte di una classe, l'ho messa solo per farti un esempio di come usare uno scandir senza dover creare l'array mano
    Fare o non fare....non c'è provare!

  6. #6
    Originariamente inviato da Sbidiguda
    Metodo più comune ModRewrite (non chiedermi lumi su questo che anche per me è estremamente ostico) altrimenti ti crei un controller che recuperi l'url senza querystring, lo parsi dividendo le sue componenti e includa il resto
    @Sbidiguda: Ha detto che è nuovo del linguaggio... abbi pietà di lui

    Comunque per la funzione puoi provare questa (riscritta sulla base di quella di Sbidiguda):

    Codice PHP:
    <?php
    class Scanner {

        public static function 
    scan($dir='') {
            
    $list false;
            if (empty(
    $dir)) {
                
    $dir dirname(__file__); 
            }
            if (
    is_dir($dir)) {
                
    $files scandir($dir);
                foreach (
    $files as $file) {
                    if (
    is_file("$dir/$file")) {
                        
    $list[] = $file;
                    }
                }
            }
            return 
    $list;
        }
    }
    Il funzionamento è semplicissimo, devi solo richiamare la funzione ed essa ti ritornerà un array con tutti i file nella cartella che avrai specificato (se non la specifichi ti prende la cartella dove ti trovi al momento). Per esempio, mettiamo caso che nella cartella "cartella1" hai 2 file: "file1.html" e "file2.html" e li vuoi includere tutti quanti insieme. Potresti usare questo codice:

    Codice PHP:
    $files Scanner::scan('cartella1');
    foreach (
    $files as $file) {
        include_once 
    "cartella1/$file";

    Prova e fammi sapere

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.