2017-06-01 216 views
3

如果用戶名存在,我想顯示一個錯誤,但不會引發錯誤。php oop檢查用戶是否存在?

該函數在User.php上,並試圖顯示該函數的錯誤。

我引用了this,但它與OOP方式無關。

user.php的

public function check_user_exists($username) 
{ 
    try{ 
     $stmt = $this->db->prepare("SELECT user_name FROM users WHERE user_name=:username"); 
     $stmt->execute(array(':username'=>$username)); 
     $row = $stmt->fetch(PDO::FETCH_ASSOC); 
     $row['user_name'] == $username; 

    } 

    catch(PDOExeception $e) 
    { 
     echo $e->getMessage(); 
    } 
} 

的index.php

<?php 
session_start(); 

require_once 'User.php'; 
$guest = new User(); 



if($guest->is_logged()) 
{ 
    $guest->redirect('profile'); 
} 


if (isset($_POST['btn_signup'])){ 

    $username = htmlentities($_POST['txt_username']); 
    $unpass = htmlentities($_POST['txt_password']); 
    $password = password_hash($unpass, PASSWORD_BCRYPT, ['cost' => 12]); 
    $unemail = $_POST['txt_email']; 
    $email = filter_var($unemail, FILTER_VALIDATE_EMAIL); 

    $guest = new User(); 


    if($email == ""){ 
     $errors[]= "Enter a Email"; 
    } 

    if($username == ""){ 
     $errors[]= "Enter a Username please"; 

    } 

    if($password == ""){ 
     $errors[]= "Enter a Password"; 
    } 



    if($guest->check_user_exists($username)){ 
     $errors[]= "Username Already Taken"; 
    } 

    if($guest->signup($email,$password,$username)){ 
     $guest->redirect('profile'); 
     die('didnt redirect');  
    } 

    else{ 
     $errors[]= "Invalid Entry"; 
    } 
} 

$title = "Home"; 
require_once 'layouts/header.php'; 


?> 


    <div class="container"> 
     <div class="row"> 
      <div class="col-md-6"> 

      <?php 
      if(isset($errors)) 
      { 
       foreach($errors as $error) 
       { 
        ?> 
        <div class="alert alert-danger"> 
         <i class="glyphicon glyphicon-warning-sign"></i> &nbsp; <?php echo $error; ?> 
        </div> 
        <?php 
       } 
      } 
      else if(isset($_GET['joined'])) 
      { 
       ?> 
       <div class="alert alert-info"> 
         <i class="glyphicon glyphicon-log-in"></i> &nbsp; Successfully registered <a href='index.php'>login</a> here 
       </div> 
       <?php 
      } 
      ?> 

       <h1>Sign Up</h1> 




       <form action ="" method="POST"> 
        <div class="form-group"> 
        <label for="Email">Email address</label> 
        <input type="email" class="form-control" aria-describedby="emailHelp" name="txt_email" placeholder="Enter email"> 
        </div> 

        <div class="form-group"> 
        <label for="Username">Username</label> 
        <input type="text" class="form-control" aria-describedby="emailHelp" name="txt_username" placeholder="Enter Username"> 
        </div> 


        <div class="form-group"> 
        <label for="Password">Password</label> 
        <input type="password" class="form-control" aria-describedby="emailHelp" name="txt_password" placeholder="Enter password"> 
        </div> 


        <button type="submit" name="btn_signup" class="btn btn-primary">Submit</button> 
       </form> 

      </div> 
     </div> 
    </div> 


</body> 
</html> 
+3

你不用函數返回任何東西。 – Qirel

+0

**警告**:請勿在您保存在數據庫中的用戶輸入中使用'htmlentities'。此函數旨在用於僅在HTML上下文中顯示用戶數據**,而不是任意。您希望保存在記錄中的數據儘可能保持原樣。如果在HTML中顯示,請在該內容上調用'htmlentities'。如果您在JavaScript或JSON上下文中顯示它,那麼還有特定的轉義函數。 – tadman

回答

1
public function check_user_exists($username) 
{ 
    try{ 
     $stmt = $this->db->prepare("SELECT user_name FROM users WHERE user_name=:username"); 
     $stmt->execute(array(':username'=>$username)); 
     return $stmt->fetchColumn() > 0; // fetchColumn return the number of rows selected 
    } 

    catch(PDOExeception $e) 
    { 
     echo $e->getMessage(); 
    } 
} 
+0

這個作品,謝謝,我真的不知道如何返回真或假等甚至作品,但現在我知道....我認爲 – BARNOWL

+1

沒有魔法,只是表達評價。這'返回$ row ['user_name'] == $ username;'是espression'$ row ['user_name'] == $ username;'的返回值,這是一個布爾值。你把什麼語句放在布爾值表達式中。如果你有一個數據值,你可以返回它。 –

+1

你實際上不需要做'return $ row ['user_name'] == $ username;'雖然。當您將輸入與查詢結果進行比較時,您可以達到同樣的效果 - 但是您可以檢查是否獲取了某些內容。如果沒有返回行,'fetch()'返回false。 – Qirel

1

您的功能實際上並不返回或做任何事情。返回fetch()的結果,如果返回true - 找到結果。如果它返回false,則沒有與用戶名匹配的行。之後您不需要檢查任何內容,因爲fetch()方法只有在找到結果時才爲真。

調整爲,你的函數應該是這樣的

public function check_user_exists($username) { 
    try{ 
     $stmt = $this->db->prepare("SELECT user_name FROM users WHERE user_name=:username"); 
     $stmt->execute(array(':username' => $username)); 
     return $stmt->fetch(PDO::FETCH_ASSOC); 
    } catch(PDOExeception $e) { 
     echo $e->getMessage(); 
    } 
} 

而且,它不是一個好主意,直​​接輸出誤差(在測試/開發環境的很好,但在實際環境中,你應該登錄它(error_log())來代替。

+0

感謝這也不錯 – BARNOWL

+1

您不需要檢查'$ row ['user_name'] == $ username;'或者(如其他答案所示),'fetch()'的結果就是您所需要的;-) – Qirel

+0

謝謝,你得到它的工作:) – BARNOWL