Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda sobre el Include de PHP

Iniciado por tewe76, 15 de Enero de 2008, 06:17:17 PM

« anterior - próximo »

tewe76

Antes de nada, soy novato total en PHP. Lo único que sé de este lenguaje es lo que deducí retocando el Theme de wordpress para el blog de www.LaRebelionDelBiberon.com .

Una de las cosas más interesantes que ví fue lo del Include, ya que permite no repetir código para hacer lo mismo en distintos sitios.

Sin embargo, tengo un problema que no sé si tiene solución. Lo explicaré con un ejemplo:
1- Tengo un archivo http://www.pepe.com/Papa.php con una llamada Include del tipo "<?php include("Includes/MiInclude.php"); ?>"
2- Tengo un archivo http://www.pepe.com/Popo/Popo.php con una llamada Include del tipo "<?php include("../Includes/MiInclude.php"); ?>"

Hasta aquí todo bien. Tengo que personalizar la llamada Include para cada archivo, dependiendo de en qué subnivel esté, pero bien, es asumible. No obstante, para evitar ésto, pruebo a llamarlo con una URL completa, es decir,  "<?php include("http://www.pepe.com/Includes/MiInclude.php"); ?>", pero no me permite ejecutarla.

Pero me surje un problema mucho más grave (en cuanto que no tiene solución que yo conozca):
3- El archivo http://www.pepe.com/Includes/MiInclude.php tiene a su vez una llamada Include "<?php include("MiSUBInclude.php"); ?>"

Problemón: si llamo a MiInclude desde Papa.php, en MiInclude tendría que poner "<?php include("Includes/MiSUBInclude.php"); ?>", pero si lo llamo desde Popo.php, no funcionará, sino que tendría que poner "<?php include("../Includes/MiSUBInclude.php"); ?>", ya que MiInclude no se "ejecuta" en la carpeta Includes, sino en la carpeta del php que la llama, por lo que su ruta relativa cambia en cada caso.

¿Tiene solución? ¿Hay alguna forma de que admita llamadas del tipo "<?php include("http://www.pepe.com/Includes/MiInclude.php"); ?>", con lo que se solucionaría el tema? ¿Hay alguna función PHP que devuelva la ruta del dominio (creo que no se llama así, me refiero a que devuelva "http://www.pepe.com") para a partir de ella crear una ruta absoluta? ¿Alguna otra solución?
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

karlesman

Al incluir un fichero NO debes poner la ruta web como<?php include("http://www.pepe.com/Includes/MiInclude.php"); ?> sino la direccion fisica del Fichero <?php include("C:/miweb/Includes/MiInclude.php"); ?>

Lo que buscas es $_SERVER["DOCUMENT_ROOT"].
Utiliza la funcion phpinfo() para ver toda la informacion del sistema disponible

Tei

deberias tener un directorio para clases, otro distinto para codigo procedural, templates, etc..  entonces tener uno que haga de main, y quien sea el que cargue todo. entonces todo es relativo a este main.

dirname( __FILE__) te da el path absoluto (ejecutado en el main) por si acaso lo quieres utilizar en alguna estrategia de includes

por ser PHP un lenguaje interpreteado, tu estrategia de includes lo dice todo sobre .. bueno, como se va ejecutar tu programa y que tan flexible a extensiones sera.  hay mucho que hablar del tema.  incluso hay gente uqe ha inventado mecanismos de autoload para que se cargue una clase cuando se trata de crear una instancia...

Fenris78


josepzin

Si quieres organizarte la vida con PHP usa un framework, en mi caso, desde que estoy usando CakePHP he visto "la luz".

RobiHm

ave... si estas incluyendo se toma la ruta del archivo actual...

si haces un include de "algo" que esta en el directorio "includes" desde "popo" la ruta del "include" que tomará "algo" será a partir de "includes", así que puedes incluir lo que te venga en gana dentro del archivo "algo" desde donde quieras puesto que la ruta como referencia por defecto es la de la ubicación del archivo "algo" uséase "lbalbalbabla/misitio/includes/" :D,
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

tewe76

Gracias por las respuestas, sobre todo a Karlesman, ya que me he quedado con su solución de "$_SERVER["DOCUMENT_ROOT"]." :wink:
Ahora, con " <?php include($_SERVER["DOCUMENT_ROOT"]."/Includes/MiInclude.php"); ?> " puedo llamar a mis includes sin importar desde dónde. Soy un hombre feliz :lol:

A los demás:
-Lo de tener un main CREO que no puedo, ya que dentro de la web tengo un Wordpress, sobre cuya estructura no tengo dominio.
-A RobiHm: yo también suponía que era así, pero la práctica me ha dicho lo contrario. Si A incluye a B que incluye a C, C se ejecuta desde A, NO desde B.

En cualquier caso, gracias a todos :D . Esto me va a simplificar el mantenimiento de la web. 8)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

RobiHm

Cita de: "tewe76"
-A RobiHm: yo también suponía que era así, pero la práctica me ha dicho lo contrario. Si A incluye a B que incluye a C, C se ejecuta desde A, NO desde B.

Pués es bastante raro que a mi me lleve toda la vida funcionando xD
He buscado para comprobar que puede ser y lo único que se me ocurre es el:
http://es.php.net/manual/es/ini.core.php#ini.include-path

Respecto a lo otro si tu versión es superior configurando allow_url_fopen si te permite enlaces externos
http://es.php.net/manual/es/ref.filesystem.php#ini.allow-url-fopen
CitarSi "URL fopen wrappers" esta activada en PHP (como está en la configuración inicial), se puede especificar el fichero que se va a incluir usando una URL (via HTTP u otro mecanismo soportado...
CitarWarning
Versiones de PHP para Windows anteriores a 4.3.0, no soportan el acceso remoto a archivos para esta función, no funcionará ni activando siquiera allow_url_fopen.
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

tewe76

No sé, RobiHm :?
De todas maneras he encontrado una solución que me sirve y no necesito/tengo tiempo/quiero buscar más :)
Gracias en cualquier caso.
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

jalbam

Hola, buenas.

Yo me he encontrado muchas veces con problemas similares y a veces, si no tienes más remedio que llamar a un archivo desde más de un archivo, lo mejor es utilizar la función file_exists() de PHP en un IF (siempre y cuando no vaya a pasar siempre por la misma sentencia IF, lo cual podría ser si tuvieras en la misma ruta archivos con el mismo nombre... de ser así puedes usar "trucos" como poner archivos según el directorio/ruta para distinguir éste).

Piensa que los includes son como si pusieras el código escrito "a mano" en el archivo "padre" que los incluye. Aunque según que versiones de PHP son "inteligentes" y si no encuentran la ruta del archivo desde el padre, lo prueban desde el hijo (o viceversa, ahora no recuerdo bien).

Espero haberte ayudado. La verdad es que por pereza no me he leido todo el hilo ni tu post en la totalidad (ahora tengo algo de prisa), así que lo siento si no encaja bien mi respuesta.

Saludos :)
-----
Juan Alba Maldonado

yens

Ains llego tarde, yo me topé con el mismo problema hará cosilla de un mes cuando estaba trasteando con unas pruebas de abstracción que estaba haciendo.

Dale duro que está muy bonito el php5 ^^

Tei

por completitud:

mejor que include es include_once, puesto que este ultimo evita las inclusiones repetidas.  aunque esto ultimo se podra evitar de otras maneras.

fjfnaranjo

por re-completitud:

existe también la version require, require_once, que incluye el fichero y si no puede incluirlo directamente reporta error y aborta el script...
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.