Prosiłeś o sugestie dotyczące kodu, a więc od początku czytam Twój kod i piszę post.
Pierwsze co mi się rzuciło w oczy po odpaleniu index.php:
define('is_included', true); //protection from direct display override
Sprawdziłem, w dołączanych plikach typu config.php sprawdzasz tą stałą.
Znacznie prościej i bez obciążeń dla parsera PHP jest blokować poprzez .htaccess
-------
Rzuciłem się na plik z językami, teoretycznie ok ale kodowanie tych plików?!
Cytat
ź zła, spróbuj
Wrzuć na wszystkie pliki kodowanie UTF-8 bez BOM i zapisz to normalnie.
-------
Nadszedł czas na config.php tutaj powinieneś użyć jak na moje oko wzorca o nazwie Registry i sobie w nim trzymać te informacje, będziesz miał dostępne globalnie i unikniesz w index.php czegoś takiego:
$quiz_name = $CONF['quiz_name'];
$main_page = $LANG['mainpageuppercase'];
$start_quiz = $LANG['startquiz'];
$start_content = $CONF['start_content'];
$welcome_text = $LANG['welcomequizpage'];
$link1 = $CONF['link1'];
$link1_name = $CONF['link1_name'];
$link2 = $CONF['link2'];
$link2_name = $CONF['link2_name'];
-------
Teraz quiz.php - na początku rzuca się w oczy, że
ob_start nie jest na początku skryptu, najpierw wysyłasz nagłówki o typie, kodowaniu, ciasteczka sesji a potem dopiero włączasz buforowanie - coś nie tak... Co ciekawe, wydaje mi się że włączyłeś je tylko z powodu include, bo zaraz po nim jest end_flush.
-------
W quiz.php używasz funkcji o nazwie: getnamefile()
Nie pasuje mi jej nazwa, bo o ile dobrze pamiętam przyjął się taki zapis: getNameFile()
Zapis dotyczy się wszystkich tak zapisanych nazw funkcji.
Poza tym, zwracasz coś takiego:
return "$PHP_SELF";
Nie wiem po co jest to ujęte w cudzysłów.
-------
checkanswer - nie prościej po prostu użyć
in_array?
-------
getmaxlevel - robisz tam coś takiego:
return("$LANG[db_query_error]");
error_log("$LANG[db_query_error]\r\n", 3, "log/db.log");
Po pierwsze, cudzysłów, po drugie używaj return tak jak wszędzie (bez nawiasów, bądź konsekwentny)
Nie wiem czy wiesz, error_log nie ma prawa się wykonać - funkcja już zwróciła wartość - co oznacza koniec jej wykonania, również późniejszy exit się nie wykona.
--------
backup bazy danych - pominę tą kwestię, od tego jest cron
--------
Po przewinięciu quiz.php dalej mogę uznać że masowo robisz:
// lub
return "$zmienna"
To jest niedopuszczalne i karygodne w dobrym kodzie.
--------
Używasz bb-code, szablonów dlatego nie zostawisz
mysql_ na rzecz
PDO?
--------
footer powinien być częścią szablonu - jak dla mnie jest niezmienny.