Salve a tutti,
non capisco perché ottengo l'errore su un require_once quando il file sono sicuro che è esiste (utilizzo la funzione "file_exists").
qualche idea?
grazie
Salve a tutti,
non capisco perché ottengo l'errore su un require_once quando il file sono sicuro che è esiste (utilizzo la funzione "file_exists").
qualche idea?
grazie
non è che ci voglia molto a capire:Originariamente inviato da k.b
Aspetta che cerco la palla di vetro...
ottengo l'errore:codice:if (file_exists(path)) require_once(path)
codice:Warning: require_once(1) [function.require-once]: failed to open stream: No such file or directory in
Non ci vuole neanche molto a capire il messaggio d'errore. Non e' possibile che il file esista dove dici tu e require non lo trovi, quindi e' evidente che c'e' qualche errore nel path.
secondo te non ho controllato? il path si trova all'interno di un variabile, quindi come la passo alla funzione "file_exists" la passo anche alla require...Originariamente inviato da k.b
Non ci vuole neanche molto a capire il messaggio d'errore. Non e' possibile che il file esista dove dici tu e require non lo trovi, quindi e' evidente che c'e' qualche errore nel path.
ho letto su php.net riguardo al require, che può dipendere da open_basedir, ma non ho capito in che modo.
se si trattasse di una restrizione open_basedir/safe_mode otterresti un messaggio di errore rilevante, tipo "open basedir restriction in effect".. etc e file_exists() restituirebbe false.
Il file e' leggibile dall'utente con cui gira il webserver?
clearstatcache();
var_dump(is_readable($path));
risolto:
il problema stava nel file incluso che dava errore. Solo che non capisco una cosa: ho messo questa direttiva all'inizio della pagina:
ed ero convinto che mi mostrasse tutti gli errori, cosa non vera.codice:error_reporting(E_ERROR | E_WARNING | E_NOTICE);
l'ho sostituita con questa
e ho beccato l'errore nel file inclusocodice:ini_set('display_errors', 'On'); error_reporting(E_ALL);![]()
tra l'altro mi fuorviava questo codice:
che mi restituiva sempre il messaggio di "file non presente" (non si può utilizzare il "die" con "require"?)codice:require(path) or die('errore')
sono stato un pò brusco con k.b, mi scuso con lui. E' che mi stava facendo impazzire...![]()
Sto studiando e ho anche io questo dubbio... ora provo ad esprimere quello che ho capito (ma di cui nn sono per nulla convinto!!! )... aspettanto che gli esperti mi chiarifichino le idee anche a me.Originariamente inviato da kylnas1
non si può utilizzare il "die" con "require"?
include, require, die, exit, define, echo, etc. etc. sono dei costrutti (non delle funzioni ... come indicato sulla guida di html.it!!)
infatti non si può scrivere:
$result = include("file.php");
in pratica i costrutti non danno un output ma eseguono un'azione (un comando elementare)... per tanto il costrutto include non darà alcun risultato... nemmeno un risultato boleanno (TRUE/FALSE)!
Specificatamente include se trove il file lo include... altrimenti darà un warning (NON FALSE!!)
L'utilizzo del costrutto die/exit scritto nella sintassi funzione() or die (); determina che qualora la funzione() darà come risultate FALSE si ha l'interruzione del flusso dello script...
ma include non è una funzione ovvero non dà un risultato boleano
Originariamente inviato da oly1982
Sto studiando e ho anche io questo dubbio... ora provo ad esprimere quello che ho capito (ma di cui nn sono per nulla convinto!!! )... aspettanto che gli esperti mi chiarifichino le idee anche a me.
include, require, die, exit, define, echo, etc. etc. sono dei costrutti (non delle funzioni ... come indicato sulla guida di html.it!!)
infatti non si può scrivere:
$result = include("file.php");
in pratica i costrutti non danno un output ma eseguono un'azione (un comando elementare)... per tanto il costrutto include non darà alcun risultato... nemmeno un risultato boleanno (TRUE/FALSE)!
Specificatamente include se trove il file lo include... altrimenti darà un warning (NON FALSE!!)
L'utilizzo del costrutto die/exit scritto nella sintassi funzione() or die (); determina che qualora la funzione() darà come risultate FALSE si ha l'interruzione del flusso dello script...
ma include non è una funzione ovvero non dà un risultato boleano
bravo, l'approccio è giusto!
studiare e confrontarsi con gli altri![]()
![]()
![]()
include, come descritto anche nella documentazione ufficiale, produce SEMPRE un risultato, che può dipendere da un return finale nel file incluso o sull' effettiva buona riuscito dell' inclusione.
riportando l'esempio ufficiale
che è molto più chiaro delle mie parole aggiungerei anche che è possibile effettuare u n controllo di questo tipo :Codice PHP:
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
in sintesi: la @ evita qualsiasi tipo di errore in output (in questo caso il warning sollevato dall' inesistenza del file geronimo.php, e l'if controlla quindi se l'inclusione mi restituisce TRUE o FALSE (TRUE=file regolarmente incluso e FALSE = inclusione fallita)Codice PHP:
<?php
if(!@include('geronimo.php'))
die('file non trovato!!');
?>
QUESTO OVVIAMENTE SE GERONIMO NON HA NESSUN RETURN, VICEVERSA OTTERREI LA VARIABILE RESTITUITA E CONTROLLEREI A QUESTO PUNTO IL SUO VALORE, NON L'INCLUSIONE DEL FILE
![]()
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb
Originariamente inviato da oly1982
include, require, die, exit, define, echo, etc. etc. sono dei costrutti (non delle funzioni ... come indicato sulla guida di html.it!!)![]()
define() pero' non e' un costrutto.
infatti non si può scrivere:
$result = include("file.php");![]()
si puo'.
I costrutti possono restituire un valore. Ad esempio print() restituisce sempre 1, mentre include() restituisce: false se non puo' includere il file, 1 se lo include ma non c'e' nessun return nel file, blabla dove blabla e' il return del file incluso. Con i file remoti il discorso puo' cambiare.in pratica i costrutti non danno un output ma eseguono un'azione (un comando elementare)... per tanto il costrutto include non darà alcun risultato... nemmeno un risultato boleanno (TRUE/FALSE)!
Specificatamente include se trove il file lo include... altrimenti darà un warning (NON FALSE!!).
include ... or die() non funziona, ma non per il motivo che hai detto tu, ma per una questione di sintassi.L'utilizzo del costrutto die/exit scritto nella sintassi funzione() or die (); determina che qualora la funzione() darà come risultate FALSE si ha l'interruzione del flusso dello script...
ma include non è una funzione ovvero non dà un risultato boleano
Scrivi
(@include 'non esiste.php') or die('ciccia');
e vedrai che funziona
Per il semplice motivo che, essendo include un costrutto speciale, che non ha bisogno di parentesi ma valuta il contenuto tra le virgolette
l'espressione
@include 'non esiste.php' or die('ciccia');
viene interprettata dal parser come:
@include ('non esiste.php' or die('ciccia'));
con altre parole
@include(1);
e di conseguenza va a puttane.
ps: dottwatson mi ha anticipato, ma dal momento che stavo comunque scrivendo questo post, lo pubblico lo stesso![]()