Problema sessoes php

Olá,

Eu fiz como o Gurzi diz,


PHP:
$q=mysql_query($str) or die(mysql_error());

if(mysql_num_rows($q)){
                Mais que uma linha
}else{
                Zero Linhas
}

O problema é que agora retorna sempre Zero linhas...
Antes tinha

PHP:
if(mysql_num_rows($q) > 0){

e funciona...
 
if(mysql_num_rows($q) > 0){
Na vida real tens de verificar se o número de registos é igual a 1, e não maior que zero.
No mundo real acontecem azares e, se a coisa está mais ou menos colada com cuspo, até pode acontecer teres um utilizador com o mesmo username e a mesma password(!!!) (isto nunca deveria acontecer.... mas se acontecer, e para evitares males maiores, verifica se só existe 1 par username->password).
Se aceitas que exista mais do que 1, qual é o utilizador que vais autenticar?

resumindo:
Código:
if (mysql_num_rows($q) == 1) {.....}
 
Na vida real tens de verificar se o número de registos é igual a 1, e não maior que zero.
No mundo real acontecem azares e, se a coisa está mais ou menos colada com cuspo, até pode acontecer teres um utilizador com o mesmo username e a mesma password(!!!) (isto nunca deveria acontecer.... mas se acontecer, e para evitares males maiores, verifica se só existe 1 par username->password).
Se aceitas que exista mais do que 1, qual é o utilizador que vais autenticar?

resumindo:
Código:
if (mysql_num_rows($q) == 1) {.....}

No mundo real :P o pessoal previne todo o tipo de cenários, como por exemplo usar o email e password para registo/login.
Como nunca pode ser registado o mesmo email duas vezes, pq n existem 2 emails iguais, nem se deverá permitir ao user mudar o email.

Sendo assim "mysql_num_rows > 0" serve perfeitamente.

Custumo usar este bocado de código no registo do user, que verifica se o email já foi registado.
Código:
function checkRegistered($reg_email){
        $this -> reg_email             = $reg_email;
        $search_user_query = sprintf("SELECT user_email FROM users WHERE user_email=%s",
        GetSQLValueString($this -> reg_email ,"text"));
        $search_user = mysql_query($search_user_query) or die(mysql_error());
        $reg_FoundUser = mysql_num_rows($search_user);
        
        if($reg_FoundUser){
            return true;
        }else{
            return false;
        }
    }
Sendo assim nunca será possível o $reg_FoundUser ser maior q 1

Cumps
 
nem se deverá permitir ao user mudar o email
Isso depende da aplicação.
Repara, o utilizador pode mudar o e-mail (até por motivos de segurança faz sentido que possa fazê-lo), assim como pode mudar a sua password, morada, telefone, etc. O que não pode é mudar o e-mail para um que já exista no sistema - isto se o email é utilizado para autenticar o utilizador, que pode não ser o caso.

No mundo real o pessoal previne todo o tipo de cenário
Certo. Por isso mesmo é que verificas se só existe um registo e não mais do que 0. Tendo em conta que nem sempre é o mesmo programador que leva o resto da vida de volta do mesmo programa, evitamos logo uma carga de chatices se fizermos as coisas certinhas de raíz :-)
 
Certo. Por isso mesmo é que verificas se só existe um registo e não mais do que 0. Tendo em conta que nem sempre é o mesmo programador que leva o resto da vida de volta do mesmo programa, evitamos logo uma carga de chatices se fizermos as coisas certinhas de raíz :-)

Evita-se uma carga de chatices e torna-se por um lado o código redundante, não que faça grande diferença, mas é apenas uma coisa de lógica pura, se estabeleces o cenário e as regras, logo o jogo só pode decorrer mediante o que o arbitro diz, (sem querer ofender-te com a analogia desportiva).

Quanto á possibilidade de não ser só ele a mexer no código no futuro, reestruturar o funcionamento do login/registo não é feito de ânimo leve, pois normalmente implicaria reformular a lógica/funcionamento do site em sí.

Como tal continuo a dizer que é redundande ser ==1 ou > 0 devido ao "árbitro" ter dito préviamente que só entra um gajo com aquele mail.

PS: "a imaginação comanda o homem" e o homem comanda o código :P
 
Como tal continuo a dizer que é redundande ser ==1 ou > 0 devido ao "árbitro" ter dito préviamente que só entra um gajo com aquele mail.

mas se usar == 1 diminui o risco de haver trafulhice, pois caso, por algum motivo, houverem 2 registos iguais quando chegar a este código empenca e já não avança.
Repara que só com a mudança de um sinal de comparação aumentas a segurança do teu site, e dizeres que isso já foi previsto anteriormente é deixares uma brecha que pode ser tão facilmente evitada.

Fabriziopt:
podes dar uma vista de olhos a este sistema de login que fiz, baseado no PHP5 and mySQL bilble, o link é este: http://php-login.megaware.biz/index.php
 
Última edição:
Back
Topo