2015-09-23 84 views
0

我正在使用具有註冊/登錄功能的網站。我有一個註冊php文件,它只保存註冊表單併發布變量。然後我有一個連接到數據庫的函數文件(這是在一個外部文件中完成的,但我將它移動以使故障排除更簡單),一個驗證表單輸入的函數(所有內容都填充了,密碼相對安全),確保沒有當前用戶使用該用戶提供的電子郵件,然後嘗試註冊。註冊表單僅在後期運行signUpSubmit()功能。PHP在PDO聲明中崩潰準備

問題是,當我嘗試準備一個語句時,它崩潰了。下面的代碼主要工作。如果我在表單中輸入無效數據(不要輸入相當安全的密碼,請不要填寫),它會引發錯誤。如果我用代碼運行它來檢查已經有這封電子郵件評論的用戶,它可以正常工作,只是將您帶回到註冊頁面。但是,如果我甚至取消註釋下面註釋代碼的第一行($stmt = $db->prepare("SELECT * FROM用戶WHERE email = :email");),它只是加載一個空白頁面,就好像存在某種語法錯誤。它必須正確地連接到數據庫,就好像我搞砸了我的用戶名或密碼以進​​行連接,它會拋出一個錯誤,如果一切設置正確,沒有任何錯誤。我真的很困惑。

<?php 
//include_once 'db_connect.php'; 

session_start(); 

$DB_host = "localhost"; 
$DB_user = "root"; 
$DB_pass = "password"; 
$DB_name = "database"; 

try 
{ 
    $db = new PDO("mysql:host={$DB_host};dbname={$DB_name}",$DB_user,$DB_pass); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 

function signUpSubmit() { // Validates inputs (makes sure they're all filled in, email has valid email, 
          // password has password that's relatively secure. Email and email 
          // confirmation and password and password confirmation match. Then 
          // checks if the user already exists. 
    if(empty($_POST['first_name'])) { 
     $firstNameError = "<span style='color: red'>*Please enter your first name.</span><br />"; 
    } 
    if(empty($_POST['last_name'])) { 
     $lastNameError = "<span style='color: red'>*Please enter your last name.</span><br />"; 
    } 
    if(empty($_POST['email'])) { 
     $emailError = "<span style='color: red'>*Please enter your email.</span><br />"; 
    } else if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) { 
     $emailError = "<span style='color: red'>*Email Address not valid.</span><br />"; 
    } 
    if(empty($_POST['email_confirm'])) { 
     $emailConfirmError = "<span style='color: red'>*Please confirm your email.</span><br />"; 
    } else if ($_POST['email'] != $_POST['email_confirm']) { 
     $emailConfirmError = "<span style='color: red'>*Email addresses do not match.</span><br />"; 
    } 
    if(empty($_POST['password'])) { 
     $passwordError = "<span style='color: red'>*Please enter your password.</span><br />"; 
    } else { // Validate password has one uppercase and one lowercase letter, 
       // 1 numer, at least 8 characters 
     $passwordError = "<span style='color: red'>*"; 

     if (strlen($_POST['password']) < 8) { 
      $passwordError = $passwordError . "Password must be at least 8 characters long. "; 
     } 
     if(!preg_match('/[a-z]/', $_POST['password'])){ 
      $passwordError = $passwordError . "Password must contain at least 1 lowercase letter. "; 
     } 
     if(!preg_match('/[A-Z]/', $_POST['password'])){ 
      $passwordError = $passwordError . "Password must contain at least 1 uppercase letter. "; 
     } 
     if(!preg_match('/[0-9]/', $_POST['password'])){ 
      $passwordError = $passwordError . "Password must contain at least 1 number. "; 
     } 

     $passwordError = $passwordError . "</span><br />"; 

     if($passwordError == "<span style='color: red'>*</span><br />") { 
      $passwordError = ""; 
     } 
    } 
    if(empty($_POST['password_confirm'])) { 
     $passwordConfirmError = "<span style='color: red'>*Please confirm your password.</span><br />"; 
    } else if($_POST['password'] != $_POST['password_confirm']) { 
     $passwordConfirmError = "<span style='color: red'>*Passwords do not match.</span><br />"; 
    } 

    // Add all the errors generated into an array to return 
    $errors = array($firstNameError, $lastNameError, $emailError, $emailConfirmError, $passwordError, $passwordConfirmError); 

    if(!array_filter($errors)) { // There were no errors, check if there is already 
            // a user with this email address 
     /*$stmt = $db->prepare("SELECT * FROM `users` WHERE email = :email"); 
     $stmt->bindParam(':email', $_POST['email']); 
     $stmt->execute(); 
     $row = $stmt->fetch(); 

     if($row['email'] == $_POST['email']) { // If a user with this email address exists, return an error 
      $emailError = "<span style='color: red'>*Email Address already taken. Please choose another.</span><br />"; 
      $errors = array($firstNameError, $lastNameError, $emailError, $emailConfirmError, $passwordError, $passwordConfirmError); 
     } else { // Register the user 
      if(register($_POST['first_name'], $_POST['last_name'], $_POST['email'], $_POST['password'])) { // Registration successful 
       redirect("index.php?signed-up=1"); 
      } else { // Registration failed 
       redirect("index.php?signed-up=0"); 
      } 
     }*/ 
    } else { 
     return $errors; // Return errors 
    } 
} 

function register($first_name, $last_name, $email, $password) 
{ 
    $new_password = password_hash($password, PASSWORD_DEFAULT); 

    $stmt = $db->prepare("INSERT INTO users(first_name, last_name, email, password) 
               VALUES(:first_name, :last_name, :email, :password)"); 

    $stmt->bindparam(":first_name", $first_name); 
    $stmt->bindparam(":last_name", $last_name); 
    $stmt->bindparam(":email", $email); 
    $stmt->bindparam(":password", $new_password);           

    if($stmt->execute()) { 
     return true; 
    } else { 
     return false; 
    } 
} 
?> 
+0

您是否嘗試過啓用錯誤報告或檢查您的任何錯誤日誌,以查看php是否抱怨任何事情而不是獲得空白屏幕? – georaldc

+0

您不會將'$ db'傳遞到您可以看到的註冊表功能 – Rasclatt

回答

1

redirect()功能可能不存在,因此給你的問題。

我注意到的另一件事是你試圖從你的函數內部訪問$ db。由於範圍的差異,他們不會看到變量。這實際上可能是原因。

+1

我認爲您的第二條評論更正確。 – Rasclatt

+0

我只是不認爲包含在代碼示例中的重定向函數,但它在那裏。唉!你是一個溫順的人和一個學者,因爲它實際上只是$ db變量的範圍。剛剛通過函數,當我打電話,現在它工作得很好。謝謝! – Chris