- Home
- Categorie
- Coding e Sistemistica
- PHP
- Stampare un define dentro un require_once
-
@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.
-
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]
-
@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!
-
@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!
-
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?
-
@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?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!
-
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.
-
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?
-
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.
-
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.phpSe 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!
-
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).
-
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?
-
Ti rispondo per punti:
- Si può fare anche senza, ma le differenze di leggibilità e di organizzazione del tutto mi sembrano ben evidenti.
- 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.
- 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.
-
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! 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...