PHP查询总是returns一个用户存在但是运行同样的直接查询数据库没有结果?

PHP query always returns that a user exists but running the same query directly to the database produces no results?

我期望的行为是首先对数据库进行查询 运行 以确定用户名或电子邮件是否已存在于数据库中。如果他们这样做,请跳过 if((count((array)$result) == 0)),因为如果用户名或电子邮件已经存在,结果将是 1 或 2,如果两者都不存在,则结果将是 0。

但是,即使两个值都是唯一的并且正在执行 else { echo ('Username or Email already exists!');},也会跳过 if 语句。

我检查过但没有找到解决方案的类似措辞问题here and here

if(isset($_POST['submit']))
{
 $username = !empty($_POST['username']) ? trim($_POST['username'])  : null;
 $email   = !empty($_POST['email'])     ? trim($_POST['email'])     : null;

//other variables remove for brevity, but they are all formed the exact same

$query = $pdo->prepare("SELECT * FROM users WHERE username= ? OR email= ? LIMIT 2");
$query->bindParam(1, $username, PDO::PARAM_STR);
$query->bindParam(2, $email, PDO::PARAM_STR);
$query->execute();
$result = $query->fetch(PDO::FETCH_ASSOC);

if ((count((array)$result) == 0))
{
    
        $query = $pdo->prepare ("INSERT INTO users (firstname, lastname, username, password, email, address, city, province, postalcode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
        
        $query->bindValue(1, $fname,    PDO::PARAM_STR);
        $query->bindValue(2, $lname,    PDO::PARAM_STR);
        $query->bindValue(3, $username, PDO::PARAM_STR);
        $query->bindValue(4, $password, PDO::PARAM_STR);
        $query->bindValue(5, $email,    PDO::PARAM_STR);
        $query->bindValue(6, $address,  PDO::PARAM_STR);
        $query->bindValue(7, $city,     PDO::PARAM_STR);
        $query->bindvalue(8, $province, PDO::PARAM_STR);
        $query->bindValue(9, $postalcode, PDO::PARAM_STR);
        $query->execute();
        
                echo 'Registration Successful!';
}
    
            
    else { echo ('Username or Email already exists!');}
}
//closing the database after execution
    $query = null;
    $pdo = null;

例如 SELECT * FROM users WHERE (username='kanas' OR email='postmaster@outlook.com'); returns PHPMyAdmin 中预期的零行。但是当 运行 通过我的 html 时,回显的是 "Username or Email already exists!"

创建table:

CREATE TABLE `users` (
  `userID` int(11) NOT NULL,
  `firstname` varchar(50) NOT NULL,
  `lastname` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `lastlogin` date NOT NULL,
  `permission` int(3) NOT NULL,
  `email` varchar(320) NOT NULL,
  `address` varchar(50) NOT NULL,
  `city` varchar(50) NOT NULL,
  `province` varchar(50) NOT NULL,
  `postalcode` varchar(6) NOT NULL,
  `userrequests` text NOT NULL
);

你可以试试这个

$query->execute(); 
$data = $query->fetchAll(); 
if (!$data) 
{
    // again, no rowCount() is needed! echo 'No data found'; 
}

如果未找到任何行,则 fetch() 将 return 为假。当您执行 count((array)false) 时,结果将始终为 1。

要解决此问题,只需检查 fetch() return 是否编辑了任何内容。

if ($result) {
    // ...
}

但是,请注意,您当前拥有的内容无法防止重复记录。为了防止重复记录,您必须在数据库中添加 UNIQUE 约束。参见 How to prevent duplicate usernames when people register?