Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Brulec

[Resolvido] Como saber a raiz do projeto

Recommended Posts

Pessoal, estou começando a trabalhar com o PHP agora e tenha a seguinte dúvida.

 

Hoje quando quero incluir um .php na minha página estou usando o usando o código abaixo para certificar de que o caminha esteja correto.

 

include ($_SERVER['DOCUMENT_ROOT']. substr($_SERVER['PHP_SELF'],0, strpos($_SERVER['PHP_SELF'],"/",1))."/modelo/modelo.php");

 

Acontece que quando tento executar esse php via DOS assim: C:\xampp\htdocs\Projeto\modelo>php olamundo.php

 

Levando em consideração o arquivo olamundo.php possui no início o código mostrado acima.

Ele retorna erro dizendo que não encontra o modelo.php

 

Se rodar o olamundo.php via browser funciona mas, via linah de comando não.

 

Alguém pode me informar uma maneira melhor de incluir os arquivos no ínicio e ter certeza de que vai ser encontrado?

 

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

recomendo usar a constante mágica

 

__FILE__

 

exemplo

 

 

execute isso e veja o resultado

echo __FILE__;
echo '<br />' . dirname( __FILE__ );

 

se quiser recuar dois diretórios

 

echo dirname( dirname( __FILE__ ) );

 

 

defina também o separador de diretórios.

o php também oferece uma constante

 

"DIRECTORY_SEPARATOR"

 

define( 'DS', DIRECTORY_SEPARATOR ); // não é necessário definir nova constante, mas devido ao tamanho da string original ser extensa, a maioria opta por uma sigla.

 

o motivo de usar o DIRECTORY_SEPARATOR é que em abmientes Windows o separador de diretórios á uma barra invertida \ ( backslash ), em ambiente unix é barra normal / ( slash )

 

ao invés de escrever

$path = '/var/www/website/';

faça:

$path = DS . 'var' . DS . 'www' . DS . 'website' . DS;

 

 

 

consulte:

http://php.net/manual/en/language.constants.predefined.php

http://php.net/manual/en/dir.constants.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um complemento aliado à dica do hinom.

 

O uso de dirname( __FILE__ ) deve ser feito no primeiro arquivo a ser acessado pela aplicação. Se esse arquivo for index.php mas nele houver um include para outro, como config.php, presente no mesmo diretório que o index.php, defina nele.

 

Assim, sempre que o index.php a constante estará definida. E todo e qualquerinclude ficará mais fácil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado hinom, sua resposta ajudou bastante.

Agora ficou assim:

 

include(dirname(dirname(__FILE__))."/modelo/modelo.php");

 

E rodou direitinho no DOS via linha de comando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

excelente obervação do Bruno.

é importante para não criar confusão.

 

preferi não extender muito o post, para postar em separado, como complemento, outras dicas:

 

 

há casos onde fica muito extenso usar dirname( dirname ( dirname() ) ) ...

 

em casos onde for recuar mais que dois diretórios é melhor usar o DiRECTORY_SEPARATOR

 

exemplo usando o caso do Brulec e aproveitando para corrigir, pois apesar da dica, continuou usando as barras diretamente no código:

 


define( 'DS', DIRECTORY_SEPARATOR ); 

include( dirname( dirname( __FILE__ ) ) . DS . 'modelo' . DS . 'modelo.php' ); // assim estará compatível com sistemas windows e unix

// ou usando o modo mais simples recuando diretórios usando dois pontos ( .. )
// include( dirname( __FILE__ ) . DS . '..' . DS . 'modelo' . DS . 'modelo.php' );

 

 

E rodou direitinho no DOS via linha de comando.

Quanto a isso, outra observação,

Evite usar a função realpath() para essa finalidade, porque quando o php é executado por linha de comando, o realpath obtém o caminho de onde está o executável do interpretador do PHP ao invés do path real do arquivo. Por isso, sempre utilize o dirname( __FILE__ )

Há muitos livros ( mal escritos ) e também artigos na internet que ensinam a usar realpath para esse fim, mas não utilize, pois estão errados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado a todos pelas respostas e dicas.

 

Só mais uma coisa.

 

Esse projeto está rodando tanto em linux como em Windows e todos os includes eu utilizo essa barra "/" e funciona perfeitamente sem utilizar a constante DIRECTORY_SEPARATOR .

Compartilhar este post


Link para o post
Compartilhar em outros sites

depende da versão do sistema operacional

 

suponha que um dia tenha que hospedaar o sistema num host que tenha, por exemplo windows 2003 server ou pior, windws 2000..

aí tera problemas

 

ou ainda pode acontecer de uma próxima versão do windows volte a interpretar como barra invertida somente, negando a barra normal.. aí terá problemas.

 

por isso, é melhor manter o sistemas o mais flexíveis possível, abstraindo dados de forma mais segura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.