php oop检查用户是否存在?
如果用户名存在,我想显示一个错误,但是没有抛出错误 该函数位于User.php上,我试图显示该函数的错误 我引用了,但是它与OOP方式无关 User.phpphp oop检查用户是否存在?,php,mysql,pdo,Php,Mysql,Pdo,如果用户名存在,我想显示一个错误,但是没有抛出错误 该函数位于User.php上,我试图显示该函数的错误 我引用了,但是它与OOP方式无关 User.php public function check_user_exists($username) { try{ $stmt = $this->db->prepare("SELECT user_name FROM users WHERE user_name=:username"); $stmt-&g
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> <?php echo $error; ?>
</div>
<?php
}
}
else if(isset($_GET['joined']))
{
?>
<div class="alert alert-info">
<i class="glyphicon glyphicon-log-in"></i> 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>
已在此处成功注册
注册
电子邮件地址
用户名
密码
提交
函数实际上不会返回或执行任何操作。返回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\u log()
)
我希望我能提供帮助。您的函数不会返回任何内容。警告:不要在保存到数据库中的用户输入上使用
htmlentities
。此函数仅用于在HTML上下文中显示用户数据,而不是任意显示。您希望保存在记录中的数据尽可能中性和原始。如果在HTML中显示,请在该内容上调用htmlentities
。如果在JavaScript或JSON上下文中显示,也会有特定的转义函数。这很有效,谢谢,我真的不知道返回true或false或etc是如何工作的,但现在我知道了……我认为没有魔法,只有表达式求值。这是return$row['user\u name']=$username;
是espression的返回值$row['user\u name']==$username;
,这是一个布尔值。您输入if语句的只是具有布尔值的表达式。如果您有数据值,您可以返回它。您实际上不需要执行返回$row['user\u name']=$username;
尽管如此。当您将输入与查询结果进行比较时,您可以获得相同的效果,但您只需检查是否提取了某些内容。fetch()
如果没有返回行,则返回false。@IlarioPierbatista感谢您的解释maan@Qirel很好,我已经更新了我的解决方案来实现这一点。我还没有尝试过你的解决方案,但我不想评估获取的结果。
。根据文档()它似乎只在失败的情况下返回FALSE
,您不需要检查$row['user\u name']=$username;
(就像另一个答案所建议的那样),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->fetchColumn() > 0; // fetchColumn return the number of rows selected
}
catch(PDOExeception $e)
{
echo $e->getMessage();
}
}
public function ifUserAlreadyExist(string $email):bool{
$sql = "SELECT 1 FROM users WHERE email= :Email";
$statment = $this->conn->prepare($sql);
if (false === $statment) {
return false;
}
$statment->execute([':Email' => $email]);
return (bool)$statment->fetchColumn();
}