paginas incluidas no funcionan correctamente

Iniciado por gAb1, 28 Septiembre 2014, 05:20 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

#20
funcion showContent() en index.php:
Código (php) [Seleccionar]
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??

gAb1

#21
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 (php) [Seleccionar]
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.
Código (php) [Seleccionar]
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()

MinusFour

#22
No necesitas cargarlos en cada parte, puedes incluir functions.php desde el indice...

El problema esta en la visibilidad.

Código (php) [Seleccionar]

//archivo.php
<?php

$test 
'archivo.php';

?>


Código (php) [Seleccionar]

//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:

Código (php) [Seleccionar]

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).

gAb1

#23
¿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??

MinusFour

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.

gAb1

#25
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 (php) [Seleccionar]
<?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:

Código (php) [Seleccionar]
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:
Código (php) [Seleccionar]
<?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!