Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: gAb1 en 28 Septiembre 2014, 05:20 am



Título: paginas incluidas no funcionan correctamente
Publicado por: gAb1 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!


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour 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


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 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!


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour 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).


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 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!


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour 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.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 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.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour 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?


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 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');



Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour 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'


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 30 Septiembre 2014, 23:37 pm
Si te refieres a listar los archivos y con sus rustas completas, aqui va:

/ includes -> config.php
               -> db_connect.php
               -> functions.php

/ themes/default/views/layouts  -> main.php

/ views/site -> login.php

Si, los archivos estan en su sitio y los nombres estan bien.

Ese error me lo dio antes cuando cambie la ruta a './db_connect.php' pero era mas largo el mensaje o creo que era el segundo que mostraba, ya no me acuerdo.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 00:03 am
Agrega:

Código
  1. if(isset($mysqli)){
  2. var_dump($mysqli);
  3. }

Al final de db_connect.php, correlo y pega el output.

Mueve ese mismo código después a functions.php justo despues del require_once a db_connect.php, correlo y pega el output.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 01:01 am
el de db_connect.php:
Código
  1. object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(134) "Uptime: 22348 Threads: 1 Questions: 657 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.029" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(554) ["warning_count"]=> int(0) }

el de functions.php:
Código
  1. string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(555) ["warning_count"]=> int(0) } object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(134) "Uptime: 22459 Threads: 1 Questions: 660 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.029" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(555) ["warning_count"]=> int(0) }

Eso es con el include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php'); en login.php y en main.php junto con el require_once a functions.php


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 01:18 am
el de db_connect.php:
Código
  1. object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(134) "Uptime: 22348 Threads: 1 Questions: 657 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.029" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(554) ["warning_count"]=> int(0) }

el de functions.php:
Código
  1. string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(555) ["warning_count"]=> int(0) } object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(134) "Uptime: 22459 Threads: 1 Questions: 660 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.029" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(555) ["warning_count"]=> int(0) }

Eso es con el include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php'); en login.php y en main.php junto con el require_once a functions.php

No hagas el include desde login.php... el propósito es encontrar porque no funciona al importar solamente functions.php...


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 01:30 am
solo con el include en main.php

Código
  1. object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(135) "Uptime: 24111 Threads: 1 Questions: 1985 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.082" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(1057) ["warning_count"]=> int(0) } object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(135) "Uptime: 24111 Threads: 1 Questions: 1986 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.082" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(1057) ["warning_count"]=> int(0) } &#65279;object(mysqli)#2 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.6.20" ["server_version"]=> int(50620) ["stat"]=> string(135) "Uptime: 24111 Threads: 2 Questions: 1988 Slow queries: 0 Opens: 71 Flush tables: 1 Open tables: 64 Queries per second avg: 0.082" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(1058) ["warning_count"]=> int(0) }

Código
  1. Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:45) in C:\xampp\htdocs\includes\functions.php on line 28
  2.  
  3. Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
  4.  
  5. Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 6
  6.  
  7. Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 155

Sin el include en main.php solo aparecen los dos errores de siempre.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 01:47 am
Debe ser un problema de visibilidad por la función showContent()...

¿Porque no pones más código para ver todo? Siento que en un lugar estás encapsulando código y otras partes del script no ven las variables. Sobre todo por la manera tan extraña en la que estás llamando a una funcion que no ha sido declarada en ese archivo.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 02:02 am
Claro, las funciones las declaro en functions.php para no tenerlas en los archivos de contenido visual.

La función showContent() de index.php ya sabes cual es, haciendo un include() normal al archivo y mostrandolo dentro de main.php que es incluido dentro de index.php, pero eso ya lo sabes.

main.php es un archivo de estructura html5 con etiquetas <?php ?> para llamar funciones o scripts para el menu de navegación, etc. Por ejemplo, el primer error de antes en main.php:45

Esto es lo que hay:
Código
  1. <?php if (isset($_SESSION['username'])) {
  2.    // muestra opciones del menu
  3. } else {
  4.       // muestra otras opciones del menu
  5. }
  6. ?>

Y esto es lo que hay de las lineas de error de functions.php:28 y 29
Código
  1. function sec_session_start() {
  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  LINEA 28
  21.    session_regenerate_id();    // regenerated the session, delete the old one. 29
  22. }

Las dos ultimas lineas son las del error de antes.

Y la famosa función login_check del non-object error:
Código
  1. function login_check($mysqli) {
  2.    // Check if all session variables are set
  3.    if (isset($_SESSION['user_id'],
  4.                        $_SESSION['username'],
  5.                        $_SESSION['login_string'])) {
  6.  
  7.        $user_id = $_SESSION['user_id'];
  8.        $login_string = $_SESSION['login_string'];
  9.        $username = $_SESSION['username'];
  10.  
  11.        // Get the user-agent string of the user.
  12.        $user_browser = $_SERVER['HTTP_USER_AGENT'];
  13.  
  14.        if ($stmt = $mysqli->prepare("SELECT password  // ESTA ES LA LINEA 155
  15.                                      FROM members
  16.                                      WHERE id = ? LIMIT 1")) {
  17.            // Bind "$user_id" to parameter.
  18.            $stmt->bind_param('i', $user_id);
  19.            $stmt->execute();   // Execute the prepared query.
  20.            $stmt->store_result();
  21.  
  22.            if ($stmt->num_rows == 1) {
  23.                // If the user exists get variables from result.
  24.                $stmt->bind_result($password);
  25.                $stmt->fetch();
  26.                $login_check = hash('sha512', $password . $user_browser);
  27.  
  28.                if ($login_check == $login_string) {
  29.                    // Logged In!!!!
  30.                    return true;
  31.                } else {
  32.                    // Not logged in
  33.                    return false;
  34.                }
  35.            } else {
  36.                // Not logged in
  37.                return false;
  38.            }
  39.        } else {
  40.            // Not logged in
  41.            return false;
  42.        }
  43.    } else {
  44.        // Not logged in
  45.        return false;
  46.    }
  47. }

Aqui el prepare() es el que da ese error, que tambien lo uso en otras paginas y tambien da errores...

No sé donde puede estar el problema, conoces la estructura basica de como funciona todo y las funciones son de la web esa que puse antes.

Si necesitas ver algo en especifico dimelo.

Gracias!


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 02:08 am
La función showContent() de index.php ya sabes cual es, haciendo un include() normal al archivo y mostrandolo dentro de main.php que es incluido dentro de index.php, pero eso ya lo sabes.

Aquí no veo nada de showContent(), solo se que la declaras en index.php

Código
  1. //include a main.php
  2. //Notese que showContent(); se ejecuta en main.php antes que llegue a la declaracion de abajo.
  3.  
  4. function showContent() {
  5.  
  6. }

Fuera que dices que showContent hace un include, no se que tenga....


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 02:13 am
Si, en main.php dentro de un div y article (que es el cuerpo del contenido de la pagina incluida):

Código
  1. <?php
  2. include_once($_SERVER['DOCUMENT_ROOT'] . '/index.php');
  3. showContent();
  4. ?>

No se, tantos includes y no puede haber algun error o problema que encapsule parte del codigo y no lo interprete bien?


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 02:17 am
Aún no se que haga esa funcion de showContent()...

De hecho, toda tu lógica la tienes que revisar muy bien. Es horrible los laberintos inecesarios que estás haciendo. ¿Cual es el proposito de hacer un include al archivo que rutea?


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 02:23 am
funcion showContent() en index.php:
Código
  1. function showContent() {
  2. $includes = 'includes/';
  3. $views = 'views/';
  4. $site = $views . 'site/';
  5. $user = $views . 'user/';
  6.  
  7. $includes = array(
  8. '/home' => $views . 'home.php',
  9. '/error' => $views . 'error.php',
  10. '/login' => $site . 'login.php',
  11. '/logout' => $site . 'logout.php',
  12. '/contact' => $site . 'contact.php',
  13. '/about' => $site . 'about.php',
  14. '/register' => $site . 'register.php',
  15. '/register_success' => $site . 'register_success.php',
  16. '/profile' => $user . 'profile.php',
  17. '/update' => $user . 'update.php'
  18. );
  19.  
  20. if ($_SERVER['REQUEST_URI'] == '/')
  21. $_SERVER['REQUEST_URI'] = '/home';
  22.  
  23. preg_match('/^([\w\/]+)/', $_SERVER['REQUEST_URI'], $matches);
  24. $matches[1] = isset($matches[1]) ? $matches[1] : null;
  25.  
  26. if(array_key_exists($matches[1], $includes)) {
  27. $content = include($includes[$matches[1]]);
  28. } else $content = include('views/error.php');
  29. return $content;
  30. }

Si no incluyo el archivo donde se encuentra la función, ¿como voy a llamar una función que no existe? No se que tiene de laberintico eso :(

EDITO: Vale la funcion se crea despues de incluir main.php entonces no se necesario incluirla. Acabo de quitar el include y sigue funcionando :P Lo siento un despiste :(

He quitado el require_once functions de main y lo he puesto en index.php. El problema puede deberse por incluir/requerir un archivo dentro de otro que a su vez esta siendo incluido??? Aunque de igual modo, los archivos incluidos por la función hacen eso...

Ahora que lo pienso... si eso funciona asi, ¿por que es necesario hacer requires a functions.php en todas las paginas si ya se hace en index.php? Si los quito, da error... y no debería, no??


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 03:23 am
Era la cache del navegador, pasándole el ccleaner se arregla. Pero siguen habiendo errores:

A partir de aquí solo hay un require_once('includes/functions.php'); al principio de index.php y en ningún archivo más.

Recien pasado el ccleaner, sin iniciar sesión:
Código
  1. Warning: session_start(): Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28
  2.  
  3. Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28
  4.  
  5. Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
  6.  
  7. Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 5

Y se muestra el formulario y todo el codigo html.

Esto cuando inicias sesión, y no se muestra el resto del codigo html.
Código
  1. Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28
  2.  
  3. Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
  4.  
  5. Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 5
  6.  
  7. Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 155

La linea 76 de main.php es la etiqueta php que abro para llamar la funcion showContent()


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 03:32 am
No necesitas cargarlos en cada parte, puedes incluir functions.php desde el indice...

El problema esta en la visibilidad.

Código
  1. //archivo.php
  2. <?php
  3.  
  4. $test = 'archivo.php';
  5.  
  6. ?>

Código
  1. //index.php
  2. <?php
  3.  
  4. require_once 'archivo.php';
  5.  
  6. function hey(){
  7.  echo $test; //PHP Notice: Undefined Variable
  8. }

$test no existe en la funcion hey...

Ahora si le pones:

Código
  1. function hey(){
  2.  global $test;
  3.  echo $test;
  4. }

Si imprime archivo.php...

En lo personal, yo no encapsularia el ruteador en una función... No creo que vayas a necesitarlo en otra parte.

Y tu session_start() se suele poner al principio del script para evitar problemas como este, de headers already sent (al imprimir algo, ya se envian las cabeceras).


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 03:40 am
¿Te refieres a que lo haga sin función? Y que en main.php haga un echo a $content???

Si, llamo a sec_session_start(); en todas las paginas, ese puede ser el problema? Entonces tambien lo tengo que llamar en index.php no??


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: MinusFour en 1 Octubre 2014, 03:53 am
Parte del problema es porque se imprime HTML antes de usar session_start(); la otra parte es porque la funcion showContent() no tiene visiblidad sobre las variables traidas desde fuera de la funcion. Si el ruteador estuviera fuera de la funcion vería las variables importadas desde el main.php. El require_once no carga las variables de functions.php porque ya fueron importadas desde el main.php y no son importadas dentro de la función.


Título: Re: paginas incluidas no funcionan correctamente
Publicado por: gAb1 en 1 Octubre 2014, 04:04 am
Si, lo de sec_session_start(); ya esta arreglado, lo he puesto solo en index.php despues del require_once y han dejado de salir esos errores.

Vale, si quito la función, lo que pasa es que se ejecuta el return $content; y lo muestra al final del archivo y no donde deberia ir, entonces necesito alguna manera de que se incluya donde antes, en el div y realmente no se como hacer eso :(

Pero si, ya no hay ningún error :)

Se me olvido quitar del logout.php y del process_login el session start y he tenido algunos problemas, ya estan solucionados.

Pero en el process_login.php si quito el include_once functions me da error funcion login() no definida.

login.php lo llama en el form action="includes/process_login.php" entonces tiene que requerirlo, le he dejado require normal, ya que process_login no se incluye en ningún sitio.

Pero ese no es el problema, process_login necesita sec_session_start(); o no "inicia sesion"...

Código
  1. <?php
  2.  
  3. require('functions.php');
  4.  
  5. sec_session_start();       // sin esto no inicia sesión y no veo ningún error
  6.  
  7. if (isset($_POST['email'], $_POST['p'])) {
  8.    $email = $_POST['email'];
  9.    $password = $_POST['p']; // The hashed password.
  10.  
  11.    if (login($email, $password, $mysqli) == true) {
  12.        // Login success
  13. header('Location: /home');
  14.    } else {
  15.        // Login failed
  16.        header('Location: /login?error=1');
  17.    }
  18. } else {
  19.    // The correct POST variables were not sent to this page.
  20.    echo 'Invalid Request';
  21. }
  22. ?>

Entonces al cerrar sesión salen estos errores:

Código
  1. Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\themes\sportislife\views\layouts\main.php:74) in C:\xampp\htdocs\views\site\logout.php on line 15
  2.  
  3. Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\themes\sportislife\views\layouts\main.php:74) in C:\xampp\htdocs\views\site\logout.php on line 19

Dejo tambien el logout.php:
Código
  1. <?php
  2.  
  3. // Unset all session values
  4. $_SESSION = array();
  5.  
  6. // get session parameters
  7.  
  8. // Delete the actual cookie.
  9. '', time() - 42000,
  10. $params["path"],
  11. $params["domain"],
  12. $params["secure"],
  13. $params["httponly"]);
  14.  
  15. // Destroy session
  16. header('Location: /home');
  17. ?>

¿Como puedo solucionar este problema?  :huh:

Gracias!