• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

thinkbrunus

Login AJAX&PHP

21 mensagens neste tópico

Olá, estou a tentar implementar um código para fazer o login em AJAX&PHP, mas não estou a conseguir resultados...será que podem dar-me uma ajudinha a ver se está alguma coisa errada no meu código?

index.php

<input name="btnLogin" value="Login" id="btnLogin" type="submit" onclick="login()" />

ajax.js

var xmlHttp;
var nocache = 0;

function login(){
xmlHttp = getXmlHttpObject(); //inicializa variável com identificação do browser
var username = encodeURI(document.getElementById('txtUserName').value);
var password = encodeURI(document.getElementById('txtPassword').value);
nocache = Math.random();
xmlHttp.open("GET","login.php?username="+username+"&password="+password"&nocache="+nocache);
    xmlHttp.onreadystatechange = function(){
        if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
            document.getElementById("iMenuV").innerHTML = xmlHttp.responseText;
        }
    }
xmlHttp.send(null);
}

//verifica qual o browser utilizado
function getXmlHttpObject(){
var xmlHttp = null;
    try {  // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
        id_browser=1;
    }
    catch (e) {  // Internet Explorer
          try {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            id_broowser=2;
        }
          catch (e) {
            try {
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                id_browser=3;
              }
            catch (e) {
                  alert("O browser não suporta AJAX!");
                  return false;
              }
        }
      }
    return xmlHttp;
}

login.php

<?php
include('includes/config.php');
$username = $_GET['txtUserName'];
$password = $_GET['txtPassword'];

$query = "SELECT * FROM ndetalhe WHERE nome='" . $username . "' AND password='" . $password . "'";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
    $validUser = mysql_num_rows($result);
    if ($validUser > 0){
        echo "Confere!";
    }else{
        echo "Dados incorrectos!";
    }
?>

O objectivo é depois de isto funcionar, trabalhar com sessões, mas isso é outra conversa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O teu código tem montes de erros... Alguns deles corrigidos:

<input name="btnLogin" value="Login" id="btnLogin" type="submit" onclick="javascript:login();" />

xmlHttp.open("GET", "login.php?username="+username+"&password="+password+"&nocache="+nocache);

if (xmlHttp.readyState == 4) {

$username = $_GET['username'];

$password = $_GET['password'];

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a ver os erros que referiste, apenas noto diferença no <login();>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No segundo erro faltava-te um +.

No terceiro erro tinhas uma condição que não era necessária.

E nos outros dois tu tinhas txtUserName e txtPassword enquanto estavas a passar os parametros como username e password.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só uma questão, no firefox ele não está a mostrar nada, alguma compatibilidade?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Possivelmente... Instala o FireBug e verifica ou então coloca tudo online e envia-me o link para eu verificar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Corrige: <input name="btnLogin" value="Login" id="btnLogin" type="submit" onclick="javascript:login();" />

Depois de eu corrigir isto começou a dar bem ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia skin!

Sinceramente já me sinto mal em colocar estas dúvidas, pois isto são erros talvez de alguma falta de prática e também de alguma atenção...

Já actualizei a tag que disseste e não aparece...quer dizer aparece msg box mas sem o texto, tal como aparece no ie.

obrigado pela paciência!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Está resolvido, em vez de chamar a função login no botão (onsubmit) coloquei no action do form.

Agora continuo com um problema, como é que poderei fazer desaparecer o form do login quando o login for validado?

Estou a tentar o seguinte:

index.php

   	<div id="iBlockUser">
<?php 
	if (!isset($_SESSION['nome'])) {
		unset($_SESSION['nome']);
		echo"<script language='javascript' src='scripts/ajax.js'></script>
		<table><form id='frmLogin' name='frmLogin' method='post' action='javascript:login()' > 
    		<tr>
            	<td>Username:</td>
            	<td><input type='text' name='txtUserName' id='txtUserName' size='14' maxlength='14' /></td>                
            </tr>
    		<tr>
            	<td>Password:</td>
            	<td><input type='text' name='txtPassword' id='txtPassword' size='14' maxlength='14' /></td>                
            </tr>
    		<tr>
            	<td colspan='2' align='right'><input name='btnLogin' value='Login' id='btnLogin' type='submit' /></td>
            </tr>                    
        	</form>
    </table>";					
	}else{
		include('seguranca.php'); 		
	}	
?>

E neste include quero colocar a informação do user que está logado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei porque não funcionou, eu testei em firefox como te disse e funcionou correctamente...

Utiliza uma lógica deste género:

se não existir sessão

    form de login

se sessão inválida

    form de login

se sessão correcta

    qualquer coisa

fim se

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Temporariamente não consigo colocar on-line o protótipo do site para testar, estou a testar localmente e depois de autenticar os dados, surge uma janela que é gerada automaticamente e aparece o código todo da página...será por estar a testar localmente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Temporariamente não consigo colocar on-line o protótipo do site para testar, estou a testar localmente e depois de autenticar os dados, surge uma janela que é gerada automaticamente e aparece o código todo da página...será por estar a testar localmente?

Tens o PHP activo? E estás a aceder correctamente?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que sim, pois antes de enviar valores em ajax, testei query's com valores definido e funcionava...

Tenho o site no htdocs, e acedo assim: http://localhost/site/

Não sei se assim respondo à tua pergunta?

Isto apenas acontece quando funciona em localhost, não devia acontecer pois não?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, respondeste à minha pergunta.

Então não sei porque não funciona na tua máquina... Será problemas de permissões de acesso a ficheiros?

Não estou a ver o que possa ser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alô!

Alterei a forma de chamar a função que faz a autenticação:

<form id="frmLogin" name="frmLogin" method="post" action="javascript:login()"> 

Desta forma não estou a ter problemas, faz a autenticação como deve ser!

Agora começa a outra guerra, estou a tentar inicializar a sessão quando a autenticação é feita. Mas ando aqui às voltas a tentar colocar no responseText...

document.getElementById("iBlockUser").innerHTML = "<?php session_start(); $_SESSION['username'] = "+username+";";

Tou a chegar à conclusão que assim não funciona...a minha ideia é registar a na sessão o username e depois apresentar uma mensagem de boas vindas, chamando o nome armazenado na sessão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se tens o código que mostraste em javascript dentro de um .js file ele não vai funcionar. Precisas de ter isso dentro de um .php file ou então com o javascript ir buscar isso a um .php

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já fiz mudanças no código, espero que para melhor. Optei por colocar na página index.php o seguinte:

[code}]
<div id="iBlockUser">
      <?php
        if (empty($_SESSION['username'])){
            include('login.php');
        } else {
            echo "<div id='iBlockUserLogout'>" . $_SESSION['username'] . "</div>";
        }
      ?>         
    </div>
[/code]

No tal código AJAX:

function login(){
xmlHttp = getXmlHttpObject(); //inicializa variável com identificação do browser
var username = encodeURI(document.getElementById('txtUserName').value);
var password = encodeURI(document.getElementById('txtPassword').value);
nocache = Math.random();
xmlHttp.open("GET", "loginResponse.php?username="+username+"&password="+password+"&nocache="+nocache);
   xmlHttp.onreadystatechange = function(){
      if (xmlHttp.readyState == 4) {
         if (xmlHttp.responseText == 0){
            alert('Dados incorrectos!');
         } else{
            document.getElementById("iBlockUser").innerHTML = xmlHttp.responseText;
         }
      }
   }
xmlHttp.send(null);
}

E na página .php que retorna se a autenticação é verdadeira:

<?php
session_start();
include('includes/settings.php');

//CÓDIGO LOGIN AJAX&PHP
$username = $_GET['username'];
$password = $_GET['password'];
$sql = "SELECT * FROM ndetalhe WHERE nome='" . $username . "' AND password='" . $password . "'";
$query = mysql_query($sql) or die('Query failed: ' . mysql_error());
$result = mysql_num_rows($query);
if ($result > 0){
	$_SESSION['username'] = $result -> nome;
}else{
	echo "0";
}
?>

Agora estou com outro problema (parece que não tem fim!), quando vou para outra página no site ele não me vai buscar o ficheiro o endereço que tenho no código AJAX

xmlHttp.open("GET", "loginResponse.php?username="+username+"&password="+password+"&nocache="+nocache);

Isto porque estou a "arquitectar" o site por secções, ou seja se entrar noutra secção ele já não me vai buscar o ficheiro como é normal...é necessário alterar o caminho:

xmlHttp.open("GET", "../loginResponse.php?username="+username+"&password="+password+"&nocache="+nocache);

Depois de tanta luta, agora tenho aqui um belo galo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cria mais do que um ficheiro e alteras só o path... É a solução mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois foi isso que fiz para desenrascar....

Entretanto deram-me outra dica, colocar assim "/loginResponse.php.....". Assim funciona bem e não é necessário a duplicação de ficheiros.

Já agora, quando faço o login, ele dá-me o seguinte warning:

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3.

Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled.

You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively.

in Unknown on line 0

Isto será porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora