Foros - Stratos

Stratos => Off-topic => Mensaje iniciado por: tewe76 en 15 de Enero de 2008, 06:17:17 PM

Título: Duda sobre el Include de PHP
Publicado por: tewe76 en 15 de Enero de 2008, 06:17:17 PM
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?
Título: Duda sobre el Include de PHP
Publicado por: karlesman en 15 de Enero de 2008, 11:37:37 PM
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
Título: Duda sobre el Include de PHP
Publicado por: Tei en 16 de Enero de 2008, 01:01:56 AM
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...
Título: Duda sobre el Include de PHP
Publicado por: Fenris78 en 16 de Enero de 2008, 02:02:36 AM
Mas info sobre las funciones necesarias para sacar la URL del server.

http://www.forosdelweb.com/f18/funcion-equivalente-document-url-php-363914/
Título: Duda sobre el Include de PHP
Publicado por: josepzin en 16 de Enero de 2008, 08:05:36 AM
Si quieres organizarte la vida con PHP usa un framework, en mi caso, desde que estoy usando CakePHP he visto "la luz".
Título: Duda sobre el Include de PHP
Publicado por: RobiHm en 16 de Enero de 2008, 12:20:55 PM
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,
Título: Duda sobre el Include de PHP
Publicado por: tewe76 en 16 de Enero de 2008, 12:59:04 PM
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)
Título: Duda sobre el Include de PHP
Publicado por: RobiHm en 17 de Enero de 2008, 12:54:56 AM
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.
Título: Duda sobre el Include de PHP
Publicado por: tewe76 en 17 de Enero de 2008, 12:56:16 PM
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.
Título: Duda sobre el Include de PHP
Publicado por: jalbam en 17 de Enero de 2008, 02:14:05 PM
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 :)
Título: Duda sobre el Include de PHP
Publicado por: yens en 17 de Enero de 2008, 03:12:09 PM
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 ^^
Título: Duda sobre el Include de PHP
Publicado por: Tei en 17 de Enero de 2008, 03:16:48 PM
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.
Título: Duda sobre el Include de PHP
Publicado por: fjfnaranjo en 21 de Enero de 2008, 04:23:57 PM
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...