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:
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
Para las funciones uso el require_once
main.php
Lo mismo para los archivos de contenido html/php "views":
login.php
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!

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:
Citarwhen 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
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.
- require_once
when the file is not required and application flow should continue when not found, e.g.
- include
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
- include_once
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 (php) [Seleccionar]
include('themes/sportislife/views/layouts/main.php');
function showContent() {
[...]
}
Para las funciones uso el require_once
main.php
Código (php) [Seleccionar]
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
Código (php) [Seleccionar]
<?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!