Php PDO统计用户名匹配的行数
我正在尝试匹配数据库中的用户名。如果用户名匹配,则返回true,否则返回false 此时,即使用户名正确,它也将始终返回false 这是我正在使用的类和调用:Php PDO统计用户名匹配的行数,php,oop,class,pdo,return,Php,Oop,Class,Pdo,Return,我正在尝试匹配数据库中的用户名。如果用户名匹配,则返回true,否则返回false 此时,即使用户名正确,它也将始终返回false 这是我正在使用的类和调用: class register{ private $result; public function __construct($post_data, PDO $dbh){ $this->post_data = array_map('trim', $post_data); $this->dbh = $db
class register{
private $result;
public function __construct($post_data, PDO $dbh){
$this->post_data = array_map('trim', $post_data);
$this->dbh = $dbh;
}
public function checkUsername(){
$stmt = $this->dbh->prepare("COUNT(*) FROM oopforum_users WHERE username = ?");
$stmt->bindParam(1, $this->post_data['reg_username'], PDO::PARAM_STR);
$stmt->execute();
$this->result = $stmt->rowCount();
if($this->result == 0){
return false;
}else{
return true;
}
}
}
$register = new register($_POST, $dbh);
if($register->checkUsername()){
//continue
}else{
echo 'ERROR: That username is taken, please choose another one.';
}
为什么即使用户名匹配也返回false?您忘记了
SELECT
语句:
$stmt = $this->dbh->prepare("SELECT COUNT(*) FROM oopforum_users WHERE username = ?");
除此之外,您的查询将始终返回一行(正好是1行),但该行的内容可能包含行计数的0,因此您需要更改逻辑:选择一个实列而不是
count(*)
并使用$stmt->rowCount()
或读取计数值并进行检查。您忘记了SELECT
语句:
$stmt = $this->dbh->prepare("SELECT COUNT(*) FROM oopforum_users WHERE username = ?");
除此之外,您的查询将始终返回一行(正好是1行),但该行的内容可能包含行计数的0,因此您需要更改逻辑:选择一个实列而不是
count(*)
并使用$stmt->rowCount()
或读取计数值并进行检查。当您var\u dump($this->result)时会得到什么代码>?当你var\u转储($this->result)时,你会得到什么代码>?@crm:为了将来参考,请启用PDO::ATTR_ERRMODE=>PDO::ERRMODE_异常,使PDO在发生错误时抛出异常。这将使您更容易发现错误。仍在努力掌握这一点。我尝试了SELECT username
和$stmt->fetchColumn
,但返回false。@Truth好主意,但是,如果没有try
-catch
块,这会起作用吗?@crm如果使用selectusername FROM…
你应该坚持使用$stmt->rowCount()
@jeroen:如果没有try-catch块,你的程序会爆炸(致命错误),这将迫使你看到错误。在您的示例中,您只需将try/catch块环绕在方法调用周围(而不是在方法声明本身内部)。@crm:为了便于将来参考,请启用PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,使PDO在发生错误时抛出异常。这将使您更容易发现错误。仍在努力掌握这一点。我尝试了SELECT username
和$stmt->fetchColumn
,但返回false。@Truth好主意,但是,如果没有try
-catch
块,这会起作用吗?@crm如果使用selectusername FROM…
你应该坚持使用$stmt->rowCount()
@jeroen:如果没有try-catch块,你的程序会爆炸(致命错误),这将迫使你看到错误。在您的示例中,只需将try/catch块包装在方法调用周围(而不是方法声明本身内部)。