2013-04-13 193 views
-1

我刚才问了一个类似的问题,但我想我现在更接近答案。函数返回值

我有一个函数在用户的电子邮件地址和密码登录到配置文件之前验证用户的电子邮件地址和密码。

它生成一个错误消息,如果电子邮件不正确;它回应出“找不到匹配的电子邮件”。

当我输入正确的电子邮件和密码时,没有任何东西会被返回。但如果我输入错误的密码和错误的电子邮件,它会给我“没有找到匹配的电子邮件”。同样的事情发生在正确的电子邮件,但密码错误。

我试图用fetchAllfetchColum返回,但是当我输入正确的值时我仍然得到相同的循环。

任何想法?

function valid_credientials($email,$password){ 
    global $db; 

    $q = "SELECT * FROM user WHERE email = :email AND password =:password"; 
    $query = $db->prepare($q); 
    $query->execute(array(":email" => $email, ":password" => $password)); 
    $results = $query->fetchAll(); 

    if($results !=FALSE && $query->rowCount() > 0) { 
     if($results[0]['password'] == $password){ 
      $_SESSION['email'] = $email; 
      return $query->fetchAll($q,0)==1 ? true:false; 
     } 
    } 

    // return false by default 
    return false; 
} 

的后isset

if (isset($_POST['email'], $_POST['password'])) { 
    if (valid_credientials($_POST['email'], $_POST['password']) == false) { 
     $errors[] = 'No matching email found.'; 
    } 

    if (empty($errors)) { 
     $_SESSION['email'] = htmlentities($_POST['email']); 
     header("Location: profile.php"); 
     die(); 
    } 
} 
+1

你调用'使用fetchall()'两次,也没用(也许它会导致意想不到的行为太) – Uby

+1

所以清爽的使用'PDO看到有人'而不是'mysql *' – asprin

回答

2

您应该添加一个默认return false;声明:

function valid_credientials($email,$password){ 
    global $db; 

    $q = "SELECT * FROM user WHERE email = :email AND password =:password"; 
    $query = $db->prepare($q); 
    $query->execute(array(":email" => $email, ":password" => $password)); 
    $results = $query->fetchAll(); 

    if($results !=FALSE && $query->rowCount() > 0) { 
     if($results[0]['password'] == $password){ 
      $_SESSION['email'] = $email; 
      return $query->fetchAll($q,0)==1 ? true:false; 
     } 
    } 

    // return false by default 
    return false; 
} 

顺便说一句,代码缩进是你的朋友;)

然而,这可以优化更稳定:

function valid_credientials($email,$password){ 
    global $db; 

    $q = "SELECT * FROM user WHERE email = :email AND password =:password"; 
    $query = $db->prepare($q); 
    if(!$query) { 
     throw new Exception('Failed to prepare the query'); 
    } 

    $ret = $query->execute(array(":email" => $email, ":password" => $password)); 
    if(!$ret) { 
     throw new Exception('Failed to execute the query'); 
    } 

    $results = $query->fetchAll(); 
    if($results === FALSE) { 
     throw new Exception('Failed to fetch results'); 
    } 

    if(count($results) > 0) { 
     // additional password check is not necessary 
     return true; 
    } 

    // return false by default 
    return false; 
} 
+0

好吧,我试过返回false,但我仍然回到我的登录表单:/ – Dymond

+1

然后还有其他错误。需要看到整个解决方案 – hek2mgl

+0

我更新了我的代码,与isset,我一直坚持这个充足的小时.garh :) – Dymond

0

说不上为什么你写了这么多的代码

function valid_credientials($email,$password){ 
    global $db; 

    $q = "SELECT 1 FROM user WHERE email = ? AND password = ?"; 
    $query = $db->prepare($q); 
    $query->execute(func_get_args()); 
    return $query->fetchColumn(); 
} 
+0

'fetchColumn()'=>返回结果集的下一行中的单个列,如果没有更多行,则返回FALSE。希望OP不会通过==或===检查为真 –