Visualizzazione risultati 1 fino 20 di 20
Like Tree1Likes
  • 1 Post By mzanella

Discussione: PHP - include non funziona

  1. #1
    Guest

    Predefinito PHP - include non funziona

    Buonasera,

    sto cercando di usare la funzione PHP include, ma non funziona.
    O meglio, riesco ad includere i file presenti nella stessa cartella, ma non quelli presenti in cartelle differenti. Vi faccio un esempio:

    Mi trovo nella directory
    Codice:
    /temi/quiz-arte/
    e sto modificando il file index.php. Nella stessa cartella è presente il file menu.html. Per includerlo faccio come di seguito. E il file viene infatti incluso correttamente:

    Codice PHP:
    <?php include 'menu.html';?>
    Se invece provo ad includere un file, sempre menu.html, presente in un'altra directory, diciamo /iframes/menu/, allora non funziona.
    Ho provato in tutti i seguenti modi, e in nessun caso vedo qualcosa:

    Codice PHP:
    <?php
    include("iframes/menu/menu.html");
    include(
    "/iframes/menu/menu.html");
    include(
    "../iframes/menu/menu.html");
    include(
    $_SERVER['DOCUMENT_ROOT']."/iframes/menu/menu.html");
    include(
    dirname(__DIR__).'/iframes/menu/menu.html');
    ?>
    Se nella medesima pagina inserisco un iframe con lo stesso link
    Codice:
    <iframe src="/iframes/menu/menu.html"></iframe>
    , la pagina menu.html viene invece visualizzata correttamente.

    Qualcuno saprebbe aiutarmi a risolvere questo problema?

    Buona serata
    Ultima modifica di fontanesi : 15-05-2020 alle ore 23.03.55

  2. #2
    Guest

    Predefinito

    Autorisposta utile a futuri visitatori:

    include funziona per me se usato in questo modo

    Codice PHP:
    <?php
    include("../../iframes/menu/menu.html");
    ?>
    Devo dire che non ne capisco il motivo, dal momento che la root del sito è /var/www/html
    Non dovrebbero esserci tre volte i due puntini?
    Ma tant'è, l'importante è che funzioni.

    Buona serata



    EDIT:

    È stranissimo, ma in un'altra directory l'include funziona con tre volte i due puntini, ovvero

    Codice PHP:
    <?php
    include("../../../iframes/menu/menu.html");
    ?>
    Ultima modifica di fontanesi : 15-05-2020 alle ore 23.52.56

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,148

    Predefinito

    Dipende da dove stai facendo l'include. Sei su AlterVista? Immagino di no dal path /var/www/html

    Ciao!

  4. #4
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    3,998

    Predefinito

    Salve,
    i 2 punti separati da slash, stanno a indicare la presenza di una cartella il cui nome non è dichiarato nel percorso usato per il link.

    Cordiali saluti.

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    include considera il percorso dello script in esecuzione per risolvere i percorsi relativi, non il percorso dello script in cui è definito.

    Se lo script in esecuzione è DOCUMENT_ROOT/temi/quiz-arte/index.php e intendi includere DOCUMENT_ROOT/iframes/menu/menu.html l'include da utilizzare è:
    Codice PHP:
    include '../../iframes/menu/menu.html';
    Attenzione, che se lo stesso script DOCUMENT_ROOT/temi/quiz-arte/index.php viene incluso da un'altra posizione, per esempio DOCUMENT_ROOT/index.php, il percorso relativo dovrà tenere conto della posizione di quest'ultimo, diventando:
    Codice PHP:
    include 'iframes/menu/menu.html';
    Per evitare questi problemi ti conviene usare percorsi assoluti, eventualmente calcolati dinamicamente con __DIR__:
    Codice PHP:
    include __DIR__ . '/../../iframes/menu/menu.html';
    Poiché non ti trovi sul server di AlterVista verifica di non avere problemi di permessi sul file system.
    Ultima modifica di mzanella : 16-05-2020 alle ore 11.50.13

    I suggerimenti che do più spesso:


  6. #6
    Guest

    Predefinito

    Grazie a tutti delle risposte.

    In realtà mi trovo proprio su AlterVista, e mi pare di aver visto che il path fosse /var/www/html, o comunque qualcosa di simile; potrei sbagliarmi.

    In effetti mi sono reso conto che il numero di
    Codice:
    /..
    che devo mettere varia a dipendenza della posizione del file che sto modificando (se è una sottocartella, la sottocartella di una sottocartella, eccetera).

    Non esiste un metodo univoco, funzionante in tutte le posizioni, che mi permetta di includere il percorso del file menu.html a partire dalla root del documento, senza dover modificare i
    Codice:
    /..
    per ogni file in una posizione differente?
    Ultima modifica di fontanesi : 16-05-2020 alle ore 11.42.37

  7. #7
    Guest

    Predefinito

    Per evitare questi problemi ti conviene usare percorsi assoluti, eventualmente calcolati dinamicamente con __DIR__:
    Codice PHP:
    include __DIR__ . '../../iframes/menu/menu.html';
    Uhm, quando provo a usare __DIR__ non funziona, la pagina non viene mostrata...

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    È un po' generico.
    Hai abilitato il display degli errori? Ne vengono mostrati? Hai verificato che il percorso generato sia quello corretto?

    Comunque mancava uno slash nel percorso:
    Codice PHP:
    include __DIR__ . '/../../iframes/menu/menu.html';
    In effetti mi sono reso conto che il numero di "../" che devo mettere varia a dipendenza della posizione del file che sto modificando
    Certo, per questo si chiama percorso relativo.

    Non esiste un metodo univoco, funzionante in tutte le posizioni, che mi permetta di includere il percorso del file menu.html
    I percorsi assoluti, appunto.

    I suggerimenti che do più spesso:


  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Comunque mancava uno slash nel percorso:
    Codice PHP:
    include __DIR__ . '/../../iframes/menu/menu.html';
    Ok, ora funziona, ma non capisco quale sia la differenza con il percorso relativo. Anche in questo caso, usando __DIR__, devo aggiustare il numero di /.. a dipendenza di dove si trova il file che sto modificando...

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Ok, ora funziona, ma non capisco quale sia la differenza con il percorso relativo. Anche in questo caso, usando __DIR__, devo aggiustare il numero di /.. a dipendenza di dove si trova il file che sto modificando...
    Immagina di avere 3 file omonimi di nome file.php collocati all'interno di cartelle diverse, per esempio:
    Codice:
    /home/fontanesi/folder_1/file.php
    /home/fontanesi/folder_2/file.php
    /home/fontanesi/file.php
    Nota che /home/fontanesi/... è il percorso assoluto che identifica univocamente ogni file e cartella nel file system. L'esempio usa la sintassi di UNIX in quanto [quasi] tutti i web server usano sistemi operativi derivati da UNIX, tipicamente GNU/Linux. Il concetto è comunque presente Windows, dove i percorsi assoluti sono nella forma C:\\users\fontanesi\folder_1\file.php (o qualcosa del genere).

    Se /home/fontanesi/folder_1/file.php volesse includere /home/fontanesi/folder_2/file.php come dovrebbe fare? Scrivere semplicemente file.php e aspettarsi che capisca da solo che deve andare nella cartella superiore, quindi spostarsi in folder_2 e leggere il file sarebbe assurdo. Tanto meno basterebbe indicargli di spostarsi di una cartella: troverebbe prima /home/fontanesi/file.php e restituirebbe lui. Per togliere ogni possibile forma di ambiguità è necessario e specificare la "sequenza di passi" esatta dal file di partenza a quello di arrivo:
    Codice:
    spostati in alto di una cartella
    accedi alla cartella folder 2
    accedi al file file.php
    indicato in modo conciso tramite la solita sintassi ../folder_2/file.php. Questo si chiama percorso relativo.

    Chiaramente, creando un nuovo file in /home/fontanesi/folder_3/subfolder/file.php e volendo includere /home/fontanesi/folder_2/file.php da quest'ultimo è chiaro che la sequenza di passi sia diversa, bisogna salire di una cartella in più, di conseguenza cambia anche il percorso relativo: ../../folder_2/file.php.

    L'alternativa è usare appunto i percorsi assoluti, indicando esplicitamente la posizione esatta di ogni file nel sistema, per esempio /home/fontanesi/folder_2/file.php. Questo però crea un ovvio problema. Supponendo tu voglia sviluppare il tuo sito sul tuo computer che usa Windows, dovrai usare il percorso assoluto C:\\users\fontanesi\folder_2\file.php. Appena copierai il file sul server web, che usa GNU/Linux, il percorso assoluto non funzionerà più, perché il file system è strutturato diversamente. Anche se sviluppasi su un sistema GNU/Linux non avresti nessuna garanzia che questo seguisse la stessa configurazione del server.

    La soluzione è [relativamente] semplice: usare percorsi assoluti generati dinamicamente:
    Codice PHP:
    __DIR__ . '/../folder_2/file.php
    dove __DIR__ è una costante di PHP che rappresenta il percorso assoluto del file che la contiene. Una volta interpretato, il codice di prima produce la seguente stringa:
    Codice PHP:
    "/home/fontanesi/folder_1/file.php/../folder_2/file.php"
    che è il percorso assoluto del secondo file. Può sembrare un po' strano che "entri" prima in folder_1 solo per poi "uscire" con i ".." e rientrare in folder_2, ma questo non rappresenta un problema.

    Un'ulteriore alternativa per generare percorsi assoluti dinamicamente è ricorrere a $_SERVER['DOCUMENT_ROOT'], ma questo richiede che il server sia appositamente configurato per rendere disponibile quella variabile. Di solito è così, quindi generalmente non ci sono problemi.
    fontanesi likes this.

    I suggerimenti che do più spesso:


  11. #11
    Guest

    Predefinito

    Wow, ottima spiegazione!

    Forse non sto capendo io, ma se interpreto le tue spiegazioni correttamente, ripeto, anche usando il percorso assoluto devo aggiungere/togliere i "../" a dipendenza della posizione del file che sto modificando, perché il principio è il medesimo: "spostati in alto di n cartelle e vai in quella cartella e a quel file".
    E n dipende dalla posizione del file che modifico...

    (Scusa l'ignoranza neh)

  12. #12
    Guest

    Predefinito

    Mi pare di capire che l'unico vantaggio (intendiamoci, non è piccolo) dei percorsi assoluti è quello di valere anche se si cambia piattaforma...

    Quello che vorrei è ottenere una sequenza del genere, valida per tutti i percorsi:

    Codice:
    vai alla root del sito
    accedi alla cartella folder 2
    accedi al file file.php
    Ultima modifica di fontanesi : 16-05-2020 alle ore 14.22.43

  13. #13
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,148

    Predefinito

    Su AlterVista, la root del sito è: /membri/<username>/, quindi nel tuo caso:

    Codice:
    /membri/fontanesi/
    Quindi:

    Codice:
    vai alla root del sito         -> /membri/fontanesi/
    accedi alla cartella folder 2  -> /membri/fontanesi/folder_2/
    accedi al file file.php        -> /membri/fontanesi/file.php
    / indica appunto path assoluto, dalla radice.
    ./ indica la cartella corrente.
    ../ indica la cartella superiore, come credo tu già sappia.

    Se non ricordo male, alcuni su alcuni account andrebbe sostituito /membri/ a /membri2/ o /members/, non ricordo se ancora ci sono queste differenze.

    Ciao!
    Ultima modifica di alemoppo : 16-05-2020 alle ore 14.38.47

  14. #14
    Guest

    Predefinito

    Ciao, grazie della risposta.

    Il problema è che dovrò copiare il sito su un altro server non hostato da altervista, per cui la root sarà differente.
    Non esiste un modo per spostarsi automaticamente alla "base" del sito, una cosa come la seguente?
    Codice:
    vai alla "base" del sito       -> /root/che/non/conosco/
    accedi alla cartella folder 2  -> /root/che/non/conosco/folder_2/
    accedi al file file.php        -> /root/che/non/conosco/folder_2/file.php
    Ultima modifica di fontanesi : 16-05-2020 alle ore 14.43.01

  15. #15
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,148

    Predefinito

    Potresti semplicemente utilizzare una variabile, del tipo:

    Codice PHP:
    define('ROOT', '/membri/tuonome/');
    Quindi:
    Codice:
    vai alla "base" del sito       -> ROOT
    accedi alla cartella folder 2  -> ROOT.'folder_2/'
    accedi al file file.php        -> ROOT.'folder_2/file.php'
    Così se vuoi spostare tutto su un servizio con impostazione differente, sarà sufficiente modificare la define().

    Posso chiederti quale servizio/impostazione necessiti per non rimanere su AlterVista?

    Ciao!
    Ultima modifica di alemoppo : 16-05-2020 alle ore 14.48.17

  16. #16
    Guest

    Predefinito

    Ciao, buona idea.

    Il fatto è che dovrei dichiarare quella variabile in tutte le pagine.
    Mi spiego: scrivendo in ogni pagina
    Codice PHP:
    define('ROOT', '/membri/tuonome/');
    si perde il senso di usare la variabile, perché, qualora dovessi cambiare server, dovrei entrare in ogni pagina per modificare tale valore. A quel punto mi converrebbe di più modificare solo i "../"

    In realtà su AlterVista mi trovo benissimo, ma sto lavorando per una persona che ha un proprio server da un'altra parte e non vuole cambiarlo...dovrei cercare di convincerlo a trasferire il dominio

  17. #17
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,148

    Predefinito

    Normalmente il file di configurazione è appunto un file che viene incluso in tutti i file, dove sono salvati sia il path sia altre info (dettagli di connessione al db, eventuali cartelle "speciali" etc).

    In ogni caso, io solitamente utilizzo appunto i path relativi più che quelli assoluti, quindi sì, con "../": la struttura dei file non dovrebbe cambiare da server a server (partendo dalla posizione attuale), quindi a parte casi particolari, i percorsi relativi dovrebbero esserti sufficienti.

    .dovrei cercare di convincerlo a trasferire il dominio
    No figurati, era solo una mia curiosità, se mancasse qualcosa.

    Ciao!

  18. #18
    Guest

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    No figurati, era solo una mia curiosità, se mancasse qualcosa.
    No no, odio davvero il server che ha, e AlterVista risponde perfettamente alle mie esigenze ;-)

    Grazie dei chiarimenti! Mi dispiace che non ci sia una soluzione come quella che mi immaginavo
    Ultima modifica di fontanesi : 16-05-2020 alle ore 18.33.02

  19. #19
    spaceweb non è connesso Neofita
    Data registrazione
    21-09-2017
    Messaggi
    1

    Predefinito

    Ciao a tutti. Anche a me non funziona. Riepilogo la mia situazione:
    https://Sito/dir_01/pdf/file_01.pdf
    Con riferimento al link sopra, in HTML è risaputo che per recuperare il file_01.pdf il riferimento è questo:
    "/dir_01/pdf/file_01.pdf"
    Purtroppo però in PHP stranamente la stessa procedura NON c'è verso di farla funzionare. Quindi sono passato anche io ai puntini (/../.. ecc) ma se sposto la chiamata del file in un'altra posizione debbo ricalcolare di nuovo il puntini (/../../..ecc). Ciò è sfiancante. Quindi ho trovato questa nuova procedura di chiamata del file:
    "https://Sito/dir_01/pdf/file_01.pdf" è l'uovo di Colombo no ? Il file in questione con questa procedura lo puoi richiamare da qualsiasi posizione nel sito. Poi se vuoi qualcosa di più pratico allora fai così:
    $sito="https://Sito";
    $chiamata=$sito."/dir_01/pdf/file_01.pdf";
    Quindi $sito rimase sempre lo stesso, cambia solo la seconda parte a seconda di dove si trova il file da richiamare.
    Spero che questa risposta sia utile a qualcuno.
    Ciao

  20. #20
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,148

    Predefinito

    In questa discussione si parlava di "include". Non riesco a capire cosa tu voglia fare: non ha senso includere un file .pdf perché non contiene sorgente PHP.

    Ti consiglierei di aprire una tua discussione, spiegando bene cosa vorresti fare e come lo stai facendo.

    Ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •