Jump to content

ajuda em passar valor de variavel para outra pagina


acao
 Share

Recommended Posts

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);		
?>

Link to comment
Share on other sites

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);
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?.

Link to comment
Share on other sites

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
 Share

×
×
  • 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.