Jump to content

Recommended Posts

Posted (edited)

Tava a tentar criar uma classe de autenticação php/mysqli com este tutorial

http://www.dreamincode.net/forums/topic/247188-user-authentication-class/

Soque nesse tutorial ele não está a implementar a base de dados, e eu agora tou a ter um problema que é o seguinte:

Eu tenho a variavel de criação da ligação a db por mysqli no ficheiro db.php, da seguinte forma:

$db = new mysqli($db_server, $db_user, $db_pass, $db_name);

e por exemplo para fazer uma query num outro documento, usaria-se assim:

require_once('db.php');
(...)
$db->query("Select ...");

ate aqui tudo bem, a ligação está funcional e isso. O que me está a criar confusão é, como é que eu na class chamo a variavel $db ?

é que eu tou a chamar como se fizese noutro ficheiro, mas dame este erro:

Notice: Undefined variable: db in C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php on line 78

Fatal error: Call to a member function query() on a non-object in C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php on line 78

Os ficheiros são estes:

auth.class.php

http://pastebin.com/KDiPUBdk

db.php

http://pastebin.com/kRK7qn1a

config.php

http://pastebin.com/cV4bnFXC

PS: tentei testar desta forma o login, mas ele apresenta-me logo aquele erro de cima (este codigo tem só por efeitos de depuração):

require_once 'includes/auth.class.php';

session_start();

$auth = new Auth();

if ($auth->login("simplesmente_moi@hotmail.com","1234567") == 0){
echo("login certo");

} else {
echo("login errado");
}

agradeço a quem me puder ajudar com urgencia (;

Edited by brunoais
geshi

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

A variável $db n está definida nesse método. Tão simples como isso.

O php tem scopes independentes. Pesquisa no manual do php por: "global"

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

uma maneira mais simples:

class Auth {
 private $_siteKey;
 private $_db;

 public function __construct($db)
 {
   $this->siteKey = 't$Q!U*TDff)ybnh@$ytTiz_2gx@U-JnVT8ND@T4aMYGWcHfBLDlT$X$!S8G*vHXW';
   $_db = $db; // agora podes aceder ao recurso de ligação através de "$this->_db";
 }
...
}

$auth = new Auth($db);
IRC : sim, é algo que ainda existe >> #p@p
Posted

Obrigado a todos, mas optei por usar a solução do happyhippihippo

Ele ja reconhece a variavel, mas como é que eu faço agora para executar uma query? :s

se eu fizer tipo isto: $this->_dv->query dá este erro:

Fatal error: Call to a member function query() on a non-object in C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php on line 82

Solução?

(ps: brunoais, eu ja tinha definido como global, em N sitios e continuava com o mesmo problema, talves não estivesse a fazer correctamente, idk)

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

Obrigado a todos, mas optei por usar a solução do happyhippihippo

Ele ja reconhece a variavel, mas como é que eu faço agora para executar uma query? :s

se eu fizer tipo isto: $this->_dv->query dá este erro:

presumi que será $this->_db ou será $_dv que terás definido na classe

agora o problema do erro pode ser verificado em dois passos:

- estás a inicializar a ligação da base de dados antes da chamada new Auth() ?

- altera o argumento do construtor para ser uma referência

class Auth {
 private $_siteKey;
 private $_db;

 public function __construct(&$db)
 {
   $this->siteKey = 't$Q!U*TDff)ybnh@$ytTiz_2gx@U-JnVT8ND@T4aMYGWcHfBLDlT$X$!S8G*vHXW';
   $_db = $db; // agora podes aceder ao recurso de ligação através de "$this->_db";
 }
...
}

$db = new mysqli($db_server, $db_user, $db_pass, $db_name);
$auth = new Auth($db);
IRC : sim, é algo que ainda existe >> #p@p
Posted

sim enganeime a escrever hippo, tinha de facto $_db

estou a iniciar a ligação antes de fazer a chamada da classe sim (fazendo o require do ficheiro db.php, que tem a ligaçao, pois como vez ele ja nao da erros de variavel.)

Ele diz é que estou a tentar aceder a um metodo, numa variavel que não é objecto, ou seja, ela assim perde essa propriedade :s

será que tenho de criar a ligaçao dentro da class, tipo isto

//connect to database
function dbconnect(){
	$connections = mysql_connect($this->hostname_logon, $this->username_logon, $this->password_logon) or die ('Unabale to connect to the database');
	mysql_select_db($this->database_logon) or die ('Unable to select database!');
	return;
}

sei que da para usar o mysqli de forma nao orientada a objectos, mas eu queria continuar a usar assim, O.O. :s

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

nao tinha feito pois nao estava com fé que posso esse o problema, mas por descargo de consciecia fiz e realmente o problema não é dai.

tipo, eu nao sei é como aceder agora a variavel para fazer querys entendes?

eu fiz isto $this->_db->query mas da erro e eu sei que ta errado :s

Como é que faço para aceder a ela?

é que nao podes esquecer que nao é uma variavel de valores, se fosse, como disseste ja estaria a funcionar, mas isto é uma variavel objecto com metodos e mais sei la o que (nao te tou a ensinar, deves saber bem mais que eu, so acho que nao estou a conseguir elucidar bem o meu problema :/ )

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted (edited)

eu testei o código e funcionou na perfeição .. somente uma azelhiçe :

 public function __construct(&$db)
 {
   $this->siteKey = 't$Q!U*TDff)ybnh@$ytTiz_2gx@U-JnVT8ND@T4aMYGWcHfBLDlT$X$!S8G*vHXW';
   $this->_db = $db; // <-----
 }
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

es um genio hippo 😄

Obrigado 👍

Realmente assim ja funciona, so me fica uma duvida, é correcto fazer isso? 😕

$this->_db->query

Eu ando a fazer isto tudo para criar a minha propria extrutura de sites, assim quando tiver algo para fazer ja tenho mais codigo feito, é so implementar... e queria deixar tudo bem segundo a regras da boa programação...

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

Sim sei que é a forma, mas dado que é "multi nivel" pensei que fosse correcto, ou seja

eu sei que isto $auth->login() é correcto, so tava com medo que por ser assim $this->_db->query() não o fosse

Obrigado entao por toda a tua ajuda, e pelos os outros que assim tambem me responderam

Vou dar o topico por resolvido 😉

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted (edited)

Afinal ainda nao posso dar por resolvido xD

tava a testar a criação de users, mas tame a dar um erro mesmo estupido, pois eu ja tinha criado uma vez um utilizador e deu tudo bem -.-

o codigo de criação ´e este

public function createUser($email, $password, $is_admin = 0)
{
   //Generate users salt
   $user_salt = $this->randomString();

   //Salt and Hash the password
   $pw = $user_salt . $password;
   $pw = $this->hashData($pw);

   //Create verification code
   $code = $this->randomString();

   //Commit values to database here.
   $created = $this->_db->query("INSERT INTO `users` (`email`,`password`,`user_salt`,`verification_code`) VALUES ($email,$pw,$user_salt,$code)");

   if($created != false){
  	 //sendVerification($email,$pw,$code);
       return true;
   }

   return false;
}

e tou a chama-lo assim:

$auth = new Auth($db);
$auth->createUser("admin@admin.com", "12345", 0);

e da-me este erro

[b]Notice[/b]: Uninitialized string offset: 50 in [b]C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php[/b] on line [b]21[/b]

[b]Notice[/b]: Uninitialized string offset: 50 in [b]C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php[/b] on line [b]21[/b]

private function randomString($length = 50)
{
$characters = '4b6kF790X2DY@@VJW)Ao)E1mfCyd8lWaYAex5E7D&,."341dTS';
$string = '';

for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters))];
}

 return $string;
}

Por vezes sao mais linhas com o mesmo erro... tipo a variavel string ta iniciada o_o

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted (edited)

a string está, mas só tem 50 caracteres, isto é, de [0 .. 49]

tu estás a pedir um número aleatório de 0 a strlen($characters) que é na realidade de [0 .. 50]

o 50 fica fora do tamanho da string logo dá o notice

o que terias de fazer é

$string .= $characters[mt_rand(0, strlen($characters) - 1)];
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

omg, desculpa ser tao chato xD

Epah, agora a password salted e hashed que vai pra db, e aquela que é recriada no acto da validaçao (ou seja, pegar no input de login, e meter a pass salted e hashed) não estao a corresponder, ate ja testei com uns echos, e dame isto:

[u]Esta é a pass da DB:[/u]
9c9f89157ed8f7025e86cc7958901a0020183f78e546999397f41498b4b6b6ff33e40ec4033b6c14d8cff3fed352c642b94bfa95438dc287ae452bae9137df78
[u]Está é a que é criada quando se tenta fazer login... Os passos sao os mesmos e mesmo assim diferem :S[/u]
5256e1ea2e164c57716bcaafbf9d3bd60c1ff438f26d2c8a441121e862f9b75f8bc101acbb39b99ec20933ec8bb1929a89506a6b99394fdbb73360d6abc6103a

EDIT: JA TA RESOLVIDO, ERA UNS ERROS NA FECTH DA ARRAY xD

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

okok, eu sei que sou chato e tal, mas penso que deve ser a ultima coisa, preciso que me ajudes a corrigir a classe, pois efectivamente ha aqui algo, e deve ser uma coisa melhor, que nao está a funcionar bem (nao ligues a quantidade de comments, eu sou mesmo assim, ate lançar a versao final do codigo)

auth.class.php

<?php
require_once('config.php');
require_once('db.php');
//$db = new mysqli($db_server, $db_user, $db_pass, $db_name);
class Auth {
private $_siteKey;
private $_db;

public function __construct(&$db)
  {
	$this->siteKey = 't$Q!U*TDff)ybnh@$ytTiz_2gx@U-JnVT8ND@T4aMYGWcHfBLDlT$X$!S8G*vHXW';
	$this->_db = $db;
}

private function randomString($length = 50)
{
$characters = '4b6kF790X2DY@@VJW)Ao)E1mfCyd8lWaYAex5E7D&,."341dTS';
$string = '';

for ($p = 0; $p < $length; $p++) {
	$string .= $characters[mt_rand(0, strlen($characters)-1)];
}

	  return $string;
}

protected function hashData($data)
	{
	return hash_hmac('sha512', $data, $this->_siteKey);
}

public function isAdmin($id)
{
$result = $db->query('SELECT `is_admin` FROM `users` WHERE `id` = "'.$id.'"');
$user = $result->fetch_array();
//$selection being the array of the row returned from the database.
if($user['is_admin'] == 1) {
	return true;
}
	  return false;
}

public function sendVerification($email,$pw,$code)
{
//$email = users email taken from table
$subject = 'Your verification code';
$header = 'Sent by my website';
$message = 'Your verification code is' . $verification_code;

mail($email,$subject,$message,$header);
}

public function createUser($email, $password, $is_admin = 0)
{
//Generate users salt
$user_salt = $this->randomString();

//Salt and Hash the password
$pw = $user_salt . $password;
$pw = $this->hashData($pw);

//Create verification code
$code = $this->randomString();

//Commit values to database here.
$created = $this->_db->query("INSERT INTO `users` (`email`,`password`,`user_salt`,`verification_code`) VALUES ('".$email."','".$pw."','".$user_salt."','".$code."')");

if($created){
  	 //sendVerification($email,$pw,$code);
	echo "yeah";
	return true;
}

return false;
}

public function login($email, $password)
{
//Select users row from database base on $email
//$selection = ...

//$result = $db->query('SELECT * FROM `users` WHERE email = "'.$email.'"');
$result = $this->_db->query('SELECT * FROM `users` WHERE email = "'.$email.'"');
$selection = $result->fetch_array();

//Salt and hash password for checking
$password = $selection['user_salt'] . $password;
$password = $this->hashData($password);

//Check email and password hash match database row
//if(($selection['email']===$email)&&($selection['password']===$password)){
$match = (($selection['email']===$email)&&($selection['password']===$password));

//Convert to boolean
$is_active = (boolean) $selection[0]['is_active'];
$verified = (boolean) $selection[0]['verified'];

if($match == true) {
	if($is_active == true) {
		if($verified == true) {
			//Email/Password combination exists, set sessions
			//First, generate a random string.
			$random = $this->randomString();
			//Build the token
			$token = $_SERVER['HTTP_USER_AGENT'] . $random;
			$token = $this->hashData($token);

			//Setup sessions vars
			session_start();
			$_SESSION['token'] = $token;
			$_SESSION['user_id'] = $selection['id'];

			//Delete old logged_in_member records for user
			$this->_db->query('DELETE FROM `logged_in_member` WHERE `user_id` = "'. $selection['id'] .'"');

			//Insert new logged_in_member record for user
			//$inserted = …
			$inserted = $this->_db->query("INSERT INTO `logged_in_member` (`session_id`,`token`,`user_id`) VALUES (". session_id() .", ". $token .", ". $selection['id'] .")");

			//Logged in
			if($inserted != false) {
				return 0;
			}

			return 3;
		} else {
			//Not verified
			return 1;
		}
	} else {
		//Not active
		return 2;
	}
}

//No match, reject
return 4;

}
//Wrong PW
//echo $selection['password'];
//echo("<br />");
//echo $password;
//	echo("<br />");
//return 5;
//}

public function checkSession()
{
//Select the row
//$selection =  ...
$result = $this->_db->query('SELECT * FROM `logged_in_member` WHERE `user_id` = "'.$_SESSION['user_id'].'"');
$selection = $result->fetch_array();

if($selection) {
	//Check ID and Token
	if(session_id() == $selection['session_id'] && $_SESSION['token'] == $selection['token']) {
		//Id and token match, refresh the session for the next request
		$this->refreshSession();
		return true;
	}
}

return false;
}

private function refreshSession()
{
//Regenerate id
session_regenerate_id();

//Regenerate token
$random = $this->randomString();
//Build the token
$token = $_SERVER['HTTP_USER_AGENT'] . $random;
$token = $this->hashData($token);

//Store in session
$_SESSION['token'] = $token;
}

public function logout()
{
$this->_db->query('DELETE FROM `logged_in_member` WHERE `user_id` = "'. $_SESSION['user_id'] .'"');
session_destroy();
}


}
?>
e aqui é como estou a chamar no index.php:
<?php
include_once 'includes/auth.class.php';
include_once 'includes/db.php';

session_start();

$auth = new Auth($db);


if (!isset($_SESSION['user_id'])) {
//Not logged in, send to login page.
echo("unlogger1");
//PODES DESCOMENTAR ESTA LINHA PARA TESTAR O LOGIN	 $auth->login("admin@admin.com","admin");
//header( 'Location: index.html' );
} else {
echo("check");
//Check we have the right user
$logged_in = $auth->checkSession();

if(empty($logged_in)){
//Bad session, ask to login
 echo("unlogged");
$auth->logout();
//header( 'Location: index.html' );

} else {
//User is logged in, show the page
 echo("logined");
}
}
?>
ele volta e meia dame erro a dizer que
Notice: A session had already been started - ignoring session_start() in C:\Programaxao\EasyPHP-5.3.9\www\PowerFuel FW\includes\auth.class.php on line 109
EDIT 1 -> JA VI UMA AZELHICE, FALTA DE PLICAS NO UPDATE QUE ESTÁ NO LOGIN... MAS CONTINUA A NAO FUNCIONAR :S

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.