• Super User

    Stampare un define dentro un require_once

    Salve a tutti,
    ho un define definto come

    [PHP]
    define(SITE_URL, 'http://www.nomesito.it');
    [/PHP]

    ed un
    [PHP]
    require_once('mappa.php);
    [/PHP]

    Bene, se scrivo:
    [PHP]
    require_once(SITE_URL . 'mappa.php);
    [/PHP]

    Non riesce a raggiungere il file, come mai?
    Cosa c'è che non va?

    Grazie.


  • User Attivo

    Forse così?
    [php]define(SITE_URL, 'http://www.nomesito.it/');[/php]


  • Super User

    Così assegno alla variabile SITE_URL il valore nomesito.it!


  • ModSenior

    Ciao,
    è normale che non si possa fare un require o un include passando un percorso di questo genere. Salvo particolari configurazioni del server, che per ovvi motivi di sicurezza non sono mai presenti, non puoi fare una cosa del genere.
    Devi basarti sul percorso della macchina locale, calcolandoti ad esempio un BASE_PATH che utilizzerai per avere dei percorsi assoluti, ma l'implementazione dipende da come hai strutturato il tutto.


  • User Attivo

    @felino non ho ben capito i nomi dei file in cui sono memorizzati i codici che hai postato.

    Ad occhio potrebbero esserci almeno un paio di errori:

    1. Nel primo codice penso che converrebbe aggiungere come ultimo carattere del host name uno slash "/". Motivo: se poi va a concatenarso con il 3° codice assumerà tutt'altro host name.
    2. Nel secondo codice manca l'apice prima della chiusura della parentesi tonda. Motivo: errore di sintassi.
    3. Per il 3° codice si ripete l'errore già esposto nel punto 2.

    Ciao.


  • Super User

    @Thedarkita said:

    Ciao,
    è normale che non si possa fare un require o un include passando un percorso di questo genere. Salvo particolari configurazioni del server, che per ovvi motivi di sicurezza non sono mai presenti, non puoi fare una cosa del genere.
    Devi basarti sul percorso della macchina locale, calcolandoti ad esempio un BASE_PATH che utilizzerai per avere dei percorsi assoluti, ma l'implementazione dipende da come hai strutturato il tutto.

    Immaginavo, quindi è un'operazione impossibile, tranne che passo il percorso assoluto scritto direttamente lì.

    Grazie.


  • User Attivo

    Allora, tanto per ricapitolare, all'inizio tu hai scritto che volevi fare
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    require_once(SITE_URL . 'mappa.php);
    [/php]

    Questo non può funzionare, come dicevamo insieme a MenteLibera, perché è sbagliata sia la composizione di stringa che la sintassi. Dovrebbe essere
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    require_once(SITE_URL . '/mappa.php');
    [/php]

    Poi come diceva Thedarkita, non funzionerebbe neanche se scrivessi
    [php]
    require_once('http://www.nomesito.it/mappa.php');
    [/php]

    Una volta però cercavo una soluzione a questo problema, e uno bravo mi ha suggerito una cosa come:
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    $ret = file_get_contents(SITE_URL . '/mappa.php');
    [/php]


  • Super User

    @davello said:

    Allora, tanto per ricapitolare, all'inizio tu hai scritto che volevi fare
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    require_once(SITE_URL . 'mappa.php);
    [/php]

    Interessante, quindi effettuare un get del contenuto del file.

    Ottimo, effettuo un test!


  • User Attivo

    @davello said:

    Questo non può funzionare, come dicevamo insieme a MenteLibera, perché è sbagliata sia la composizione di stringa che la sintassi. Dovrebbe essere
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    require_once(SITE_URL . '/mappa.php');
    [/php]

    E fino a qui ci siamo, senno è come se tu facessi
    [php]
    require_once('http://www.nomesito.itmappa.php');
    [/php]
    che è ovviamente sbagliato

    @davello said:

    Poi come diceva Thedarkita, non funzionerebbe neanche se scrivessi
    [php]
    require_once('http://www.nomesito.it/mappa.php');
    [/php]

    Ragazzi, non scriviamo cavolate. Mai sentito parlare di "allow-url-fopen" ? http://it2.php.net/manual/en/filesystem.configuration.php#ini.allow-url-include]. Nella pagina di manuale di "include" http://it2.php.net/manual/en/function.include.php] c'è un esempio in cui c'è scritto espressamente (esempio #3):
    [php]
    include 'http://www.example.com/file.txt?foo=1&bar=2';
    [/php]
    Almeno leggiamo il manuale prima di rispondere!!

    @davello said:

    Una volta però cercavo una soluzione a questo problema, e uno bravo mi ha suggerito una cosa come:
    [php]
    define(SITE_URL, 'http://www.nomesito.it');
    $ret = file_get_contents(SITE_URL . '/mappa.php');
    [/php]
    E allora non era tanto bravo, o non ha capito cosa gli chiedevi. Questa cosa non fa altro che prendere il contenuto del file, ma mica lo esegue (come fa invece "include", "require" e compagnia bella). Conta poi che se non è abilitato "allow_url_fopen" neanche questa cosa funziona, se è abilitato bisogna usare la sintassi di cui sopra.

    HTH, ciao! 🙂


  • User Attivo

    La cavolata di cui sopra l'ho scritta in base alla mia esperienza di utilizzo di hosting condivisi, in cui il php lo usi così com'è, e non sapendo su quale piattaforma si muove felino mi sono tenuto prudente.

    Riguardo all'esecuzione del codice richiesto, il file_get_contents che io sappia si comporta come un browser, quindi se chiamo un html o un jpeg apre il file, se è un php il server remoto lo eseguirà e ne invierà il risultato. Anche questo è sbagliato?


  • User Attivo

    @davello said:

    La cavolata di cui sopra l'ho scritta in base alla mia esperienza di utilizzo di hosting condivisi, in cui il php lo usi così com'è, e non sapendo su quale piattaforma si muove felino mi sono tenuto prudente.

    Ok, però un conto è dire "è impossibile", un altro "in certe condizioni questa cosa non si può fare" - contando poi che qualche metodo per settare allow_url_fopen anche in hosting condivisi c'è: http://stackoverflow.com/questions/3694240/add-allow-url-fopen-to-my-php-ini-using-htaccess

    @davello said:

    Riguardo all'esecuzione del codice richiesto, il file_get_contents che io sappia si comporta come un browser, quindi se chiamo un html o un jpeg apre il file, se è un php il server remoto lo eseguirà e ne invierà il risultato. Anche questo è sbagliato?
    Forse non è chiara la richiesta dell'OP: lui vuole includere un file remoto in uno script PHP, non eseguirlo da remoto e scaricarne l'output. E in più, leggendo la documentazione di questa funzione, le chiamate remote di file_get_contents funzionano se allow_url_fopen è attivo - nel qual caso funziona anche il "require" da remoto (sennò sarebbe troppo facile aggirare questo limite, no? :2:

    Scusa il mio tono un po' acido ma penso sia di vitale importanza rispondere in maniera corretta alle richieste sui forum - già così siamo pieni di "web developers" che fanno una marea di casini! 😉


  • Super User

    Grazie a tutti per il vostro interesse.

    Io al momento mi trovo su un dominio classico, nessun server dedicato.

    La mia esigenza nasce dal momento in cui ho un sito multilingua, quindi avrò url del tipo nomesito.it/it o nomesito.it/en etc... quindi pensavo ad un path assoluto.


  • User Attivo

    Se il file risiede sullo stesso server "fisico" perchè vuoi usare una chiamata HTTP per includerlo? Usa il path del file, che dovrebbe essere lo stesso sia per uno che per l'altro sito, no? O i due siti sono su due server diversi?


  • Super User

    Se ho un url del tipo www.nomesito.it allora basterà require('nomefile.php');

    Ma se ho un url del tipo www.nomesito.it/it allora sarà require('../nomefile.php');

    No?

    I due file sono sullo stesso server.


  • User Attivo

    Usa il document root per acchiappare il path giusto del file:
    [php]$_SERVER['DOCUMENT_ROOT'][/php]
    http://www.php.net/manual/en/reserved.variables.server.php

    Se il file è nella root del tuo sito puoi fare
    [php]require $_SERVER['DOCUMENT_ROOT'] . '/nomefile.php'[/php]

    Ricorda che qui stiamo parlando di path fisici (cioè come un qualsiasi file presente sul tuo hard disk), se usi HTTP parliamo di URL (quindi processate da un server HTTP)

    Ciao! 🙂


  • ModSenior

    Se ancora il sito non l'hai iniziato, ti conviene optare per scelte diverse.
    Cioè utilizzare la programmazione ad oggetti ed utilizzare un sistema di routing delle richieste, in maniera che tutte le richieste al sito passino attraverso il file index.php che si occupa di generare le costanti relative ai percorsi del server e indirizzare le richieste verso la classe corretta.

    Se non vuoi fare tutto questo a mano, dai un'occhiata a CodeIgniter, avevo iniziato a postare una breve guida che trovi nella sottosezione tutorial di questo forum(Anche se non è completa, perchè non ho avuto il tempo di finirla, come inizio per capire è più che sufficiente).


  • User Attivo

    Mah...

    • che cosa c'entra "la programmazione ad oggetti" con "un sistema di routing delle richieste"? Quello che tu suggerisci è un controller centrale caratteristico di molti framework e in generale dell'approccio MVC che può essere fatto sia programmando ad oggetti che non
    • come fai a dire che questo è un approccio "migliore" senza avere la più pallida idea della struttura attuale del progetto, delle competenze del programmatore e delle esigenze dell'intero sistema?
    • in ogni caso che cosa c'entra la tua risposta con la domanda originale del thread "Stampare un define dentro un require_once" - che poi ha coinvolto allow_url_fopen e l'include di file via HTTP ma che con pattern di programmazione, framework e struttura del codice non ha niente a che vedere?

    :mmm:


  • ModSenior

    Ti rispondo per punti:

    1. Si può fare anche senza, ma le differenze di leggibilità e di organizzazione del tutto mi sembrano ben evidenti.
    2. E' evidente che essendo un sito multilingua con esigenze variegate, come l'avere la lingua principale all'esterno, e le altre lingue accessibili tramite sottocartella, necessitano di un minimo di struttura fatta come si deve, e non semplici include messi come ha indicato lui, almeno se si vuole ottenere una cosa mantenibile nel tempo e che si possa estendere senza provocare problemi a ciò che già c'era.
    3. Parlare di include che riguardano la struttura di un progetto, e parlare di framework e struttura del codice mi sembrano esattamente la stessa cosa.
      L'approccio per quanto mi riguarda, è sbagliato, ed ho indicato la via che per me è corretta per fare ciò di cui lui ha bisogno all'atto pratico.
      E' libero di seguire o meno il mio consiglio, a me tra l'altro non cambia nulla, si può programmare in 1000 modi diversi e ottenere lo stesso risultato, semplicemente mi baso sulla mia esperienza e su ciò che vedo serve a chi chiede aiuto in questo forum per suggerire come fare determinate cose. Se poi per lui quello che ho scritto è una scemenza, ovviamente è libero di seguire una strada diversa e fare a modo suo.

  • User Attivo

    Il punto non è se quello che hai scritto è una scemenza o meno. Il punto è che un forum serve per dare risposte circostanziate e circoscritte a domande precise, non a disquisire genericamente su framework o strutture del codice o approcci di programmazione (temi che, come riconoscerai, richiedono ben più di un paio di post in un thread per essere anche solo superficialmente toccati). Il risultato è che si aggiunge più confusione che altro, non conoscendo peraltro il livello di preparazione del OP e in generale di chi leggerà il thread.

    Questo forum, tra l'altro, è uno dei meglio indicizzati da Google quindi se qualcuno cercherà in futuro "define dentro un require_once" troverà sicuramente questo thread che ad un certo punto si trasforma in una discussione sui migliori framework (e adesso su come si risponde in un forum - ovviamente ora mi taccio! :2: e quindi, quasi naturalmente, perderà il filo del discorso.

    Rimaniamo in tema, come mi diceva sempre la mia prof delle medie!!

    Ok, io la pianto qui... 🙂