2013-04-13 59 views
-3

我正在爲登錄頁面創建有效的憑證功能。
功能的工作原理,如果我用它使用下面的代碼的功能外:通過函數運行「isset」時,會話將不會啓動

if(isset($_POST['email'])){ 
    $email = $_POST['email']; 
    $password = $_POST['password']; 

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

    if($results !=FALSE && $query->rowCount() > 0) { 
    if($results[0]['password'] == $password){ 
    $_SESSION['email'] = $email; 
} 

但如果我調用函數從外部函數,沒有任何反應,好像有什麼錯誤的登錄憑證。

功能:

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

    $email = $_POST['email']; 
    $password = $_POST['password']; 
    $q = "SELECT * FROM user WHERE email = :email"; 
    $query = $db->prepare($q); 
    $query->execute(array(":email" => $email)); 
    $results = $query->fetchAll(); 
    if($results !=FALSE && $query->rowCount() > 0) { 
    if($results[0]['password'] == $password){ 
    $_SESSION['email'] = $email; 

}} 

} 

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

     } 
    } 

我在想與連接的麻煩,但如果我用這個函數返回的電子郵件。

function valid_credientials($email,$password){ 
    $test = $db->query("SELECT `email` FROM `user`"); 
    while($row = $test->fetch(PDO::FETCH_ASSOC)){ 
     echo $row['email'], '<br>'; 
    } 
} 
+1

這不是「會話」,而是你寫的代碼。由於它是你自己的代碼,你的問題就是缺乏調試。由於缺乏調試,這個問題不適合Q&A網站,因爲它太過本地化。即使志願者會爲你調試你的代碼,它也不會幫助任何進一步的訪問者。 –

+1

同意'你的常識',但只是爲了幫助,你不會在你的功能中返回任何東西。寫一些明確的真/假返回值,以確保你的函數可以通過if語句。 – anson

回答

1

看時返回NULL(在此不積極,只是猜測),這不等於假,所以錯誤陣列仍然是空的在你的代碼,

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

    $email = $_POST['email']; 
    $password = $_POST['password']; 
    $q = "SELECT * FROM user WHERE email = :email"; 
    $query = $db->prepare($q); 
    $query->execute(array(":email" => $email)); 
    $results = $query->fetchAll(); 
    if($results !=FALSE && $query->rowCount() > 0) { 
    if($results[0]['password'] == $password){ 
     $_SESSION['email'] = $email; 

    } 
} 

您都可以從$ _POST價值觀,你在你的函數參數的電子郵件和密碼,並不需要這兩個線都沒有。

$email = $_POST['email']; 
$password = $_POST['password']; 

而且你檢查函數的返回值,但函數沒有返回值。通過下面的代碼,它根據條件返回true或false。

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

    $email = $_POST['email']; 
    $password = $_POST['password']; 
    $q = "SELECT * FROM user WHERE email = :email"; 
    $query = $db->prepare($q); 
    $query->execute(array(":email" => $email)); 
    $results = $query->fetchAll(); 
    if($results !=FALSE && $query->rowCount() > 0) { 
    if($results[0]['password'] == $password){ 
     $_SESSION['email'] = $email; 
     return true; 
    } 
    return false; 
} 
+0

我試圖用這樣的東西來返回值。 今天早上用POD開始,所以挺新的:) $ valid = $ query-> fetchColumn();如果($ valid){ $ success = true; } return $ succes; – Dymond

+1

我建議你通過doc [here](http://php.net/manual/en/pdostatement.fetchcolumn.php)瞭解它返回的內容以及如何比較。即使我也是PDO的新手。我回答是因爲你有一般問題。據我所知,如果沒有更多的行或者返回下一個結果集中的單個列,那麼'fetchAll()'返回false。所以你們比較$有效與無,你是真正的價值。請檢查並通過適當的比較來糾正它。 – Vinay

+0

會這樣做,謝謝 – Dymond

0

您的valid_credentials函數沒有返回值。

下面的if語句,將在未來的if語句

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

}