Początki w PHP OOP - błąd logowania

0

Witam,

Próbuję przerobić skrypt logowania z struktury na obiekty i rozwiązuję ciągle problemy. Z tym nie mogę sobie poradzić... Przeglądarka wyświetla:
Fatal error: Using $this when not in object context in C:\xampp\htdocs\try\CLASS\config.class.php on line 13
Oto kod:

config.class.php:

<?php

class config
{
	private $pdo;

 static public function connect()
 {
	 ob_start();

		try
		{
			$this->pdo = new PDO('mysql:host=localhost; dbname=baza', 'root', '');
			return true;
		}
		catch(PDOException $e)
		{
			echo 'Wystąpił problem z połączeniem z bazą danych' .$e->getMessage();
		}
 }
 
 static public function disconnect()
 {
	 ob_end_flush();
 }
 
 
 static public function clear($text)
 {
    // jeśli serwer automatycznie dodaje slashe to je usuwamy
    if(get_magic_quotes_gpc())
	{
        $text = stripslashes($text);
    }
    $text = trim($text); 
    $text = mysql_real_escape_string($text); 
    $text = htmlspecialchars($text);
    return $text;
    
  }
  
 static public function codepass($password)
 {
	return sha1(md5($password).'#!%Rgd64');
 }
}

?>
 

phpLoader.class.php:

<?php

class phpLoader
{
	// funkcja: logowanie
	static public function login()
	{		
		require_once 'config.class.php';
		config::connect();
		if(empty($_SESSION['logged'])) 
		{
		if(isset($_POST['name'])) 
		{
        $_POST['name'] = config::clear($_POST['name']);
        $_POST['password'] = config::clear($_POST['password']);		
        // i kodujemy hasԯ
        $_POST['password'] = config::codepass($_POST['password']); 
        // sprawdzamy prostym zapytaniem sql czy podane dane s٠prawidԯwe
        $query = $pdo->query("SELECT `user_id` FROM `users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");
		try
		{
			$query->execute();
			if($query->rowCount() > 0)
			{
				$dane = $query->fetch(PDO::FETCH_ASSOC);
				if($dane['user_pasword'] === $_POST['password'])
				{
					$_SESSION['logged'] = true;
					$_SESSION['user_id'] = $row['user_id']; 
				}
				else
				{
					echo "Złe hasło";
				}
							
			}
				else
				{
					echo "Zły użytkownik";
				}
		}
	catch(PDOException $e)
	{
		$e->getMessage();
	}
		}
		}
		config::disconnect();
	}
}
?>
 

login.php:

<?php

require_once 'CLASS/config.class.php';
require_ONCE 'CLASS/ModuleLoader.class.php';
require_once 'CLASS/phpLoader.class.php';

ModuleLoader::setDoctype();
phpLoader::login();
ModuleLoader::setLogo();
ModuleLoader::setTopbar();
ModuleLoader::setSidebar();
ModuleLoader::setContent();
ModuleLoader::setFooter();

?>
 

Po skryptach pewnie widać, że dopiero zaczynam w obiektowym PHP. Czy moglibyście mi powiedzieć co robię źle, jakich nawyków nabierać i dlaczego to nie działa??

0

Bo używasz static methods i stąd masz ten komunikat.

Co do hashowania haseł, można by też inaczej:

   $str = 'foo boo';
   $key = 'gSxx8rX4tnbK8Ne';
   $hash = hash_hmac('sha256', $str, $key);    

A nie SHA1 które zresztą z tego co Wiki podaje już nawet nie jest zalecane.

https://pl.wikipedia.org/wiki/SHA-1
http://php.net/manual/en/function.hash-hmac.php

0

PDO i mysql_real_escape_string, serio ?
Klasa config odpowiada za uzyskiwanie połączenia z bazą, "czyszczenie" danych i hashowanie haseł ? Coś tu nie gra (na temat hashowania: http://php.net/manual/en/faq.passwords.php)
Zacznij pisać z użyciem obiektów.

0

Dobrze, rozumiem że kodowanie tutaj leży ale chciałbym na początek ustanowić w ogóle połączenie z bazą. Po prostu chciałbym, żeby w phpLoader.class.php dało się odczytać klasę config z config.class.php i wyciągnąć zmienną $pdo.

Zacznij pisać z użyciem obiektów.

Właśnie próbuję, trochę mnie to przerasta, dlatego chciałem zapytać co jest nie tak, co zmienić, czego używać....

0

Coś się ruszyło. Otrzymuję teraz tylko komunikat: Fatal error: Call to a member function prepare() on string in C:\xampp\htdocs\try\CLASS\phpLoader.class.php on line 20. Rozumiem, że zapytanie jest już widoczne dla phpLoader.class.php, tylko jak teraz wykonać zapytanie?

config.class.php:

 
<?php

class config
{
static public $pdo;

 static public function connect()
 {
	 ob_start();

		try
		{
			$pdo = new PDO('mysql:host=localhost; dbname=baza', 'root', '');
			self::$pdo;
			return true;
			return $pdo;
			echo "Połączono";
		}
		catch(PDOException $e)
		{
			echo 'Wystąpił problem z połączeniem z bazą danych '.$e->getMessage();
		}
 }
 
 static public function disconnect()
 {
	 ob_end_flush();
 }
}
 config::$pdo = "('mysql:host=localhost; dbname=baza', 'root', '')";
 echo "Wynik działania to: ".config::$pdo." ";

phpLoader.class.php:

<?php

class phpLoader extends config
{
	// funkcja: logowanie
	static public function login()
	{		
		require_once 'config.class.php';
		config::connect();
		if(empty($_SESSION['logged'])) 
		{
		if(isset($_POST['name'])) 
		{
        $_POST['name'] = config::clear($_POST['name']);
        $_POST['password'] = config::clear($_POST['password']);		
        // i kodujemy hasԯ
        $_POST['password'] = config::codepass($_POST['password']); 

        $query = config::$pdo->prepare("SELECT `user_id` FROM `users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");
		try
		{
			$query->execute();
			if($query->rowCount() > 0)
			{
				$dane = $query->fetch(PDO::FETCH_ASSOC);
				if($dane['user_pasword'] === $_POST['password'])
				{
					$_SESSION['logged'] = true;
					$_SESSION['user_id'] = $row['user_id']; 
				}
				else
				{
					echo "Złe hasło";
				}
							
			}
				else
				{
					echo "Zły użytkownik";
				}
		}
	catch(PDOException $e)
	{
		$e->getMessage();
	}
		}
		}
		config::disconnect();
	}
 

Co tym razem jest dobrze a co nie?

0

To się kupy nie trzyma ani trochę. Po co do diabła te static methods?

0

Przeczytaj jakiś tutek o OOP, np. http://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762
i wtedy zacznij pisać.

$pdo->prepare("SELECT `user_id` FROM `users` WHERE `user_name` = '{$_POST['name']}' AND `user_password` = '{$_POST['password']}' LIMIT 1");

Pakujesz się w tym momencie w SQL Injection. Zapoznaj się z: http://php.net/manual/en/pdostatement.bindvalue.php

1 użytkowników online, w tym zalogowanych: 0, gości: 1