PHP& MySQL用户名验证和存储问题

时间:2010-05-02 08:50:15

标签: php mysql

出于某种原因,当用户输入全新的用户名时,会显示错误消息<p>Username unavailable</p>,并且不会存储该名称。我想知道是否有人可以帮助找到我的代码中的缺陷,以便我可以修复此错误?感谢

这是PHP代码。

if($_POST['username'] && trim($_POST['username'])!=='') {
    $u = "SELECT * 
          FROM users 
          WHERE username  = '$username'
          AND user_id <> '$user_id'";
    $r = mysqli_query ($mysqli, $u) or trigger_error("Query: $u\n<br />MySQL Error: " . mysqli_error($mysqli));

    if (mysqli_num_rows($r) == TRUE) {
        echo '<p>Username unavailable</p>';
        $_POST['username'] = NULL;
    } else if(isset($_POST['username']) && mysqli_num_rows($r) == 0 && strlen($_POST['username']) <= 255) { 
        $username = mysqli_real_escape_string($mysqli, $_POST['username']);
    } else if($_POST['username'] && strlen($_POST['username']) >= 256) {
        echo '<p>Username can not exceed 255 characters</p>';
    }
}

3 个答案:

答案 0 :(得分:1)

嘿,mysqli_num_rows将始终为真,因为您的查询有效。相反,您必须检查它返回的行数,当然,如果您要创建新用户,则应该为零。因此,请检查行数是否等于1。

if (mysqli_num_rows($r) == 1) echo "<p>Username unavailable</p>"; $_POST['username'] = NULL;

或者这样做:

if (mysql_i_num_rows($r) == 0 ) {
  // There isn't a user with this username yet, so create new user
} else {
  echo "Username not available";
}

答案 1 :(得分:0)

无论如何,将它与TRUE进行比较是一种不好的做法,因为它总是返回一个int,而是使用:

mysqli_num_rows($r) > 0

答案 2 :(得分:0)

由于您尚未指定$username$user_id的值,因此您的代码为

$u = "SELECT * 
          FROM users 
          WHERE username  = '$username'
          AND user_id <> '$user_id'";

将评估为

$u = "SELECT * 
              FROM users 
              WHERE username  = ''
              AND user_id <> ''";

我猜这不是您想要的查询,您将检索所有具有空白用户名的条目。