首页 > 解决方案 > 使用 pdo 检查 2 个条件

问题描述

在这种情况下如何有两个条件?我也想检查电子邮件,而不仅仅是用户名。

$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
}

我也需要检查电子邮件,而不仅仅是用户名,所以脚本中会有两个条件。有人可以帮忙吗?

另外,我想单独检查它们,因此我可以根据电子邮件或用户设置消息,例如“用户已存在”“电子邮件已存在”,然后(如果不存在)然后运行执行。

标签: phpmysqlpdo

解决方案


您只需要检查fetch(),这是比使用更好的选择rowCount()(因为这种方法在所有数据库中可能并不总是可靠的)。还要记住,它htmlentities()可以改变数据,所以这不应该用于输入(如对数据库的查询),只能用于输出(在网站上打印数据时)。

您可以添加一个OR email = ?条件,并单独绑定它。

如果要检查一个或两个值是否存在,可以循环遍历结果集并设置一个值,如果查询中使用的值与数据库中的值匹配。然后您可以相应地打印它们。

$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 个结果,但数据在插入查询发生之前的非常短的时间窗口内被插入到数据库中。


推荐阅读