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

    Errore con require_once anche se il file esiste

    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

  2. #2
    Aspetta che cerco la palla di vetro...

  3. #3
    Originariamente inviato da k.b
    Aspetta che cerco la palla di vetro...
    non è che ci voglia molto a capire:
    codice:
    if (file_exists(path))
     require_once(path)
    ottengo l'errore:
    codice:
    Warning: require_once(1) [function.require-once]: failed to open stream: No such file or directory in

  4. #4
    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.

  5. #5
    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.
    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...

    ho letto su php.net riguardo al require, che può dipendere da open_basedir, ma non ho capito in che modo.

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    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));

  7. #7
    risolto:
    il problema stava nel file incluso che dava errore. Solo che non capisco una cosa: ho messo questa direttiva all'inizio della pagina:
    codice:
    error_reporting(E_ERROR | E_WARNING | E_NOTICE);
    ed ero convinto che mi mostrasse tutti gli errori, cosa non vera.
    l'ho sostituita con questa
    codice:
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    e ho beccato l'errore nel file incluso

    tra l'altro mi fuorviava questo codice:
    codice:
    require(path) or die('errore')
    che mi restituiva sempre il messaggio di "file non presente" (non si può utilizzare il "die" con "require"?)

    sono stato un pò brusco con k.b, mi scuso con lui. E' che mi stava facendo impazzire...

  8. #8
    Originariamente inviato da kylnas1
    non si può utilizzare il "die" con "require"?
    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

  9. #9
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    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
    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

    ?>
    che è molto più chiaro delle mie parole aggiungerei anche che è possibile effettuare u n controllo di questo tipo :

    Codice PHP:
    <?php 
    if(!@include('geronimo.php')) 
        die(
    'file non trovato!!');
     
    ?>
    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)

    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

  10. #10
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    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'.

    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!!).
    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.

    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
    include ... or die() non funziona, ma non per il motivo che hai detto tu, ma per una questione di sintassi.
    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

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 © 2025 vBulletin Solutions, Inc. All rights reserved.