elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  paginas incluidas no funcionan correctamente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: paginas incluidas no funcionan correctamente  (Leído 9,629 veces)
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
paginas incluidas no funcionan correctamente
« en: 28 Septiembre 2014, 05:20 am »

Hola, estoy teniendo un molesto problema a la hora de incluir paginas en php. El problema que tengo es causado al poner el mismo include en dos paginas y una de las paginas es incluida en la otra.

Paso a explicarlo mejor:

Tengo un index.php (.htaccess redirecciona todo aqui)
Código
  1. include_once '/themes/default/views/layouts/main.php';
  2.  
  3. function showContent() {
  4. [...]
  5. }

/themes/default/views/layouts/main.php
Código
  1. include_once('/includes/functions.php'); //why this include doesn't work for login.php
  2.  
  3. // html and php code
  4.  
  5. showContent(); //will include login.php

y una de las paginas a incluir, pero ocurre con otras paginas con el mismo include y la misma funcion.
/views/site/login.php
Código
  1. <?php
  2. include_once('/includes/functions.php');
  3.  
  4. sec_session_start();
  5.  
  6. if (login_check($mysqli) == true) {
  7.    $logged = 'in';
  8. } else {
  9.    $logged = 'out';
  10. }
  11. ?>

Este es el error que da:
Citar
Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 7

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 151

La variable $mysqli esta creada en db_connect.php que esta incluido en functions.php y en un principio funciona perfectamente....

db_connect.php
Código
  1. include_once 'config.php';
  2. $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

Y el otro error tambien me lo ha dado muchas otras veces con varias funciones mysqli (como execute() o get_result()) y aun no lo he arreglado, simplemente han desaparecido y aparecido en disitintas paginas, al crear un prepared statement. Esto es lo que me ha podido decir un amigo respecto a este error:

Citar
You get the call to member function on non-object error, when you try to call a function in $this-> scope when the object hasn't been instantiated.

Entonces, ¿como hago eso de estanciar el objeto? if ($stmt = $mysqli->prepare("SQL"))

Lo curioso es que no da ningún error si quito el include de main.php, pero entonces tengo que comentar las funciones que llamo...

Si en lugar de include_once utilizo include en login.php me da el siguiente error:
Citar
Fatal error: Cannot redeclare sec_session_start() (previously declared in C:\xampp\htdocs\includes\functions.php:6) in C:\xampp\htdocs\includes\functions.php on line 26

Este es el codigo del error:
Código
  1. function sec_session_start() {   // Esta es la linea 6 de functions.php
  2.    $session_name = 'sec_session_id';   // Set a custom session name
  3.    $secure = SECURE;
  4.    // This stops javascript being able to access the session id.
  5.    $httponly = true;
  6.    // Forces sessions to only use cookies.
  7.    if (ini_set('session.use_only_cookies', 1) === FALSE) {
  8.        header("Location: /error?err=Could not initiate a safe session (ini_set)");
  9.        exit();
  10.    }
  11.    // Gets current cookies params.
  12.    $cookieParams = session_get_cookie_params();
  13.    session_set_cookie_params($cookieParams["lifetime"],
  14.        $cookieParams["path"],
  15.        $cookieParams["domain"],
  16.        $secure,
  17.        $httponly);
  18.    // Sets the session name to the one set above.
  19.    session_name($session_name);
  20.    session_start();            // Start the PHP session
  21.    session_regenerate_id();    // regenerated the session, delete the old one.
  22. }    // Esta es la linea 26 de functions.php

¿Alguna idea de como arreglar esto? ¡Llevo horas intentando arreglarlo pero no consigo nada!

Gracias!


En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: paginas incluidas no funcionan correctamente
« Respuesta #1 en: 29 Septiembre 2014, 22:37 pm »

La ruta que has puesto no es relativa, es absoluta y lo más probable es que la ruta no exista. Si el script se ejecuta desde /var/www por ejemplo y quieres incluir un archivo de /var/www/html/index.php tienes que usar:

Código:
./html/index.php

o

Código:
html/index.php

Aunque es mejor de la primera forma, en caso de que el . no este en el include path de tu php.ini


En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: paginas incluidas no funcionan correctamente
« Respuesta #2 en: 30 Septiembre 2014, 05:29 am »

Gracias por responder, era el típico fallo, como casi siempre pasa... un molesto fallo que es imposible de ver :)

El problema estaba en la manera de incluir los archivos, depues de googlear pude ver las 4 distintas maneras de incluir archivos archivos en php:

Citar
  • require
    when the file is required by your application, e.g. an important message template or a file containing configuration variables which with without the app would break.

   
  • require_once
    when the file contains content that would produce an error on subsequent inclusion, e.g. function important() { /* important code */} is definitely needed in your application but since functions cannot be redeclared should not be included again.

   
  • include
    when the file is not required and application flow should continue when not found, e.g.
    great for templates referencing variables from the current scope or something

   
  • include_once
    optional dependencies that would produce errors on subsequent loading or maybe remote file inclusion that you do not want to happen twice due to the HTTP overhead

Según tengo entendido require_once es la manera "por defecto" y así he hecho. Pero claro no es tan facil:

Para incluir un archivo de contenido html/php uso include normal.

index.php
Código
  1.    include('themes/sportislife/views/layouts/main.php');
  2.  
  3.    function showContent() {
  4.    [...]
  5.    }

Para las funciones uso el require_once

main.php
Código
  1.    require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  2.    include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');  // ya esta incluido en functions.php
  3.                                                                      // pero si no lo incluyo de esta manera me da error... y asi no da error
  4.  
  5.    // html and php code
  6.  
  7.    showContent(); //will include login.php

Lo mismo para los archivos de contenido html/php "views":

login.php
Código
  1.    <?php
  2.    require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  3.    include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
  4.  
  5.    sec_session_start();
  6.  
  7.    if (login_check($mysqli) == true) {
  8.       $logged = 'in';
  9.    } else {
  10.       $logged = 'out';
  11.    }
  12.    ?>

No hay ningún problema por usar $_SERVER['DOCUMENT_ROOT'], verdad? Es que ya he tenido bastantes problemas con las rutas al ser archivos incluidos...

Sobre el problema del principio, me sigue pareciendo extraño que el include de functions.php a db_connect no funcione para los archivos que incluyan functions.php

Una pregunta a parte, sabes que es mejor, si usar mysqli tal y como hago ahora? o usar mysql pdo??

Gracias!
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: paginas incluidas no funcionan correctamente
« Respuesta #3 en: 30 Septiembre 2014, 06:12 am »

No debería darte problemas, en cuanto al include o require:

Funcionan de la misma forma, la única diferencia es que el require produce un error y detiene la ejecución del script mientras que el include produce un warning si llegase a fallar. Por ejemplo, en tu caso, al incluir incorrectamente el archivo de base de datos no se cargan la conexion SQL y el programa continua ejecutandose a pesar de que tu script requiere la conexion. Si tu script hubiese usado require, al momento de no encontrar el archivo de base de datos, el script muere.

include_once y require_once sirve para evitar multiples inclusiones de un archivo (conservan las mismas diferencias que require e include).
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: paginas incluidas no funcionan correctamente
« Respuesta #4 en: 30 Septiembre 2014, 06:53 am »

Pero si no incluyo mal el archivo...

Si no incluyo ni en login ni en main.php db_connect y si en functions.php cambio de require_once a require db_connect, y solo un require_once a functions.php no funciona el db_connect o esque no le da la gana de incluirlo...

main.php
Código
  1. require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  2. //include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');

login.php
Código
  1. require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  2. //include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');

functions.php
Código
  1. require_once('/db_connect.php');
  2. // or
  3. require('/db_connect.php');
  4. // or
  5. include('/db_connect.php');
  6. // or
  7. include_once('/db_connect.php');

No funciona de ninguna de las maneras, pero debería de funcionar no???? Pues da el mensajito de siempre....

Citar
Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 8

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 151

Y en internet explorar solo da el primer error.

Edito: Necesito arreglar esto como sea, acaba de salir asi por que si un problema en otra pagina. Los mismos require que login.php, require_once y include para db_connect y ahora si no es error es no hacer una funcion bien....

Para que no se pueda acceder a una pagina sin loguear tengo un if. Bien, pues si no da el error, me pasa la funcion como si no fuera true....

Código
  1. if (login_check($mysqli) == true) {
  2.    //do something
  3. } else echo 'Por favor, inicia sesion.';

Y esto logueado... pero me lleva al echo, incluso si pongo:

Código
  1. else echo 'Por favor, inicia sesion.', $_SESSION['username'];

Me muestra el nombre de usuario con el que estoy logueado... y la función funciona bien, de hecho en la página login.php funciona...

En serio, voy a acabar loco...

Por cierto, estoy usando este script que encontre, aunque ya lo haya customizado y añadido muchas cosas, las funciones basicas como sec_session_start() no las he tocado y siguen igual: http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL Alomejor hay un problema y no lo he visto...

Gracias!
« Última modificación: 30 Septiembre 2014, 09:46 am por gAb1 » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: paginas incluidas no funcionan correctamente
« Respuesta #5 en: 30 Septiembre 2014, 17:01 pm »

Tu functions.php:

Código
  1. require_once('/db_connect.php');
  2. // or
  3. require('/db_connect.php');
  4. // or
  5. include('/db_connect.php');
  6. // or
  7. include_once('/db_connect.php');

Estas rutas pueden estar mal, recuerda que como lo tienes ahora está checando en el root de tu sistema de archivos por db_connect.php.
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: paginas incluidas no funcionan correctamente
« Respuesta #6 en: 30 Septiembre 2014, 19:57 pm »

Vale, si / lleva al root (htdocs) entonces estaba mal. Estan en /includes/db_connect.php y functions.php

Pero de igual manera, acaba de probar:

Código
  1.    require_once('db_connect.php');
  2.    // or
  3.    require('db_connect.php');
  4.    // or
  5.    include('db_connect.php');
  6.    // or
  7.    include_once('db_connect.php');

Y nada, ahora solo me sale el primer error, de variable definida. El otro de non-object se ha "ocultado"... seguro que despues trasteando nuevas cosas vuelve a salir a recordarme que ahí esta :)

Para problarlo he dejado presionado F5 un rato por si hay algun problema con la cache o esas cosas.

Por cierto, estoy trabajando en windows con xampp, por si funciona diferente que en linux.
« Última modificación: 30 Septiembre 2014, 20:22 pm por gAb1 » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: paginas incluidas no funcionan correctamente
« Respuesta #7 en: 30 Septiembre 2014, 20:36 pm »

Vale, si / lleva al root (htdocs) entonces estaba mal. Estan en /includes/db_connect.php y functions.php

Pero de igual manera, acaba de probar:

Código
  1.    require_once('db_connect.php');
  2.    // or
  3.    require('db_connect.php');
  4.    // or
  5.    include('db_connect.php');
  6.    // or
  7.    include_once('db_connect.php');

Y nada, ahora solo me sale el primer error, de variable definida. El otro de non-object se ha "ocultado"... seguro que despues trasteando nuevas cosas vuelve a salir a recordarme que ahí esta :)

Para problarlo he dejado presionado F5 un rato por si hay algun problema con la cache o esas cosas.

Por cierto, estoy trabajando en windows con xampp, por si funciona diferente que en linux.

No se si estás usando require, require_once, include o include_once. Por ahora quedate con require_once....

Si usas require_once y no puede cargar el archivo porque la ruta está mal entonces te debería devolver un error de PHP asociado a la carga de ese archivo. Si el archivo se carga correctamente, entonces bien puede ser un problema de visibilidad.

¿Como tienes tu db_connect.php?
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: paginas incluidas no funcionan correctamente
« Respuesta #8 en: 30 Septiembre 2014, 21:58 pm »

Me referia, desde un principio, que los habia usado todos pero de uno en uno en functions.php, pero al final he dejado require_once tal y como me has dicho.

Asi tengo db_connect.php
Código
  1. <?php
  2.  
  3. require_once('config.php');
  4.  
  5. $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
  6. ?>

Y al final sigue dando los dos errores si solo incluyo functions con require_once, en login.php. Si además agrego include db_connect.php dejan de salir los errores.

login.php
Código
  1. // asi da error
  2. require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  3. //include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
  4.  
  5. // asi no da error
  6. require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
  7. include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');

En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: paginas incluidas no funcionan correctamente
« Respuesta #9 en: 30 Septiembre 2014, 22:41 pm »

Porque no muestras tu jerarquia de archivos. Si tienes un require_once al db_connect.php y no resulta en un error de compilación entonces si se está incluyendo el archivo. ¿Estás seguro que estás guardando los archivos en sus lugares correspondientes? ¿No estás modificando un archivo que no es?

Cuando un require_once falla este es el error que sale:

Código:
Fatal error: require_once(): Failed opening required 'archivo'
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Crear un Xls con macros incluidas
Programación Visual Basic
yalosabes 8 4,984 Último mensaje 18 Marzo 2011, 10:36 am
por raul338
[Guía oficial] Crear Servidor Privado Rakion [Herramientas Incluidas]
Desarrollo Web
Weeken 0 7,840 Último mensaje 30 Mayo 2012, 06:44 am
por Weeken
No me funcionan correctamente las cadenas de formato « 1 2 »
Programación C/C++
lucaslopez0000 10 4,891 Último mensaje 29 Mayo 2013, 15:10 pm
por lucaslopez0000
Generar Jar con librerias incluidas
Java
BigBear 0 1,476 Último mensaje 26 Febrero 2014, 21:57 pm
por BigBear
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines