Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [PHP] generalizzare i percorsi relativi

    Ciao,
    i path contenuti nei files inclusi dipendono dalla posizione del file che li include.
    Vorrei generalizzare il path affinché lo script acceda sempre alle risorse a prescindere dalla posizione (cartella/sottocartella) che lo script occupa.

    Supponiamo di dover includere un file res.php che si trova nella root.
    Il percorso relativo (da una sottocartella della root) sarà "../res.php"

    Se il file res.php verrà incluso da una sottocartella 2 livelli inferiore, il percorso relativo "../res.php" ovviamente non è più corretto, ci vorrebbe "../../res.php".

    Quindi sto cercando un sistema per generare automaticamente i percorsi a prescindere dalla posizione da cui vengono richiamati.

    Avvalendomi delle variabili di server ho pensato a:
    Codice PHP:
    // per le risorse che servono allo script sul server:
    $path $_SERVER['DOCUMENT_ROOT']."res.php";

    // per le risorse che servono al documento html (per esempio un'immagine):
    echo "<img src=\"http://".$_SERVER['SERVER_NAME']."root_img.jpg\">"
    generando un percorso assoluto nell'attributo src anziché uno relativo.
    Ovviamente funziona tutto, ma mi chiedo:
    [list=1][*]c'è qualche controindicazione in questo sistema?[*]E' svantaggioso avere un percorso assoluto sul file html generato anziché uno relativo (in termini di accesso alle risorse)?[*]Esiste un sistema migliore?[/list=1]
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Mi dispiace ma quel sistema delle variabili di server non mi sembra granché bello, sia nello script che come HTML generato, con percorsi assoluti... (Altrimenti non chiederei un parere).

    Circa le controindicazioni, su php.net ho letto:
    $_SERVER['DOCUMENT_ROOT'] *is* supported by IIS, although only when running PHP as an ISAPI module.
    Qualcun altro ha scritto:
    Be careful when using $_SERVER['DOCUMENT_ROOT']; in your applications where you want to distribute them to other people with different server types. It isnt always supported by the webserver (IIS).
    Siccome cerco un buon livello di portabilità a prescindere dalla piattaforma su cui vengono installate le mie applicazioni, mi sembra buono cercare soluzioni più sicure.
    Ho scritto queste due funzioni che su Linux - Apache/2.0 vanno alla grande.
    Ho testato anche su Microsoft-IIS/6.0 e funziona:

    Codice PHP:
    function relPath() {
        
    // returns the relative folder-path of the current file
        
    $filePath explode("/"$_SERVER['PHP_SELF']);
        
    array_pop($filePath);
        return 
    implode("/"$filePath);
    }

    function 
    relRoot() {
        
    // returns the relative folder-path of the root
        
    $relRoot "";
        
    $filePath explode("/"$_SERVER['PHP_SELF']);
        for (
    $i 0$i count($filePath) - 2$i++) {
            
    $relRoot .= "../";
        }
        return 
    $relRoot;

    Un unico dubbio: quando (su piattaforme Win) il delimitatore di cartelle nei path è un backslash "\" anziché uno slash"/" ?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    Originariamente inviato da emanueledg
    Un unico dubbio: quando (su piattaforme Win) il delimitatore di cartelle nei path è un backslash "\" anziché uno slash"/" ?
    Codice PHP:
    function relPath() {
        
    $filePath explode("/"str_replace('\\''/'$_SERVER['PHP_SELF']) );
        
    array_pop($filePath);
        return 
    implode("/"$filePath);

    metti due backslashes il forum se li fuma
    codice:
    ...str_replace('\\\', '/',

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Originariamente inviato da piero.mac
    ...
    :ignore:


    Codice PHP:
    function relPath() {
        
    // returns the relative folder-path of the current file 
        
    $filePath explode("/",  str_replace("\\\", "/", $_SERVER['PHP_SELF']));
        array_pop(
    $filePath);
        return implode("
    /", $filePath);
    }

    function relRoot() {
        // returns the relative folder-path of the root 
        
    $relRoot = "";
        
    $filePath = explode("/",  str_replace("\\\", "/", $_SERVER['PHP_SELF']));
        for (
    $i = 0; $i < count($filePath) - 2; $i++) {
            
    $relRoot .= "../";
        }
        return 
    $relRoot;

    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  5. #5
    ciao ragazzi. stessa identica spiaccicata domanda.
    come si dovrebbe usare il codice qui sopra?
    grassie!!! :master:

  6. #6
    Originariamente inviato da Edoardo Resta
    ciao ragazzi. stessa identica spiaccicata domanda.
    come si dovrebbe usare il codice qui sopra?
    grassie!!! :master:
    Metti nella pagina php le due funzioni e le usi per definire due costanti, REL_ROOT e REL_PATH:

    Codice PHP:
    function relRoot() {
        
    // returns the relative folder-path of the root 
        
    $relRoot "";
        
    $filePath explode("/"str_replace("\\\", "/", $_SERVER['PHP_SELF']));
        for (
    $i = 0; $i < count($filePath) - 2; $i++) {
            
    $relRoot .= "../";
        }
        return 
    $relRoot;
    }
    function relPath() {
        // returns the relative folder-path of the current file 
        
    $filePath = explode("/",  str_replace("\\\", "/", $_SERVER['PHP_SELF']));
        array_pop(
    $filePath);
        return implode("
    /", $filePath);
    }
    define("
    REL_ROOT", relRoot());
    define("
    REL_PATH", relPath()); 
    Poi, a prescindere dal punto in cui si trova la pagina, se devi indicare la root, usi la costante REL_ROOT che contiene il percorso relativo per la root.
    Se ti serve in percorso relativo usi REL_PATH.

    Esempio:

    Codice PHP:
    // Per includere il file app_config.php che si trova nella root del server
    // in una sottocartella di 2° livello scriveresti:
    include("../../app_config.php");
    // in una qualsiasi sottocartella lo stesso percorso sarebbe:
    include(REL_ROOT."/app_config.php"); 

    P.S.: Se usi includere da files comuni le parti uguali dei files che compongono la tua applicazione, in questo caso non puoi farlo, ovvero le due funzioni devono essere ridondate per ogni file perché la stringa che restituiscono dipende esattamente dal percorso in cui si trovano.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  7. #7
    Grazie! Sei stato chiarissimo!
    Troppo gentile e soprattutto efficace!

  8. #8
    Secondo me esiste un metodo molto più rozzo, che però funziona al 100%.

    Sapendo qual'è l'url allora te lo salvi in una variabile $path, tale inizializzazione la metti in un file di configurazione e stai apposto.

    Inoltre ti dirò di più, se tu il sito ce l'hai su un server http://indirizzoip/sottocartella/ mentre online è http://www.sito.com/ puoi creare addirittura un file di configurazione costante (io lo chiamo constant.php) che viene incluso dal file di configurazione.

    In questo constant puoi raccogliere tutti i dati che su un server sono in un modo, online in un altro (password di database e roba simile) e ricordarti di non sostituirlo mai con il constant che hai in locale.

    Ti è piaciuta come pensata? :P

  9. #9
    Originariamente inviato da Debiru
    Secondo me esiste un metodo molto più rozzo, che però funziona al 100%.

    Sapendo qual'è l'url allora te lo salvi in una variabile $path, tale inizializzazione la metti in un file di configurazione e stai apposto.

    Inoltre ti dirò di più, se tu il sito ce l'hai su un server http://indirizzoip/sottocartella/ mentre online è http://www.sito.com/ puoi creare addirittura un file di configurazione costante (io lo chiamo constant.php) che viene incluso dal file di configurazione.

    In questo constant puoi raccogliere tutti i dati che su un server sono in un modo, online in un altro (password di database e roba simile) e ricordarti di non sostituirlo mai con il constant che hai in locale.

    Ti è piaciuta come pensata? :P
    Non ho capito quello che intendi.
    Cosa significa "puoi raccogliere tutti i dati che su un server sono in un modo, online in un altro"?

    Se fai un piccolo esempio sintetico e rappresentativo te ne sarei grato.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  10. #10
    Fai conto che tu hai il tuo sito su un server di test e uno sul server ufficiale.

    La stragrande maggioranza delle cose saranno identiche fra i due server, ma ci saranno anche delle piccole differenze costanti nel tempo.

    Esempio:

    Se entrambe hanno un server mysql non è detto che abbiano la stessa login però.

    L'indirizzo url sarà sicuramente differente fra i due (sia url che root, sicuramente).

    Allora tu creerai un file nel quale inizializzerai tutte le variabili o costani, dipende poi come li vuoi definire.

    Crei per esempio constant.php così strutturato:
    Codice PHP:
    <?
    $path
    ="inidirizzo";
    $url="indirizzourl";
    $db_user="user";
    $db_password="password";
    //e via così ...
    ?>
    Questo constant.php sarà ovviamente incluso nelle tue pagine, poi decidi tu dove e in che modo, ma farai in modo che sul server di test vi saranno i valori di test e sul server ufficiale i valori ufficiali.

    Sembra un banalità, ma se tu cercherai di raccogliere in quei file tutti i valori costanti all'inizio, potrai, successivamente, cambiare nel sito tutto quello che vuoi e uploadarlo sul sito ufficiale (ovviamente non sovrascrivendo il constant.php ufficiale) senza preoccuparti se i dati di accesso o i path sono cambiati.

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.