I-NOZex Posted September 30, 2012 at 01:32 AM Report #477110 Posted September 30, 2012 at 01:32 AM (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 September 30, 2012 at 08:40 AM by brunoais geshi B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
brunoais Posted September 30, 2012 at 08:45 AM Report #477122 Posted September 30, 2012 at 08:45 AM 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%.
bioshock Posted September 30, 2012 at 09:17 AM Report #477124 Posted September 30, 2012 at 09:17 AM https://wiki.portugal-a-programar.pt/dev_web/php/login_parametros/ https://wiki.portugal-a-programar.pt/dev_web/php/criar_login_seguro/
HappyHippyHippo Posted September 30, 2012 at 09:43 AM Report #477131 Posted September 30, 2012 at 09:43 AM 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 Portugol Plus
I-NOZex Posted September 30, 2012 at 02:31 PM Author Report #477166 Posted September 30, 2012 at 02:31 PM 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
HappyHippyHippo Posted September 30, 2012 at 02:55 PM Report #477168 Posted September 30, 2012 at 02:55 PM 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 Portugol Plus
I-NOZex Posted September 30, 2012 at 03:03 PM Author Report #477170 Posted September 30, 2012 at 03:03 PM 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
HappyHippyHippo Posted September 30, 2012 at 03:10 PM Report #477172 Posted September 30, 2012 at 03:10 PM fizeste a alteração do protótipo do construtor ? public function __construct(&$db) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted September 30, 2012 at 03:16 PM Author Report #477175 Posted September 30, 2012 at 03:16 PM 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
HappyHippyHippo Posted September 30, 2012 at 03:33 PM Report #477176 Posted September 30, 2012 at 03:33 PM (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 September 30, 2012 at 03:33 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted September 30, 2012 at 03:40 PM Author Report #477178 Posted September 30, 2012 at 03:40 PM 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
HappyHippyHippo Posted September 30, 2012 at 03:53 PM Report #477179 Posted September 30, 2012 at 03:53 PM não só é correcto como é a forma padrão de aceder aos parâmetros da classe. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted September 30, 2012 at 03:57 PM Author Report #477180 Posted September 30, 2012 at 03:57 PM 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
I-NOZex Posted September 30, 2012 at 05:17 PM Author Report #477188 Posted September 30, 2012 at 05:17 PM (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 September 30, 2012 at 05:21 PM by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
HappyHippyHippo Posted September 30, 2012 at 05:43 PM Report #477195 Posted September 30, 2012 at 05:43 PM (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 September 30, 2012 at 05:43 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted September 30, 2012 at 05:56 PM Author Report #477197 Posted September 30, 2012 at 05:56 PM ja consegui 😄 obrigado, deam, ate me sinto mau, tou a falhar tanto para comigo mesmo 😞 Tambem faltava uma coisita na query, mas ja ta a funcionar. Obrigado pela tua ajuda 😉 B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
HappyHippyHippo Posted September 30, 2012 at 06:11 PM Report #477199 Posted September 30, 2012 at 06:11 PM Tambem faltava uma coisita na query, mas ja ta a funcionar. pois ... as 's IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted September 30, 2012 at 06:24 PM Author Report #477201 Posted September 30, 2012 at 06:24 PM (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 September 30, 2012 at 06:29 PM by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
I-NOZex Posted September 30, 2012 at 07:07 PM Author Report #477212 Posted September 30, 2012 at 07:07 PM 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
HappyHippyHippo Posted September 30, 2012 at 08:50 PM Report #477229 Posted September 30, 2012 at 08:50 PM então estás a chamar a função session_start na classe ? para que ? ela já foi chamada na 5ª linha do index.php, logo quando é chamada novamente na classe vai dar essa mensagem IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now