KatarzynaB
21.08.2009, 07:53:36
Witam,
mam problem z logowaniem do mojego serwisu, które to nagle z niewiadomych przyczyn przestało działać.
Skrypt logowania jest standardowy, mniej więcej taki jak opisywany tu:
http://www.egrafik.pl/phpmysql-prosty-syst...owania,880.htmlPo wpisaniu loginu i hasła nic się nie dzieje, nie przekierowuje mnie na stronę docelową. W bazie widzę także, że logowanie udało się (odpowiednie pole zmienia się z 0 na 1) niemniej jednak nie przekierowuje na stronę docelową.
Serwis stoi na hostingu nazwa.pl. Podejrzewam, że dokonano jakichś zmian na serwerze i w ich wyniku mam problem j.w. Niestety admini nazwa.pl zaprzeczają by coś się zmieniło. Gdy zgłosiłam im problem sugerowali by dodać do .htaccess linię php_flag register_globals 1. Dodałam, nie pomogło.
Logowanie działało zawsze bezproblemowo. Problem występuje od kilku dni. Żadne pliki nie były modyfikowane, nie było żadnej ingerencji z mojej strony.
Prośba o sugestie - co należy zmienić/zmodyfikować by przywrócić możliwość logowania ?
Pozdrawiam,
Kasia
Wicepsik
21.08.2009, 08:10:37
Pokaż kod.
KatarzynaB
21.08.2009, 08:44:36
Skrypt wygląda tak:
<?php
session_start();
require_once("mysql.php");
if($_GET['akcja']=="loguj")
{
$login=$_POST['login'];
$haslo=$_POST['passwd'];
$query="SELECT *,PASSWORD('$haslo') AS haslo FROM admins WHERE login='$login' LIMIT 1";
if($result=$GLOBALS['mysql']->query($query))
{
$row=$result->fetch_assoc();
//echo $row['passwd']." ".$row['haslo'];
if($result->num_rows>0&&$row['haslo']===$row['passwd'])
{
$result->free();
$_SESSION['l']=$login;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key_hex = '8764782h3826732hei2h7832y763';
$key_bin = pack('H*', $key_hex);
$_SESSION['p'] = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key_bin, $haslo, MCRYPT_MODE_ECB, $iv);
$REMOTE_ADDR=getenv("REMOTE_ADDR");
$query="update admins set czas=UNIX_TIMESTAMP(),logged=1,ip='{$REMOTE_ADDR}' where login='{$row['login']}' LIMIT 1;";
$GLOBALS['mysql']->multi_query($query);
header("Location: panel.php");
$komunikat="<a href=\"panel.php\">dalej</a>";
}
else
{
session_destroy();
$komunikat="<div class=login_error>Nieprawidłowy login lub hasło</div>";
}
}
else
{
}
}
else if($_GET['akcja']=="logout")
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key_hex = '8764782h3826732hei2h7832y763';
$key_bin = pack('H*', $key_hex);
$pas = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key_bin, $_SESSION['p'], MCRYPT_MODE_ECB, $iv);
$query="select *,PASSWORD('{$pas}') as haslo from admins where login='{$_SESSION['l']}' LIMIT 1";
$result=$GLOBALS['mysql']->query($query);
if($result)
{
$row=$result->fetch_assoc();
if($row['passwd']==$row['haslo'])
{
$query="update admins set czas=0,logged=0,ip='0.0.0.0' where login='{$row['login']}'";
$mysql->query($query);
}
session_destroy();
$komunikat="<div class=login_logout>Zostałeś wylogowany z panelu</div>";
$result->free();
}
}
$string = file_get_contents("grafika/index.html");
$string=str_replace("%komunikat",$komunikat,$string);
echo $string;
?>
Kasia
krowal
21.08.2009, 11:43:39
Daj sobie przed tym wszystkim 'error_reporting(E_ALL);' i zobacz czy nie ma jakiegoś błędu. Bo biała strona może właśnie to oznaczać
KatarzynaB
22.08.2009, 12:35:29
Po wpisaniu powyższej komendy mam komunikaty jak niżej:
Notice: Undefined index: akcja in /[...]/panel/index.php on line 9
Notice: Undefined index: akcja in /[...]/panel/index.php on line 54
Notice: Undefined variable: komunikat in /[...]/panel/index.php on line 79
Ekspertem w php nie jestem lecz chyba wygląda na to iż są to jakieś zmienne lokalne. Administratorzy serwera pytali czy deklaracje zmiennych są globalne, niestety odpowiedzi nie umiałam udzielić. Prawdopodobnie na serwerze zaszła jakaś zmiana, że trzeba używać zmiennych globalnych.
Prośba o pomoc - jak to przywrócić do normalnego działania ?
Pozdrawiam,
Kasia
erix
22.08.2009, 12:47:44
Cytat
Ekspertem w php nie jestem lecz chyba wygląda na to iż są to jakieś zmienne lokalne.
Nie, sęk w tym, że zmienne sprawdzasz, kiedy ich nie ma - wywołujesz skrypt bez parametru
akcja w URL; dodaj sprawdzanie, czy pusty.
KatarzynaB
22.08.2009, 13:09:18
Zmienne są sprawdzane po naciśnięciu przycisku loguj.
I po jego naciśnięciu nie przechodzę na stronę docelową a ponownie wyświetla się strona logowania i komunikat błędu:
Warning: Cannot modify header information - headers already sent by (output started at /[...]/panel/index.php:5) in /[...]/panel/index.php on line 39
Pozdrawiam,
Kasia
erix
22.08.2009, 13:40:47
Cytat
Warning: Cannot modify header information - headers already sent by (output started at /[...]/panel/index.php:5) in /[...]/panel/index.php on line 39
Było setki razy, poszukaj!
KatarzynaB
22.08.2009, 15:10:37
Zastosowałam się do rad, które znalazłam.
Czyli ob_start();, ob_flush(); plik zapisywany jako UTF-8 NO BOM.
Nic nie ma przed początkowym <?php.
Problem jest nadal i jest taki sam.
Chętnie bym poprosiła o pomoc za opłatą. Jestem w php zbyt wielkim laikiem żeby sobie z tym poradzić.
Czy może tu na forum znajdę osobę, która poprawi skrypt ? Twórca niestety jest nieosiągalny.
Działało kilka miesięcy, nagle przestało działać.

Pozdrawiam,
Kasia
krowal
22.08.2009, 15:20:32
W formularzu logowania dodaj parametr '...&action=login...' powinno to mniej więcej wyglądać tak:
<form action="to_co_juz_jest&action=login" method="post"> ...
Jak to zrobisz to powinno być ok, przynajmniej te błędy które Ci się teraz wyświetlają powinny zniknąć, nie twierdze jednak, że nie pojawią się nowe
KatarzynaB
22.08.2009, 15:30:47
Mam tak:
<form name="login_form" method="post" action="index.php?akcja=loguj">
Czyli prawie OK.
Gdy zmienię index.php?akcja=loguj na index.php&akcja=loguj zgodnie z powyższym to pojawia się informacja, że nie ma takiej strony na serwerze..
Pozdrawiam,
Kasia
krowal
22.08.2009, 15:43:11
No tak bo jeśli jest to pierwszy parametr na liście to powinno być '?akcja=loguj' każdy kolejny zaczyna się od & czyli '?akcja=loguj&zmienna2=costam&zmienna3=costam'. No to teoretycznie masz dobrze
KatarzynaB
22.08.2009, 17:16:03
Zauważyłam, że gdy ob_start(); umieszczę przed session start to komunikat Cannot add/modify header information - headers already sent by... sie nie pojawia. Pojawia się wtedy:
Notice: A session had already been started - ignoring session_start() in /home/dodziak/ftp/sportinfo24h.pl/panel/index.php on line 6
Notice: Undefined index: akcja in /[...]/panel/index.php on line 12
Notice: Undefined index: akcja in /[...]/panel/index.php on line 56
Notice: Undefined variable: komunikat in /[...]/panel/index.php on line 81
co w moim rozumieniu oznacza, że nie przekazano parametrów do skryptu. Gdy ob_start(); umieszczę po session start to mam komunikat Cannot add/modify header information - headers already sent by...
Nic więcej w tym temacie nie znalazłam na forum.
Co jeszcze można zmienić/sprawdzić ?
Pozdrawiam,
Kasia
Shlizer
22.08.2009, 18:25:39
Cytat(KatarzynaB @ 22.08.2009, 18:16:03 )

co w moim rozumieniu oznacza, że nie przekazano parametrów do skryptu. Gdy ob_start(); umieszczę po session start to mam komunikat Cannot add/modify header information - headers already sent by...
Nie do końca to tak wygląda..
Wysyłasz headery do przeglądarki już poleceniem session_start() o ile się nie mylę, a potem chcesz je wysłać ponownie poleceniem header("Location:xxx");
Ta druga funkcja zaczyna ładować inną stronę (i tą opuszcza), więc albo usuń tą linię i każ użytkownikowi samemu się tam przenieść za pomocą linka, albo zaincluduj =p stronę panel.php (o ile konstrukcja strony na to pozwala).
Swoją drogą linia "$komunikat="<a href=\"panel.php\">dalej</a>; " już się nie wykona =p
To tak ode mnie..
i jeszcze jedno - paskudne formatowanie kodu =p
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.