Blokujący się skrypt

Wszystko o językach skryptowych takich jak PHP i Perl, serwerach WWW, CGI, bazach danych i języku SQL.
juna8001
Posty: 4
Rejestracja: 06 paź 2014, 18:12:09
Płeć: Niewybrana
User Agent: Chrome Windows

Blokujący się skrypt

Post autor: juna8001 »

Witam!
Robię stronę z prostym systemem logowania. Na serwerze lokalnym wszystko działało jak należy, lecz na cba skrypt nie działa.
W pliku zaloguj.php znajduje się formularz, który przesyła login i hasło do pliku login.php. Ten powinien sprawdzić poprawność danych i przekierować na stronę główną w przypadku sukcesu lub z powrotem do zaloguj.php w przypadku porażki. Niestety strona staje w miejscu w skrypcie login.php. Wyświetla się biała strona z reklamą cba.
Jest to ta strona (działają tylko przyciski w prawym górnym rogu):
thespace.c0.pl

Kod pliku login.php:

Kod: Zaznacz cały

<?php

session_start();

if((isset($POST['login']))||(isset($POST['haslo'])))
{
    header('Location: ../index.php');
    exit();
}

require_once "../connect.php";

$polaczenie=@new mysqli($host, $db_user, $db_password, $db_name);

if($polaczenie->connect_errno!=0)
{
    echo "Error: ".$polaczenie->connect_errno;
}
else
{
$login=$_POST['login'];
$haslo=$_POST['haslo'];

$login=htmlentities($login, ENT_QUOTES, "UTF-8");
$haslo=htmlentities($haslo, ENT_QUOTES, "UTF-8");

//$sql="SELECT * FROM uzytkownicy WHERE name='$login' AND pass='$haslo'";

    if($rezultat=@$polaczenie->query(
    sprintf("SELECT * FROM uzytkownicy WHERE name='%s' AND pass='%s'",
    mysqli_real_escape_string($polaczenie, $login),
    mysqli_real_escape_string($polaczenie, $haslo))))
    {
        $ile=$rezultat->num_rows;
            if($ile>0)
                {
                    $_SESSION['log']=true;
                    
                    $row=$rezultat->fetch_assoc();
                    $_SESSION['id']=$row['id'];
                    $_SESSION['user']=$row['name'];
                    $_SESSION['mail']=$row['mail'];
                    unset($_SESSION['blad']);
                    
                    $rezultat->close();
                    
                    header('Location: ../index.php');
                }
            else
                {
                    $_SESSION['blad']='<span style="color:red;">Nieprawidłowy login lub hasło!</span>';
                    header('Location: ../zaloguj.php');
                }
    }
    else
    {

    }

$polaczenie->close();
}

?>
rkd77
Admin CBA
Posty: 4170
Rejestracja: 24 maja 2009, 16:45:21
Płeć: Niewybrana
User Agent: Chrome Linux 1024x768

Re: Blokujący się skrypt

Post autor: rkd77 »

Dodaj error_reporting(E_ALL) na początku skryptu, wtedy wychwycisz błędy.
Ścieżki do plików zaczynające się od ../ wychodzą poza zasięg konta.
Raczej chodziło o jedną kropkę.
Czy wiesz, że:
  • W Panelu CBA w sekcji "wsparcie" jest dedykowany system ticketów (obsługi technicznej)
  • Odpowiadamy na Forum oraz na adres mailowy obsluga(malpa)cba.pl
  • Jesteśmy również na Facebooku! Znajdź nas na facebook.com/hostingcba | cba.pl
W czym jeszcze możemy pomóc?
juna8001
Posty: 4
Rejestracja: 06 paź 2014, 18:12:09
Płeć: Niewybrana
User Agent: Chrome Windows 1920x1080

Re: Blokujący się skrypt

Post autor: juna8001 »

Nie pokazują się żadne błędy. Zmieniłem ścieżki, ale wciąż nic się nie dzieje. Zupełnie, jakby nie działała funkcja header('Location:...');
rkd77
Admin CBA
Posty: 4170
Rejestracja: 24 maja 2009, 16:45:21
Płeć: Niewybrana
User Agent: Chrome Linux 1024x768

Re: Blokujący się skrypt

Post autor: rkd77 »

Z tymi ../ było jednak dobrze.
Na początku jest literówka $POST zamiast $_POST.
Czy wiesz, że:
  • W Panelu CBA w sekcji "wsparcie" jest dedykowany system ticketów (obsługi technicznej)
  • Odpowiadamy na Forum oraz na adres mailowy obsluga(malpa)cba.pl
  • Jesteśmy również na Facebooku! Znajdź nas na facebook.com/hostingcba | cba.pl
W czym jeszcze możemy pomóc?
juna8001
Posty: 4
Rejestracja: 06 paź 2014, 18:12:09
Płeć: Niewybrana
User Agent: Chrome Windows 1920x1080

Re: Blokujący się skrypt

Post autor: juna8001 »

Ta literówka z $POST sprawiała, że strona działała pomimo innego błędu w if'ie na początku. Poprawiłem oba, ale wciąż jest ten sam problem - nie działa przekierowanie do następnej podstrony. Mam wrażenie, że to wina reklamy (to chyba jedyna różnica między serwerem cba, a moim localhostem, na którym wszystko działa), ale pewien nie jestem. Czy jest może jakiś inny sposób przekierowania strony (poza header())?

---- EDIT ----

Mam podobną sytuację w pliku dokonującym rejestracji, ale w tym przypadku działa przekierowanie do formularza rejestracji w przypadku wpisania nieprawidłowych danych, lecz nie działa przekierowanie następujące po wywołaniu zapytania mysql.

Kod pliku register.php:

Kod: Zaznacz cały

<?php

session_start();

if((!isset($_POST['login']))||(!isset($_POST['haslo']))||(!isset($_POST['haslo2']))||(!isset($_POST['mail'])))
{
    header('Location: ../index.php');
    exit();
}

$login=$_POST['login'];
$haslo=$_POST['haslo'];
$haslo2=$_POST['haslo2'];
$mail=$_POST['mail'];


if (!((ereg('^[a-zA-Z0-9 ]+$', $login))&&(ereg('^[a-zA-Z0-9 ]+$', $haslo))&&(ereg('^[a-zA-Z0-9 ]+$', $haslo2))&&(ereg('^[a-zA-Z0-9@. ]+$', $mail)))) {
    
    $_SESSION['blad']='<span style="color:red;">Hasło, login i adres e-mail mogą zawierać tylko duże i małe litery (bez polskich znaków) oraz cyfry!<br/>(Adres e-mail może dodatkowo zawierać kropkę i "@".)</span>';
    header('Location: ../zarejestruj.php');
    exit();
    
    
} 


if($haslo!=$haslo2)
{
    $_SESSION['blad']='<span style="color:red;">Podane hasła nie są identyczne!</span>';
    header('Location: ../zarejestruj.php');
    exit();
}

require_once "../connect.php";

$polaczenie=@new mysqli($host, $db_user, $db_password, $db_name);

if($polaczenie->connect_errno!=0)
{
    echo "Error: ".$polaczenie->connect_errno;
}
else
{


$login=htmlentities($login, ENT_QUOTES, "UTF-8");
$haslo=htmlentities($haslo, ENT_QUOTES, "UTF-8");
$mail=htmlentities($mail, ENT_QUOTES, "UTF-8");

//$sql="SELECT * FROM uzytkownicy WHERE name='$login' AND pass='$haslo'";

    if($rezultat=@$polaczenie->query(
    sprintf("SELECT * FROM uzytkownicy WHERE name='%s' OR mail='%s'",
    mysqli_real_escape_string($polaczenie, $login),
    mysqli_real_escape_string($polaczenie, $mail))))
    {
        $ile=$rezultat->num_rows;
        if($ile==0)
                {
                     
                    @$polaczenie->query("INSERT INTO uzytkownicy(name, pass, mail) VALUES ('$login', '$haslo', '$mail')");
                    
                    $rezultat->close();
                    
                    
                    
                    $_SESSION['blad']='<span style="color:red;">Dokonano rejestracji. Zaloguj się.</span>';
                    header('Location: ../zaloguj.php');
                }
            else
                {
                    $_SESSION['blad']='<span style="color:red;">Użytkownik o takim loginie lub adresie e-mail już istnieje!</span>';
                    header('Location: ../zarejestruj.php');
                }
    }
    else
    {

    }

$polaczenie->close();
}

?>
rkd77
Admin CBA
Posty: 4170
Rejestracja: 24 maja 2009, 16:45:21
Płeć: Niewybrana
User Agent: Chrome Linux 1024x768

Re: Blokujący się skrypt

Post autor: rkd77 »

Pod mysqli_real_escape_string rozpoczyna się klamerka, pod koniec jest 'else' nie pasujące do niczego.
Po header wypadałoby zrobić exit, tak żeby się nic dodało do kodu strony.
Wciśnięcie F12 w Chrome pokazuje narzędzia, które pozwalają podejrzeć poszczególne zapytania.
Czy wiesz, że:
  • W Panelu CBA w sekcji "wsparcie" jest dedykowany system ticketów (obsługi technicznej)
  • Odpowiadamy na Forum oraz na adres mailowy obsluga(malpa)cba.pl
  • Jesteśmy również na Facebooku! Znajdź nas na facebook.com/hostingcba | cba.pl
W czym jeszcze możemy pomóc?
juna8001
Posty: 4
Rejestracja: 06 paź 2014, 18:12:09
Płeć: Niewybrana
User Agent: Chrome Windows 1680x1050

Re: Blokujący się skrypt

Post autor: juna8001 »

Po header nie ma exit, ponieważ chcę zamknąć połączenie z bazą danych przed przejściem na kolejną podstronę.
A ten else pod koniec jest do tego if'a, w którym warunkiem jest:
$rezultat=@$polaczenie->query(
sprintf("SELECT * FROM uzytkownicy WHERE name='%s' OR mail='%s'",
mysqli_real_escape_string($polaczenie, $login),
mysqli_real_escape_string($polaczenie, $mail)))

Jest co prawda niepotrzebny, ale jest pusty, więc nie powinien mieć wpływu na przekierowanie.
rkd77
Admin CBA
Posty: 4170
Rejestracja: 24 maja 2009, 16:45:21
Płeć: Niewybrana
User Agent: Chrome Linux 1024x768

Re: Blokujący się skrypt

Post autor: rkd77 »

Strona zwraca kod 200, więc $rezultat=@$polaczenie->query kończy się niepowodzeniem.
Jeśli odmałpujesz tę linijkę i dodasz error_reporting odpowiedni wcześniej znajdziesz błąd.
Czy wiesz, że:
  • W Panelu CBA w sekcji "wsparcie" jest dedykowany system ticketów (obsługi technicznej)
  • Odpowiadamy na Forum oraz na adres mailowy obsluga(malpa)cba.pl
  • Jesteśmy również na Facebooku! Znajdź nas na facebook.com/hostingcba | cba.pl
W czym jeszcze możemy pomóc?
ODPOWIEDZ