Brulec 0 Denunciar post Postado Julho 22, 2011 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
hinom 5 Denunciar post Postado Julho 23, 2011 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
Bruno Augusto 417 Denunciar post Postado Julho 23, 2011 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
Brulec 0 Denunciar post Postado Julho 23, 2011 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
hinom 5 Denunciar post Postado Julho 23, 2011 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
Brulec 0 Denunciar post Postado Julho 23, 2011 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
hinom 5 Denunciar post Postado Julho 23, 2011 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