在这种情况下如何满足两个条件?我也想检查电子邮件,而不仅仅是用户名。
$checkuser = htmlentities($_POST["username"]);
$data = $connect_pdo->prepare('SELECT username FROM users WHERE username = ?');
$data->bindParam(1, $checkuser);
$data->execute();
if ($data->rowCount() > 0) {
$linha = $data->fetch(PDO::FETCH_OBJ);
//user already exists
} else {
//execute query
}
我还需要检查电子邮件,而不仅仅是用户名,因此脚本中有两个条件。有人可以帮忙吗?
此外,我想单独检查它们,这样我就可以根据电子邮件或用户设置消息,例如“用户已存在”或“电子邮件已存在”> 并(如果没有)然后运行执行。
最佳答案
您只需要检查 fetch()
,这是比使用 rowCount()
更好的替代方法(因为此方法在所有数据库中可能并不总是可靠) 。另请记住,htmlentities()
可以更改数据,因此永远不应该在输入(如对数据库的查询)上使用它,而只能在输出(在网站上打印数据时)使用。
您可以添加 OR email = ?
条件,并单独绑定(bind)它。
如果要检查其中一个或两个值是否存在,您可以循环遍历结果集,并在查询中使用的值与数据库中的值匹配时设置一个值。然后您可以相应地打印它们。
$matches_found = [];
$data = $connect_pdo->prepare('SELECT username, email FROM users WHERE username = ? OR email = ?');
$data->execute([$_POST["username"], $_POST["email"]]);
if ($row = $data->fetch(PDO::FETCH_OBJ)) {
do {
if ($row->username == $_POST['username']) {
$matches_found['username_exists'] = 'username';
}
if ($row->email == $_POST['email']) {
$matches_found['email_exists'] = 'email';
}
} while ($row = $data->fetch(PDO::FETCH_OBJ));
echo "The ".implode(" and ", $matches_found)." already exists.";
} else {
//execute query
}
请注意,这可能容易出现竞争条件 - 第一个查询返回 0 个结果,但数据在插入查询发生之前的很短的时间窗口内插入到数据库中。
关于php - 使用 pdo 检查 2 个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063443/