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)
include_once '/themes/default/views/layouts/main.php';
function showContent() {
[...]
}
/themes/default/views/layouts/main.php
include_once('/includes/functions.php'); //why this include doesn't work for login.php
// html and php code
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
<?php
include_once('/includes/functions.php');
sec_session_start();
if (login_check($mysqli) == true) {
$logged = 'in';
} else {
$logged = 'out';
}
?>
Este es el error que da:
CitarNotice: 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
include_once 'config.php';
$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:
CitarYou 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:
CitarFatal 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:
function sec_session_start() { // Esta es la linea 6 de functions.php
$session_name = 'sec_session_id'; // Set a custom session name
$secure = SECURE;
// This stops javascript being able to access the session id.
$httponly = true;
// Forces sessions to only use cookies.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: /error?err=Could not initiate a safe session (ini_set)");
exit();
}
// Gets current cookies params.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
// Sets the session name to the one set above.
session_name($session_name);
session_start(); // Start the PHP session
session_regenerate_id(); // regenerated the session, delete the old one.
} // Esta es la linea 26 de functions.php
¿Alguna idea de como arreglar esto? ¡Llevo horas intentando arreglarlo pero no consigo nada!
Gracias!
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:
./html/index.php
o
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
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
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.
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.
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
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
include('themes/sportislife/views/layouts/main.php');
function showContent() {
[...]
}
Para las funciones uso el require_once
main.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php'); // ya esta incluido en functions.php
// pero si no lo incluyo de esta manera me da error... y asi no da error
// html and php code
showContent(); //will include login.php
Lo mismo para los archivos de contenido html/php "views":
login.php
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
sec_session_start();
if (login_check($mysqli) == true) {
$logged = 'in';
} else {
$logged = 'out';
}
?>
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!
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).
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
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
//include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
login.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
//include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
functions.php
require_once('/db_connect.php');
// or
require('/db_connect.php');
// or
include('/db_connect.php');
// or
include_once('/db_connect.php');
No funciona de ninguna de las maneras, pero debería de funcionar no???? Pues da el mensajito de siempre....
CitarNotice: 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....
if (login_check($mysqli) == true) {
//do something
} else echo 'Por favor, inicia sesion.';
Y esto logueado... pero me lleva al echo, incluso si pongo:
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!
Tu functions.php:
require_once('/db_connect.php');
// or
require('/db_connect.php');
// or
include('/db_connect.php');
// or
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.
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:
require_once('db_connect.php');
// or
require('db_connect.php');
// or
include('db_connect.php');
// or
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.
Cita de: 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:
require_once('db_connect.php');
// or
require('db_connect.php');
// or
include('db_connect.php');
// or
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?
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
<?php
require_once('config.php');
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
?>
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
// asi da error
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
//include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
// asi no da error
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
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:
Fatal error: require_once(): Failed opening required 'archivo'
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.
Agrega:
if(isset($mysqli)){
var_dump($mysqli);
}
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.
el de db_connect.php:
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:
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
Cita de: gAb1 en 1 Octubre 2014, 01:01 AM
el de db_connect.php:
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:
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...
solo con el include en main.php
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) } 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) }
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
Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 6
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.
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.
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:
<?php if (isset($_SESSION['username'])) {
// muestra opciones del menu
} else {
// muestra otras opciones del menu
}
?>
Y esto es lo que hay de las lineas de error de functions.php:28 y 29
function sec_session_start() {
$session_name = 'sec_session_id'; // Set a custom session name
$secure = SECURE;
// This stops javascript being able to access the session id.
$httponly = true;
// Forces sessions to only use cookies.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: /error?err=Could not initiate a safe session (ini_set)");
exit();
}
// Gets current cookies params.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
// Sets the session name to the one set above.
session_name($session_name);
session_start(); // Start the PHP session LINEA 28
session_regenerate_id(); // regenerated the session, delete the old one. 29
}
Las dos ultimas lineas son las del error de antes.
Y la famosa función login_check del non-object error:
function login_check($mysqli) {
// Check if all session variables are set
if (isset($_SESSION['user_id'],
$_SESSION['username'],
$_SESSION['login_string'])) {
$user_id = $_SESSION['user_id'];
$login_string = $_SESSION['login_string'];
$username = $_SESSION['username'];
// Get the user-agent string of the user.
$user_browser = $_SERVER['HTTP_USER_AGENT'];
if ($stmt = $mysqli->prepare("SELECT password // ESTA ES LA LINEA 155
FROM members
WHERE id = ? LIMIT 1")) {
// Bind "$user_id" to parameter.
$stmt->bind_param('i', $user_id);
$stmt->execute(); // Execute the prepared query.
$stmt->store_result();
if ($stmt->num_rows == 1) {
// If the user exists get variables from result.
$stmt->bind_result($password);
$stmt->fetch();
$login_check = hash('sha512', $password . $user_browser);
if ($login_check == $login_string) {
// Logged In!!!!
return true;
} else {
// Not logged in
return false;
}
} else {
// Not logged in
return false;
}
} else {
// Not logged in
return false;
}
} else {
// Not logged in
return false;
}
}
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!
Cita de: gAb1 en 1 Octubre 2014, 02:02 AMLa 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
//include a main.php
//Notese que showContent(); se ejecuta en main.php antes que llegue a la declaracion de abajo.
function showContent() {
}
Fuera que dices que showContent hace un include, no se que tenga....
Si, en main.php dentro de un div y article (que es el cuerpo del contenido de la pagina incluida):
<?php
include_once($_SERVER['DOCUMENT_ROOT'] . '/index.php');
showContent();
?>
No se, tantos includes y no puede haber algun error o problema que encapsule parte del codigo y no lo interprete bien?
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?
funcion showContent() en index.php:
function showContent() {
$includes = 'includes/';
$views = 'views/';
$site = $views . 'site/';
$user = $views . 'user/';
$includes = array(
'/home' => $views . 'home.php',
'/error' => $views . 'error.php',
'/login' => $site . 'login.php',
'/logout' => $site . 'logout.php',
'/contact' => $site . 'contact.php',
'/about' => $site . 'about.php',
'/register' => $site . 'register.php',
'/register_success' => $site . 'register_success.php',
'/profile' => $user . 'profile.php',
'/update' => $user . 'update.php'
);
if ($_SERVER['REQUEST_URI'] == '/')
$_SERVER['REQUEST_URI'] = '/home';
preg_match('/^([\w\/]+)/', $_SERVER['REQUEST_URI'], $matches);
$matches[1] = isset($matches[1]) ? $matches[1] : null;
if(array_key_exists($matches[1], $includes)) {
$content = include($includes[$matches[1]]);
} else $content = include('views/error.php');
return $content;
}
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??
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:
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
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
Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
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.
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
Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29
Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 5
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()
No necesitas cargarlos en cada parte, puedes incluir functions.php desde el indice...
El problema esta en la visibilidad.
//archivo.php
<?php
$test = 'archivo.php';
?>
//index.php
<?php
require_once 'archivo.php';
function hey(){
echo $test; //PHP Notice: Undefined Variable
}
$test no existe en la funcion hey...
Ahora si le pones:
function hey(){
global $test;
echo $test;
}
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).
¿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??
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.
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"...
<?php
require('functions.php');
sec_session_start(); // sin esto no inicia sesión y no veo ningún error
if (isset($_POST['email'], $_POST['p'])) {
$email = $_POST['email'];
$password = $_POST['p']; // The hashed password.
if (login($email, $password, $mysqli) == true) {
// Login success
header('Location: /home');
} else {
// Login failed
header('Location: /login?error=1');
}
} else {
// The correct POST variables were not sent to this page.
echo 'Invalid Request';
}
?>
Entonces al cerrar sesión salen estos errores:
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
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:
<?php
// Unset all session values
$_SESSION = array();
// get session parameters
$params = session_get_cookie_params();
// Delete the actual cookie.
setcookie(session_name(),
'', time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]);
// Destroy session
session_destroy();
header('Location: /home');
?>
¿Como puedo solucionar este problema? :huh:
Gracias!