2011-10-20 22 views
7

Ho 3 file: home, failed_attempt, login.include_once, percorso relativo in php

Il file home e failed_attempt si riferiscono tutti al file di accesso.

La cosa fastidiosa è che si sbagliano dicendo che il file di accesso non esiste. casa farà un'eccezione se lo faccio, ma failed_attempt wunt.

include_once("../StoredProcedure/connect.php"); 

include_once ("../ untitled/sanitize_string.php");

e se faccio questo:

include_once("StoredProcedure/connect.php"); 
    include_once("untitled/sanitize_string.php"); 

succede il contrario, failed_attempt genera un'eccezione, ma a casa, abituato. Come posso risolvere questo problema ..

faccio a dire l'inclusione di salire una pagina mettendo questo ../, e quindi home.php non ha bisogno di andare una pagina in alto quindi lancia questa eccezione ..

Come posso fare in modo entrambi i file accettare quei inclueds come valido .. forse non rispetto al punto in cui sono collocati .. cioè senza che ../

struttura di directory:

PoliticalForum 
->home.php 
->StoredProcedure/connect.php 
->untitled/sanitize_string.php 
->And other irrelevant files 
+1

La tua domanda non è molto chiaro. I file home, failed_attempt e login sono nella stessa directory? Puoi pubblicare la tua struttura di directory? In che modo esattamente le pagine home e failed_attempt "si riferiscono" al file di accesso? In quale file appare il codice sopra? – megaflop

+0

storedProcedure è la mia cartella e contiene file interni. tutto come descritto .. il file di login ha 2 include in esso che non riescono a caricare, a seconda di dove li chiami da ... homepage o login_attempt pagina che si trova all'interno di una directory diversa – Matrix001

risposta

7

Ecco tre possibili soluzioni. I secondi sono in realtà solo work-around che usano percorsi assoluti in modo intelligente.

1: chdir nella directory corretta

<?php 

// check if the 'StoredProcedure' folder exists in the current directory 
// while it doesn't exist in the current directory, move current 
// directory up one level. 
// 
// This while loop will keep moving up the directory tree until the 
// current directory contains the 'StoredProcedure' folder. 
// 
while (! file_exists('StoredProcedure')) 
    chdir('..'); 

include_once "StoredProcedure/connect.php"; 
// ... 
?> 

Si noti che questo funziona solo se la cartella StoredProcedure si trova nella directory più in alto di tutti i file che potrebbe aver bisogno di includere i file in essa contenuti.

2: Usa percorsi assoluti

Ora, prima di dire che questo non è portabile, in realtà dipende da come si sceglie di implementare esso. Ecco un esempio che funziona con Apache:

<?php 
include_once $_SERVER['DOCUMENT_ROOT'] . "/StoredProcedure/connect.php"; 
// ... 
?> 

In alternativa, sempre con apache, inserire il seguente nel vostro .htaccess nella directory principale:

php_value auto_prepend_file /path/to/example.php 

Poi nel example.php:

<?php 

define('MY_DOC_ROOT', '/path/to/docroot'); 

?> 

E infine nei file:

<?php 
include_once MY_DOC_ROOT . "/StoredProcedure/connect.php"; 
// ... 
?> 

3: include_path di Set PHP

Vedi the manual entry for the include_path directive. Se non si dispone di accesso al file php.ini, allora questo può essere impostato in .htaccess, fornendo si utilizza Apache e PHP è non installato come CGI, in questo modo:

php_value include_path '/path/to/my/includes/folder:/path/to/another/includes/folder' 
+0

Sono un po 'oscuro su come funziona il primo metodo. Ma proverò il secondo e il terzo metodo – Matrix001

+0

Ho aggiunto commenti al primo metodo. Per maggiori informazioni, consultare [la pagina di manuale di chdir] (http://uk3.php.net/manual/en/function.chdir.php). – megaflop

2

fare qualcosa di simile require(dirname(__FILE__) . '[RELATIVE PATH HERE]');

+0

vuoi dire qualcosa del genere: [codice] include_once (dirname (__ FILE__). "../StoredProcedure/connect.php "); include_once (dirname (__ FILE__)." ../ untitled/sanitize_string.php "); .. non funziona [/ code] – Matrix001

+0

dirname (__ FILE__) restituirà la directory corrente in cui esiste un file con codice di inclusione basta aggiungere il percorso relativo a questo file Per comodità puoi stampare il valore di dirname (__ FILE__) e vedere cosa sta succedendo – Dev

+0

ma non funziona correttamente \t include_once (dirname (__ FILE __). "../ StoredProcedure/User/login.php "); quando includo l'accesso fa problemi ... la tua riga di codice non funziona – Matrix001

7

Cose come realpath() e __DIR__ sono i tuoi amici quando si tratta di creare percorsi in PHP.

Realpathhttp://php.net/manual/en/function.realpath.php

Magia costantihttp://php.net/manual/en/language.constants.predefined.php

Dato che include e require sono costrutti linguistici (piuttosto che funzioni) non hanno bisogno di parentesi. In generale si utilizza include per includere "templates" (file di output) e require per includere file PHP come le classi.

Così si potrebbe usare qualcosa come:

$sPath = realpath(__DIR__ . '/../relative/path/here'); 
if($sPath) { require_once $sPath; } 

(uso dirname(__FILE__) invece di __DIR__ su PHP < 5)

Vale la pena di valutare il percorso prima di tentare di richiedere il file come realpath() restituisce false se il il file non esiste e il tentativo di require false; genera un errore PHP.

In alternativa si può semplicemente utilizzare percorsi assoluti come:

require /home/www/mysite.com/htdocs/inc/somefile.php

+0

Anche questo non funziona: include_once (realpath ("../ untitled/sanitize_string.php")); – Matrix001

+0

Ha rimosso gli errori. Ma cosa succede se realpath restituisce false? non significherebbe che il file non sarà incluso .. quando realpath restituisce false ?? – Matrix001

+0

'realpath()' restituisce false se il percorso immesso come parametro non esiste, ad esempio 'realpath ('this/file/does/not/exist');' restituisce false - se il file ** non * * esiste quindi restituirà il percorso reale al file dato in modo che 'realpath (__ DIR__. '/ this/file/does/exist');' possa restituire qualcosa come '/home/mysite.com/htdocs/this/file/does/exist' - es il vero percorso completo. – CD001

1

Gli altri ragazzi hanno risposto correttamente alla tua domanda, ma ho pensato di contribuire qualcosa di diverso: autoloader.

I caricatori automatici consentono di definire una funzione che includerà automaticamente determinati file quando si tenta di utilizzare una classe.

La documentazione è qui e può spiegare meglio di me: http://php.net/manual/en/language.oop5.autoload.php

Consiglio veramente li utilizzano, vi farà risparmiare tempo ed è meglio la pratica.

+0

Li conosco..come si avvia la pagina i file sono caricati..si metti i tuoi include al loro interno..ma non risolve il problema al mio quesiton lo fa? – Matrix001

3

Per i principianti questo aiuterà a capire. Utilizzare semplicemente il seguente in base al percorso relativo:

//include file directly from parent directory: 
include_once(dirname(__FILE__) . '/../connect.php'); 

O

//include file from parent's child directory: 
include_once(dirname(__FILE__) . '/../StoredProcedure/connect.php'); 

O

//include file from own child directory: 
include_once('StoredProcedure/connect.php'); 

O

//include sibling files from same directory: 
include_once('connect.php');