acao Posted March 25, 2012 at 11:15 AM Report #445561 Posted March 25, 2012 at 11:15 AM boas necessito ajuda para pasar os valores da variavel $errologin que se encontra a funçao log_in para outra página. provavelmente é um erro de basico mas não consigo chegar lá, a variavel aparece na pagina teste mas não imprime nada. estou a utilizar o exemplo postado aqui no wiki <?php Class login { private $host = 'localhost'; private $huser = 'root'; private $hpass = ''; private $hdatabase = 'xxxxxx'; private $email; private $password; private $id; public $errologin; function log_in() { $this->email = $_POST['email']; $this->password = md5($_POST['password']); // $db = new mysql($this->host, $this->huser, $this->hpass, $this->hdatabase); $db = new MySQLi($this->host, $this->huser, $this->hpass, $this->hdatabase); /* Caso seja necessário especificar o charset que provém da base de dados: */ // $db->set_charset("utf8"); /**/ if ($db->connect_error) { printf("Erro ao connectar: " . $db->connect_error); exit(); } $query = $db->prepare("SELECT id FROM login WHERE email = ? AND password = ?"); $query->bind_param("ss", $this->email, $this->password); /* s = string ; s = string * email = s; password = s; */ $query->execute(); $query->store_result(); // Detecta se existem registos $query->bind_result($result); // Guarda o valor do ID $query->fetch(); if ($query->num_rows() > 0) { $this->id = $result; $cookie = new login; $cookie->setcookies($this->email, $this->password); //$errologin = 'email/pass certos'; } else { $errologin = ('Email/Password errados.'); //é aqui header('location: teste.php'); //echo ('este é o erro ' .$errologin); // <a href="Index.php?teste=emailpaserrados"></a> } $query->close(); $db->close(); } function setcookies($email, $password) { if ($_POST['remember']) { // Checkbox // 1 mês setcookie("email", $email, time() + 2592000); setcookie("password", md5($password), time() + 2592000); }else{ // 1 hora setcookie("email", $email, time() + 3600); setcookie("password", md5($password), + 3600); } session_start(); $_SESSION['login'] = array("id" => $this-id, "email" => $email); header('location: home.php'); } function log_out() { unset($_COOKIE['email']); unset($_COOKIE['password']); session_start(); session_unset(); session_destroy(); header('location: Index.php'); } function blocked() { session_start(); if (empty($_SESSION['login'])) { header('location: Index.php'); } } } ?> esta é a pagina para receber a variavel teste.php <?php require_once('Classes/ClassLogin.php');?> <?php require_once('Log.php'); ?> <?php $erro_login = new login; echo ('este é o erro '.$erro_login->errologin); ?>
bsccara Posted March 25, 2012 at 02:25 PM Report #445576 Posted March 25, 2012 at 02:25 PM Julgo que, como noutras linguagens OO, em PHP os qualificadores public e private têm a ver com a visibilidade dos métodos/veriáveis a outras classes/código. O que tu queres é uma variável que não seja especifica a uma instância da classe, ou seja, uma variável global da classe. Para isso usas o static. Em vez de : public $errologin; fazes: static $errologin; e em vez de : echo ('este é o erro '.$erro_login->errologin); fazes : echo ('este é o erro '.login::errologin);
acao Posted March 25, 2012 at 06:54 PM Author Report #445606 Posted March 25, 2012 at 06:54 PM obrigado pela resposta. estive a efectuar a alteração mas foi sem sucesso, continua tudo igual, sem erros e sem imprimir qualquer valor da variavel. apenas imprime o texto antes da mesma. já li e reli tutoriais mas sem resolução à vista. cumps acao
mjamado Posted March 25, 2012 at 11:37 PM Report #445654 Posted March 25, 2012 at 11:37 PM Duas coisas: 1. Depois de um header("Location: ..."), o browser vai-te reencaminhar para a página pedida e, possivelmente, nem sequer chegas a ver o output da execução em curso; 2. Sabes o que é o escopo de uma variável? Compreendes o conceito de escopo, quais os vários tipos de escopo disponíveis em PHP e como aceder a variáveis nos vários escopos? Estás a tentar definir uma variável de escopo de classe de forma inadequada, acabando por definir uma nova variável de escopo local. "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
acao Posted March 26, 2012 at 02:44 AM Author Report #445671 Posted March 26, 2012 at 02:44 AM agradeço a resposta. confesso que não tenho solução, já tinha lido sobre escopo e voltei a ler depois da tua dica, fiz varias tentativas mas todas sem sucesso. a que mais me parece certa mas nao funciona, na classe apenas <?php Class login //função log_in() else { global $errologin; $errologin = ('email/password errados.'); } e na pagina teste.php apenas isto echo ('este é o erro' .$errologin); será que podes dar mais uma dica? cumps acao
mjamado Posted March 26, 2012 at 09:24 AM Report #445679 Posted March 26, 2012 at 09:24 AM Antes de te preocupares com o escopo, tens de entender o que é que o header("Location: ...") faz: atira-te para outra página assim que a execução em curso acabar; muitas vezes, nem sequer consegues ver o output. Logo, nunca vais ver a mensagem. Depois, não uses variáveis globais. As variáveis globais são o demónio da programação orientada a objectos. Finalmente, não sei o que é que andas a ler sobre escopos, mas tens de ler mais. Não te esqueças que estás num contexto orientado a objectos e que o escopo de uma variável de classe é diferente do de uma variável local. "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
acao Posted April 4, 2012 at 01:40 AM Author Report #447398 Posted April 4, 2012 at 01:40 AM obrigado pelas respostas será possivel colocares um exemplo de soluçao cumps acao
acao Posted April 8, 2012 at 02:05 AM Author Report #448088 Posted April 8, 2012 at 02:05 AM boas mais uma vez venho aqui a estender a mão, com tantos craques em php não Há uma alma caridosa que me ajude a resolver esta situação basica? va...lá.........uma ajudinha. sou teimoso, devem ser os cabelos brancos que me estão a fazer mal! cumps acao
acao Posted April 8, 2012 at 04:29 PM Author Report #448117 Posted April 8, 2012 at 04:29 PM boas a minha dificuldade é carregar a variável(propriedade), não está a pasar o valor "email/password errados", já as declarei public e static e não consigo que imprima o valor a carregar"email/pass......", apenas imprime o valor colocado na declaração "teste". se alguém poder ajudar agadeço. <?php Class login { private $host = 'localhost'; private $huser = 'root'; private $hpass = ''; private $hdatabase = 'xxxxxx'; private $email; private $password; private $id; public $errologin ='teste'; function log_in() { $this->email = $_POST['email']; $this->password = md5($_POST['password']); // $db = new mysql($this->host, $this->huser, $this->hpass, $this->hdatabase); $db = new MySQLi($this->host, $this->huser, $this->hpass, $this->hdatabase); /* Caso seja necessário especificar o charset que provém da base de dados: */ // $db->set_charset("utf8"); /**/ if ($db->connect_error) { printf("Erro ao connectar: " . $db->connect_error); exit(); } $query = $db->prepare("SELECT id FROM login WHERE email = ? AND password = ?"); $query->bind_param("ss", $this->email, $this->password); /* s = string ; s = string * email = s; password = s; */ $query->execute(); $query->store_result(); // Detecta se existem registos $query->bind_result($result); // Guarda o valor do ID $query->fetch(); if ($query->num_rows() > 0) { $this->id = $result; $cookie = new login; $cookie->setcookies($this->email, $this->password); //$errologin = 'email/pass certos'; } else { $this->errologin = ('Email/Password errados.'); //aqui..........aqui..........aqui..........aqui..........aqui..........aqui.......... header('location: teste.php'); //echo ('este é o erro ' .$errologin); // <a href="Index.php?teste=emailpaserrados"></a> } $query->close(); $db->close(); } function setcookies($email, $password) { if ($_POST['remember']) { // Checkbox // 1 mês setcookie("email", $email, time() + 2592000); setcookie("password", md5($password), time() + 2592000); }else{ // 1 hora setcookie("email", $email, time() + 3600); setcookie("password", md5($password), + 3600); } session_start(); $_SESSION['login'] = array("id" => $this-id, "email" => $email); header('location: home.php'); } function log_out() { unset($_COOKIE['email']); unset($_COOKIE['password']); session_start(); session_unset(); session_destroy(); header('location: Index.php'); } function blocked() { session_start(); if (empty($_SESSION['login'])) { header('location: Index.php'); } } } ?> na pagina para aceder tenho (FICHEIRO TESTE): <?php include_once(caminho e nome_ficheiro)?> <?php $teste=new login; echo ($teste->errologin); ?> se fizer como bsccara disse acontece o mesmo, apenas imprime o valor colocado na declaração da variavel, não carrega o valor pretendido. cumps acao
bsccara Posted April 8, 2012 at 11:39 PM Report #448152 Posted April 8, 2012 at 11:39 PM Antes de mais, estou muito longe de ser craque em PHP, mas classes são um conceito comum a muitas linguagens de programação. O teu ficheiro teste.php faz: $teste=new login; // Cria uma instância da classe 'login' e grava a referência a ela na variável 'teste' (variável 'errologin' é inicializada a 'teste') echo ($teste->errologin); // Escreve o valor da variável 'errologin' da instância criada acima Como a variável foi inicializada a 'teste' na definição da classe, apenas aparece isso pois mais nenhum código é executado entre as duas linhas. Isso é um indicio de uma construção incorrecta do programa, pois provavelmente estás a executar o método 'log_in' no contexto duma instância especifica da classe e depois tentas ler o valor a partir doutra instância; como é óbvio isso não funciona. A maneira que sugeri cria uma variável que é partilhada por todas as instâncias da classe, o que permite inicializar e aceder ao valor em instâncias diferentes da classe. O meu erro foi que não reparei na linha em que, na implementação do método 'log_in', inicializas a variável errologin. Para isso, para além do que te escrevi anteriormente, tens de mudar a linha de inicialização de: $this->errologin = ('Email/Password errados.'); para: login::errologin = ('Email/Password errados.'); pois a variável 'errologin' passa a ser uma variável comum a todas as instâncias da classe (http://www.php.net/manual/en/language.oop5.static.php). P.S. Esta solução não é recomendável e deve ser evitada a menos que não haja outra hipótese.
acao Posted April 11, 2012 at 05:13 PM Author Report #448628 Posted April 11, 2012 at 05:13 PM boas bsccara obrigado pela tua resposta. isto não é um programa mas sim um pequeno exemplo, para me ambientar ao php e ao funcionamento das classes, para depois começar. já consegui colocar a funcionar, só que não foi como pretendia, tive que eliminar um ficheiro chamado log.php que tinha o restante php e aonde chamava o metodo log_in separando assim o php do html, conforme muitos moderadores aqui o solicitam. será que me podes ajudar a separa o php do html do ficheiro index.php, ou não pode ser separado? ficheiro classLogin.php <?php Class login { private $host = 'localhost'; private $huser = 'root'; private $hpass = ''; private $hdatabase = 'trocabensservicos'; private $email; private $password; private $id; static $errologin; function log_in() { $this->email = $_POST['email']; $this->password = md5($_POST['password']); // $db = new mysql($this->host, $this->huser, $this->hpass, $this->hdatabase); $db = new MySQLi($this->host, $this->huser, $this->hpass, $this->hdatabase); /* Caso seja necessário especificar o charset que provém da base de dados: */ // $db->set_charset("utf8"); /**/ if ($db->connect_error) { printf("Erro ao connectar: " . $db->connect_error); exit(); } $query = $db->prepare("SELECT id FROM login WHERE email = ? AND password = ?"); $query->bind_param("ss", $this->email, $this->password); /* s = string ; s = string * email = s; password = s; */ $query->execute(); $query->store_result(); // Detecta se existem registos $query->bind_result($result); // Guarda o valor do ID $query->fetch(); if ($query->num_rows() > 0) { $this->id = $result; $cookie = new login; $cookie->setcookies($this->email, $this->password); } else { login::$errologin = ("Email/Password errados."); } $query->close(); $db->close(); } function setcookies($email, $password) { if ($_POST['remember']) { // Checkbox // 1 mês setcookie("email", $email, time() + 2592000); setcookie("password", md5($password), time() + 2592000); }else{ // 1 hora setcookie("email", $email, time() + 3600); setcookie("password", md5($password), + 3600); } session_start(); $_SESSION['login'] = array("id" => $this-id, "email" => $email); header('location: home.php'); } function log_out() { unset($_COOKIE['email']); unset($_COOKIE['password']); session_start(); session_unset(); session_destroy(); header('location: Index.php'); } function blocked() { session_start(); if (empty($_SESSION['login'])) { header('location: Index.php'); } } } ?> ficheiro index.php <?php // include_once('Log.php');?> <?php include_once('/Classes/ClassLogin.php');?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Index</title> </head> <body> <div id="login" style="border-style: solid; border-width: 1px"> <td height="200" align="center"><img src="Imagens/xxxxxxxxxxxx.jpg" width="1262" height="200" alt="top" /></td> </div> <div id="login" style="border-style: solid; border-width: 2px"> <form id="login" method="POST" action=""> <?php session_start(); if (empty($_SESSION['login'])) { ?> email: <input type="Text" name="email"/> password: <input type="password" name="password"/> <input type="checkbox" name="remember"/> <input type="Submit" value="OK" name="sub_login"/> <?php } else { ?> <input type="Submit" value="Logout" name="sub_log_out"/> <?php } ?> </form> </div> <?php $log = new login; if (isset($_POST['sub_login'])) { if (empty($_POST['password']) or (empty($_POST['email']))) { login::$errologin=('email/password não foram preenchidos'); }else{ $log->log_in(); } }else { login::$errologin = ""; } if (isset($_POST['LogOut'])) { $log->log_out(); } echo login::$errologin; ?> </body> </html> agradeço a ajuda.
acao Posted April 18, 2012 at 02:31 PM Author Report #449704 Posted April 18, 2012 at 02:31 PM boas agradecia que alguém visse o post anterior. ajudar a separa o php do html do ficheiro index.php, ou não pode ser separado? ou pelo menos que me disse-se se é possivel e recomendável? cumps acao
bsccara Posted April 18, 2012 at 11:36 PM Report #449861 Posted April 18, 2012 at 11:36 PM Não percebo o que perguntas exactamente, mas convém teres presente qual a função de cada uma das partes; os browsers recebem e apresentam ficheiros contendo HTML. Esses ficheiros podem ser ficheiros estáticos ou produzidos em tempo real no servidor Web. É essa a função do PHP; controlar o HTML que é enviado para o browser. Portanto se usas PHP para alguma coisa, nalgum ponto vais ter de misturar HTML e PHP, caso contrário ele nunca executará. Podes ter páginas totalmente geradas pelo PHP mas não é muito habitual.
acao Posted April 19, 2012 at 07:58 AM Author Report #449870 Posted April 19, 2012 at 07:58 AM boas pois talvez não fosse muito explicito. 1. eu pretendia saber se devo separar o código php do codigo html do ficheiro index.php que coloquei no meu post anterior ou seja 3 posts antes deste. isto é: se devo colocar o codigo php num ficheiro ???.php sozinho, ou se deve permanecer assim misturado? ou melhor dizendo colocar no action"????.php". eu pergunto isto devido ter juntado todo o codigo num ficheiro para resolver a situação de passar o valor da variavel que só assim consegui. 2. se a resposta for sim como consigo retunar a informação "mail/password errados" ao utilizador?.
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