_JD 1 Denunciar post Postado Dezembro 21, 2009 Boa tarde. Gostaria de uma ajuda em relação ao problema que me deparei. Tenho a seguinte estrutura de pastas: Pasta A a.php Pasta B b.php Pasta C c.php O arquivo b.php tem um iclude para o arquivo A/a.php, feito da seguinte forma: require_once("../A/a.php"); O arquivo a.php tem apenas um echo pra indicar que foi incluído. O arquivo c.php tem um include para B/b.php que por sua vez inclui o A/a.php, feito da seguinte forma: require_once("../B/b.php"); Os arquivos b.php e a.php se enxergam, porém quando carrego o c.php, dá erro que o a.php não foi encontrado: Warning: require_once(../DAO/PessoaDAO.php) [function.require-once]: failed to open stream: No such file or directory in /var/www/projeto/class/Pessoa/pessoa.class.php on line 3 acima é o erro com a minha aplicação. O que pode estar acontecendo? No aguardo. Compartilhar este post Link para o post Compartilhar em outros sites
~TiuTalk~ 7 Denunciar post Postado Dezembro 21, 2009 Tente começar a usar caminhos absolutos: http://www.php.net/manual/pt_BR/function.realpath.php Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 21, 2009 Tente começar a usar caminhos absolutos: http://www.php.net/manual/pt_BR/function.realpath.php Vou dar uma olhada, fazer umas tentativas e posto o resultado. Muito obrigado pela dica. Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 22, 2009 Como eu faço pra usar o realpath() no include/require? Tentei assim e não consegui: require_once(realpath("../DAO/PessoaDAO.php")); Tentei colocar numa variável e usar no include e também deu erro. Compartilhar este post Link para o post Compartilhar em outros sites
Mário Miranda 0 Denunciar post Postado Dezembro 22, 2009 O realpath serve para validar o caminho (true ou false) e retorna-lo absoluto canonicalizado. Não vai funcionar dentro do include. Primeiro você verifica , depois, se validar, você usa o include usando o caminho que você colocou no realpath. Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 22, 2009 Entendi. Eu fiz a seguinte validação para testar: if(realpath("../DAO/PessoaDAO.php")){ require_once("../DAO/PessoaDAO.php"); }else echo "Erro" ; O "Erro" foi exibido. Minha dúvida é a seguinte: Estando no arquivo que chama o "/DAO/PessoaDAO.php" eles se "enchergam" normalmente, porém quando o arquivo é incluído por outro arquivo aí o path fica como inválido. Deixa eu tentar melhorar isso: Estando no arquivo teste.php que chama o pessoa.class.php, que por sua vez chama o pessoaDao.php, o erro é apresentado. Porém estando em pessoa.class.php e chamando o pessoaDao.php o erro não ocorre. (Outra coisa que gostaria apenas de comentar é que fiquei realmente admirado com a solicitude do pessoal aqui. Muito obrigado desde já!) Compartilhar este post Link para o post Compartilhar em outros sites
Mário Miranda 0 Denunciar post Postado Dezembro 22, 2009 Vish... Eu não entendi... Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Dezembro 22, 2009 defina o caminho base numa constante exemplo <?php define( 'DS', DIRECTORY_SEPARATOR ); define( 'BASE_DIR', dirname( __FILE__ ) . DS ); sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial /* incluir arquivo 'a.php' que esteja dentro da pasta raíz '/' */ include BASE_DIR . 'a.php'; /* incluir arquivo 'b.php' que esteja dentro da pasta '/foo' */ include BASE_DIR . 'foo' . DS . 'b.php'; ?> simples assim... adote boas práticas de programação e não terá mais esse tipo de problema básico. pesquise sobre MVC Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 22, 2009 Vou fazer uma tentativa desta forma. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 22, 2009 Bacana hinom! Mas se quero acessar por exemplo de uma pasta dentro de /foo, por exemplo estando em /foo/foo2/a.php, quero acessar /foo/foo1/b.php, como faço? Vi que na forma que colocou ali, BASE_DIR é o caminho do arquivo atual e DS é o "/". É que eu não queria abandonar minha estrutura de arquivos que mantém dentro da pasta Classes, todas as classes que usarei no site e tem em uma pasta chamada source, os códigos das páginas. No aguardo. Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Dezembro 23, 2009 o valor de BASE_DIR, dependerá do ponto de execução do script se o script chamado estiver sempre dentro do diretório raíz (recomendado), não precisa alterar nada.. caso contrário, terá que prestar muita atenção com recuo de diretórios sempre o arquivo em EXECUÇÃO, estiver num local diferente da pasta raíz. vamos supor que uma nova situação: http://localhost/x.phpx.php está na pasta raíz, portanto, o código ficaria assimhttp://forum.imasters.com.br/public/style_emoticons/default/seta.gif <?php define( 'DS', DIRECTORY_SEPARATOR ); define( 'BASE_DIR', dirname( __FILE__ ) . DS ); sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial /* incluir arquivo 'a.php' que esteja dentro da pasta raíz '/' */ include BASE_DIR . 'a.php'; /* incluir arquivo 'b.php' que esteja dentro da pasta '/foo' */ include BASE_DIR . 'foo' . DS . 'b.php'; ?> http://localhost/foo/x.phpx.php está numa pasta um nível abaixo da pasta raíz, portanto, o código ficaria assimhttp://forum.imasters.com.br/public/style_emoticons/default/seta.gif <?php define( 'DS', DIRECTORY_SEPARATOR ); define( 'BASE_DIR', dirname( dirname( __FILE__ ) ) . DS ); sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial /* incluir arquivo 'a.php' que esteja dentro da pasta raíz '/' */ include BASE_DIR . 'a.php'; /* incluir arquivo 'b.php' que esteja dentro da pasta '/foo' */ include BASE_DIR . 'foo' . DS . 'b.php'; ?> Repare que é usado dirname() duas vezes. Cada dirname(), nesse caso, é equivalente a 1 recuo de diretório, com exceção do primeiro. O importante é que seja definido à constate "BASE_DIR", o caminho físico absoluto da pasta raíz. Se conseguir manter esse controle, não terá mais nenhum problema com essa questão. obs: evite o uso de realpath(). Realpath retorna, como o prórpio nome diz, o caminho real da execução de um determinado script. Em situações de execução por linha de comando (shell), o realpath não retorna o caminho de onde está o script, mas sim, de onde está o programa que executa o php.exe (plataforma windows). Por isso, o uso de dirname( __FILE__ ) é a alternativa recomendável ao realpath() Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 23, 2009 Boa tarde. Minhas tentativas com o uso das dicas do hinom têm dado certo. Realmente foi de muita utilidade ter lançado mão do fórum pra conseguir respostas às minhas questões. Se possível gostaria de uma orientação: É válido, do ponto de vista de boas práticas de programação, usar um arquivo com estas configurações de include? Por exemplo, eu posso criar constantes definindo os níveis possíveis que irei usar e guardá-las em um arquivo que chamarei antes dos outros includes, ou devo fazer os defines() no script que usará os includes? Eu pensei em usar uma constante para o recuo de um nível e outra para dois, algo deste tipo é aceitável? No aguardo. lendo sobre mvc... Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Dezembro 24, 2009 desde qeu funcione, sim.. é "aceitável" mas continue lendo sobre MVC e entenderá que é uma padronização simples que lhe permitirá organizar a estrutura do sistema de arquivos de modo prático e seguro, e passará a se preocupar mais com a regra do negócio do que com a parte básica de estrutura de código. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Dezembro 24, 2009 Uma pequena dica, para que vcoê "se encontre" no que vai ler pela frente, seria a modificação do include_path(), adicionando mais caminhos, nomenclatura das classes que vai usar e o recursos de autoload() das mesmas. Um bom exemplo é o Zend Framework, mesmo que nele, às vezes, um nome de classe possa ficar bem extenso. Compartilhar este post Link para o post Compartilhar em outros sites
_JD 1 Denunciar post Postado Dezembro 29, 2009 Boa tarde pessoal. Gostaria de agradecer às dicas que me foram muito úteis. Estou lendo sobre MVC e vou adotar boas práticas de programação. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites