如果我的select语句找到了记录,那么我很难用这个并尝试返回1或者为true。我正在使用MSSQL Server和PHP与PDO,因为它的安全性。我知道fetchColumn()不是正确的使用语句,但这就是我放弃的地方,因为我几乎尝试了其他所有内容。
这是我的代码。
public function activate($email, $email_code) {
$query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");
$query->bindValue(1, $email);
$query->bindValue(2, $email_code);
$query->bindValue(3, 0);
try{
$query->execute();
$rows = $query->fetchColumn();// HERE I AM NOT SURE WHAT TO USE ??? HELP!
if($rows == 1){
$query_2 = $this->db->prepare("UPDATE users SET confirmed =? WHERE email = ?");
$query_2->bindValue(1, 1);
$query_2->bindValue(2, $email);
$query_2->execute();
return true;
}else{
return false;
}
}
catch(PDOException $e){
die($e->getMessage());
}
}
答案 0 :(得分:1)
当前代码的问题(除了在参数占位符周围使用引号)是fetchColumn()
获取结果集中第一列的值,这可能是某种id,并且该值不等于这就是为什么你总是变得虚假的原因。
您可以使用rowCount()
代替fetchColumn()
来修复此问题
$rows = $query->rowCount();
现在,要检查是否存在行,您不需要实际检索所有列的结果集。 只需使用COUNT(*)
即可。它将返回一行,其中只有一列,后者使用fetchColumn()
尝试更改
$query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");
到
$query = $this->db->prepare("SELECT COUNT(*) FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");
和
if($rows == 1){
到(只是为了安全,如果由于某种原因有重复)
if($rows > 0) {
<强>更新强>:
由于rowCount()
返回受UPDATE
影响的行数,因此更简洁的函数版本可能如下所示
public function activate($email, $email_code) {
$sql = 'UPDATE users
SET confirmed = 1
WHERE email = ?
AND email_code = ?
AND confirmed = 0';
$rows = 0;
try{
$query = $this->db->prepare($sql);
$query->bindValue(1, $email);
$query->bindValue(2, $email_code);
$query->execute();
$rows = $query->rowCount();
$query = null;
} catch(PDOException $e) {
die($e->getMessage());
}
return ($rows > 0);
}
注意:您不需要为0
列绑定1
和confirmed
等静态值。