0
$query = "SELECT username, email
              FROM members
              WHERE username = :username OR email = :email";
    $stmt = $sql->prepare($query);
    $stmt->execute(array(
        ':username' => $_POST['username'],
        ':email' => $email
    ));

    $existing = $stmt->fetchObject();

    if ($existing)
    {
        if ($existing->username == $_POST['username'])
        {
            $errors['username'] = "Username already in use !";
        }
        if ($existing->email == $email)
        {
            $errors['email'] = "Mail already in use !";
        }
    }

这是 register.php 文件的一部分。不确定这部分是否对问题负责,但我想。
因此,if table members is empty提交了表单 - Firefox 大约半分钟显示它是 busy-gif,但没有注册新用户就结束了,也没有显示任何错误。只是继续冷冻。
然后我按F5- 出现一个批准重新发送信息的窗口 - 单击Resend- 新用户已注册。
If the table成员is not empty- 一切正常。
似乎 - 问题是因为上面的代码正忙于查找不存在的数据。
If so,如何告诉类似 - 如果表是空的 - 停止尝试 - 只需注册新用户。

4

3 回答 3

2

我很确定$existing = $stmt->fetchObject();会为您获取一个空对象,但不会隐式评估为false. 之后,您的代码中没有任何内容会触发,从而导致您的空白输出。

尝试var_dump($existing)查看您的代码实际运行的内容。

编辑

$existing = $stmt->fetchObject(); //this might be returning an empty object

if ($existing) { //empty objects evaluate to true
    if ($existing->username == $_POST['username']) {
        $errors['username'] = "Username already in use !";
    } else if ($existing->email == $email) {
        $errors['email'] = "Mail already in use !";
    } else {
        //this will trigger if something ELSE is wrong other than what you're explicitly checking for.
        $errors['other'] = "Something else is wrong.\n" . var_export($existing, TRUE);
    }
}
于 2012-12-27T18:36:05.823 回答
1

应该$email$_POST['email']?什么是完整的代码 - 你这里没有右if括号。$existing在这种情况下,只有在为真时才会执行之后的所有内容。所以第一次,什么都不会显示。另外,最好使用数据库约束来确保没有像MySQL 这样的重复项 - 在创建表时一起使用“PRIMARY KEY”、“UNIQUE KEY”和“KEY”的含义

于 2012-12-27T18:26:02.107 回答
1

应该注意的是,从安全的角度来看,向潜在的攻击者确认您的系统中存在用户名或电子邮件地址通常是一个坏主意。这大概会给他们一半的信息来对您的登录名执行字典攻击。

我会让表中的用户名和电子邮件字段具有唯一索引,然后直接插入。如果插入失败是因为其中一个唯一性约束不允许,只需给用户一条关于无法注册的通用消息。

这也会为您节省大量不必要的数据库查询。

于 2012-12-27T18:31:09.393 回答