2017-06-01 102 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