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?
我期望的行为是首先对数据库进行查询 运行 以确定用户名或电子邮件是否已存在于数据库中。如果他们这样做,请跳过 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?