Login n fnciona em todos os servidores

Umbus

What is folding?
Boas eu tenho um sistema de login em php, em que tenho na base de dados o user, a pass em md5 tudo em php. agora a mina duvida e a seguinte eu tenho esse sistema em dois servidores mas num nao me funciona igualzinho, algum pode-m dar um link de um login que funcione em todos os servidores?
 
Boas eu tenho um sistema de login em php, em que tenho na base de dados o user, a pass em md5 tudo em php. agora a mina duvida e a seguinte eu tenho esse sistema em dois servidores mas num nao me funciona igualzinho, algum pode-m dar um link de um login que funcione em todos os servidores?




Se está bem feito, é provavel que não funcione porque o SGBD deve estar a correr no localhost. logo o php alojado no mesmo server, corre. No outro servidor não corre.

Se não quiseres/puderes abrir o serviço para o exterior, podes sempre autenticar via http (ou https para ser mais seguro).
 
tens que tomar atençao a uma coisa, que tipo de "sessao" usa o teu sistema de login, se for autenticaçao com escrita e definiçoes em cookies deve funcionar perfeitamente, se for autenticaçao "simples" como session_start(), session['var']; tens que tomar atençao com as permissoes do php, porque dessa forma o php utiliza uma directoria no servidor para "session trash", e se nao tiveres essa directoria definida com as devidas permissoes simplesmente nao corre, ja que é incapaz de criar a sessao. Mesmo com cookies tens que ter atençao as variaveis definidas no php.ini do servidor.

Caso o sistema funcione (sessoes) é sinal que tens algo mal definido. Se aparece algum erro mostra-o aqui.


help @ http://www.php.net/session

cumps
 
Antes demais obrigado pela ajuda, eu tenho o config bem :). Agora a unica diferença entre servidores e que o velho e a versao 4 e o novo a versao 5 :):
login:
<Form method="post" action="autentificar.php">
Nome:
<input type="text" name="utilizador"><br>
Password:
<input type="password" name="password"><br>
<input type="submit" value="enviar dados">
</form>


Autentificar:
<?
include("config.php");
$utilizador = mysql_real_escape_string($_POST[utilizador]);
$password = mysql_real_escape_string($_POST[password]);
$password = md5($password);
$status = authenticate($utilizador, $password);
if ($status == 1)
{
session_start();
session_register("SESSION");
session_register("SESSION_login");
$SESSION_login = $utilizador;
header("Location: administrar.php");
exit();
}
else
{
header("Location: erro.php");
exit();
}
function authenticate($outilizador, $apassword)
{
include("config.php");
global $ligar;
$connection = mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");
mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");
$query = "SELECT id from lusoanime_utilizador WHERE utilizador = '$outilizador' AND password = '$apassword'";
$result = mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());
if (mysql_num_rows($result) == 1)
{
return 1;
}
else
{
return 0;
}
}
?>



ADministrar:
<?php
session_start();
if (!session_is_registered("SESSION"))
{
header("Location: erro.php");
exit();
}
?>
 
ora ai esta o problema :P ou muito provavelmente...

o session_register no php5 manda-te dar uma volta a nao ser que tenhas o register_globals definido, o que no php 5 esta por defeito desactivado, logo o session_register/unregister/is_registered nao funcionam..... o que te aconselho sera substituires o session_register("VARIAVEL") por $_SESSION['VARIAVEL']="valor_a_atribuir_a_variavel"; nao necessitas de registar variaveis... para verificares se uma variavel existe isas o if(isset($_SESSIO['VARIAVEL'])) {}

com essas alteraçoes deve funcionar...

depois diz se funcionou ou nao...

p.s. nao é necessario fazeres 2 versoes do mesmo sistema, ja que o $_SESSION tambem funciona no php4 :) e alem disso é considerado "BEST PRACTICE".
cumps.
 
Última edição:
Não sei se será isto:
$utilizador = mysql_real_escape_string($_POST["utilizador"]);
$password = mysql_real_escape_string($_POST["password"]);

Se não funcionar mete assim:

PHP:
$utilizador = $_POST["utilizador"];
$password = $_POST["password"];
$utilizador = mysql_real_escape_string($utilizador);
$password = mysql_real_escape_string($password);

Se não funcionar...
 
Última edição:
K0mA :
Provavelmente o problema é daquilo que falei, ja que o mysql_real_escape_string "pode" ser usado assim, e alem disso ele ja funcionava no php 4, logo o erro so pode ser por causa de um dos updates que o php5 trouxe...

:p
cumps.
 
Yupi, era exactamente isso msdevweb. Obrigadao pela ajuda, ja tava a desesperar :P. Agradecimentos a todos os que me ajudaram, K0mA obrigado pelo apoio ;).
 
Nop, afinal nao funciona, ele faz o login mas na administraçao ele entra mesmo que nao tenha sessao :S.

<?php
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
{
header("Location: erro2.php");
exit();
}
?>
 
Última edição:
olha la bem a lógica do que tens escrito em cima... lol :)
se a variavel $_SESSION['SESSION_USERNAME'] estiver definida, manda-se o user para erro2.php este erro é uma pagina de erro no login certo? Estranho nao? lol devia ser precisamente o contrario. Esperimenta colocar um !antes do isset, algo como
<?php
session_start();
if (!isset($_SESSION['SESSION_USERNAME'])) //quer dizer se nao estiver definida :) aí é que se manda o user para erro2.php
{
header("Location: erro2.php");
exit();
}
?>
 
Agora o administrador esta bom ele nao vai para a administraçao sem fazer o login, o problema e que ele vai directamente ao erro2. Ou seja ele faz o login correctamente mas quando vai ao admin parece que vai sem sessao:

login:
<form action="autentificar.php" method="post">
<p>Utilizador:<br />
<input type="text" size="20" name="utilizador" />
<br />
Password:<br />
<input type="password" size="20" name="password" />
<br />
<input type="submit" name="submit" value="Login">
</p>
</form>



Autentificar:
<?
include("config.php");
$f_user = mysql_real_escape_string($_POST[utilizador]);
$f_pass = mysql_real_escape_string($_POST[password]);
$f_pass = md5($f_pass);
$status = authenticate($f_user, $f_pass);

// if user/pass combination is correct
if ($status == 1)
{
session_start();
$_SESSION["SESSION_USERNAME"] = $f_user;
header("Location: administrar.php");
exit();
}
else
// user/pass check failed
{
// redirect to error page
header("Location: erro.php");
exit();
}

// authenticate utilizador/senha against a database
// returns: 0 if utilizador and senha is incorrect
// 1 if utilizador and senha are correct
function authenticate($theuser, $thepass)
{
// configuration variables
include("config.php");
global $ligar;

//connect to database
$ligar = @mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");

//select database
@mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");

//query string
$query = "SELECT id from blogumbus_utilizador WHERE utilizador = '$theuser' AND password = '$thepass'";

//store query in a variable
$result = @mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());

// if row exists -> user/pass combination is correct
if (mysql_num_rows($result) == 1)
{
return 1;
}
// user/pass combination is wrong
else
{
return 0;
}
}
?>


O uqe se passara? :S
 
"o problema e que ele vai directamente ao erro2"

isso acontece quando???

no administrar.php so tens que ver se !isset($_SESSION['SESSION_USERNAME']) e pode ainda ver o length da variavel da sessao. algo como:

session_start();

//para efeitos de debug faz:
echo "S_USER: ".$_SESSION['SESSION_USERNAME'];
echo "<br />S_STRLEN:".strlen($_SESSION['SESSION_USERNAME']);

if(!isset($_SESSION['SESSION_USERNAME']) || strlen($_SESSION['SESSION_USERNAME'])<1 || $_SESSION['SESSION_USERNAME']==null) header("Location: erro2.php");

esperimenta assim para ver no que dà.


cumps.
 
Acontece quando faço o login e vou para aadministraçao...O erro nao e um bug :(. Ele nao tem a sessao feita quando esta na admin. Ele assim da o mesmo erro, e so com o primeiro codigo nao aparece nada:
S_USER:
S_STRLEN:0
 
Última edição:
Ouve... nao leves a mal, mas a tua duvida esta cada vez mais estranha (e as tusa explicaçoe ainda pioram tudo...)
tens o session_start(); em todas as paginas que usam as variaveis da sessao? no autenticar.php e administrar.php ?? se tens isso era suposto funcionar, e se mesmo assim nao funciona, é porque a sessao nao esta a ser criada... estas a usar isso no localhost ou online? tens que ter atençao às variaveis do php.ini, vê: http://php.net/session e verifica se esta tudo como deve estar, para teres acesso as variaveis do php, cria um .php com <?php php_info(); ?> executa e confirma as variaveis.

cumps.
 
Eu estou a fazer isto na net, Bem entao eu esplicao melhor e mais pausadamente :). Primeiro de tudo faço o login que esta feito assim:
PHP:
<form action="autentificar.php" method="post">
<p>Utilizador:<br />
<input type="text" size="20" name="utilizador" />
<br />
Password:<br />
<input type="password" size="20" name="password" />
<br />	
<input type="submit" name="submit" value="Login">
</p>
</form>
Depois ele vai para autentificar.php onde verifica se o login e falso ou nao, e verifica na base de dados, caso o login seja verdadeiro ele faz uma nova sessao com o nome do login:
PHP:
   include("config.php");
$f_user = mysql_real_escape_string($_POST[utilizador]);
$f_pass = mysql_real_escape_string($_POST[password]);
$f_pass  = md5($f_pass);
$status = authenticate($f_user, $f_pass);

  if ($status == 1)
	{
	session_start();
     $_SESSION["SESSION_USERNAME"] = $f_user;
	header("Location: administrar.php");
	exit();
	}
else
	{
	header("Location: erro.php");
	exit();
	}
function authenticate($theuser, $thepass)
	{
	include("config.php");
	global $ligar;
	$ligar = @mysql_connect($host, $user, $pass) or die("Incapaz de conectar à base de dados!");
	@mysql_select_db($db, $ligar) or die("Incapaz de selecionar à base de dados!");
	$query = "SELECT id from blogumbus_utilizador WHERE utilizador = '$theuser' AND password = '$thepass'";
	$result = @mysql_query($query, $ligar) or die ("Erro na query: $query. " . mysql_error());
	if (mysql_num_rows($result) == 1)
		{
		return 1;
       		}
	else
		{
		return 0;
		}
	}
Depois desta parte ele vai para uma pagina de erro caso o login esta incorrecto, ou para a pagina administrativa caso o login esta incorrecto. Dentro da pagina de administração ele verifica se tenho a sessao iniciada:
PHP:
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
	{
	header("Location: erro2.php");
	exit();
	}
	include("config.php");

E e aqui que em vez de continuar na administraçao nao fica, e como se a sessao nao tivesse sido criada (como ja foi visto).
 
PHP:
session_start();
if (isset($_SESSION['SESSION_USERNAME']))
    {
    header("Location: erro2.php");
    exit();
    }
    include("config.php");

E e aqui que em vez de continuar na administraçao nao fica, e como se a sessao nao tivesse sido criada (como ja foi visto).

Tu nesse caso estás a redireccionar o utilizador no caso de a sessão já ter sido criada. Penso que o que tu queres fazer é precisamente o contrário.
 
Epah... ja te tinha dito que na pagina administrativa tinhas que mudar aquilo, como o AliFromCairo disse e como eu ja tinha dito mais em cima:

tens if(isset($_SESSION['SESSION_USERNAME'])) envias para o erro2.php, outra vez: estas a dizer se a variavel da sessao estiver registada o user vai para o erro2.php, logo isto nao tem logica... como te disse:

if(isset($_SESSION['SESSION_USERNAME'])) tem que levar a condiçao negativa (!):

if(!isset($_SESSION['SESSION_USERNAME'])) {

}

Ve la se assim nao funciona.

cumps.
 
Eu e que me enganei, eu ja tinha feito o que tinhas dito o admin esta assim:

PHP:
session_start();

//para efeitos de debug faz:
echo "S_USER: ".$_SESSION['SESSION_USERNAME'];
echo "<br />S_STRLEN:".strlen($_SESSION['SESSION_USERNAME']);

if(!isset($_SESSION['SESSION_USERNAME']) || strlen($_SESSION['SESSION_USERNAME'])<1 || $_SESSION['SESSION_USERNAME']==null) header("Location: erro2.php");

Será que ele nao apaga o registo da sessao quando vai para a administraçao?
 
Bem... ou sou eu que estou a ficar burro ou tens que ter alguma coisa mal configurada no php.ini que impede a tua sessao de ser criada... ja que nao me parece existir algum erro no codigo que mostras... ah... onde tens:
if ($status == 1)
{
session_start();
$_SESSION["SESSION_USERNAME"] = $f_user;
header("Location: administrar.php");
exit();
}

tira o session_start(); de dentro do if. e coloca-o no inicio do documento. de resto ja nao sei o que pode estar mal... ve o site que te disse em cima e confirma as variaveis.

cumps.
 
Back
Topo