确保用户名尚未通过PHP退出

时间:2016-03-16 21:48:30

标签: php validation

我试图确保当用户在表单中引入用户名时,该用户名不在我的数据库中。

当我介绍已存在的用户名时,收到错误消息:" *用户名已存在"。但是,它在数据库中引入了用户名,因此我的数据库中存在重复。

此外,每当我更新(F5)浏览器时,我的数据库中都会引入一条NULL记录。

非常感谢! :)

以下是我使用的代码:

<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>

<?php
// define variables and set to empty values
$usernameErr = "";
$username = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {

   if (empty($_POST["username"])) {
 $usernameErr = "Username is required";
   } else {
 $username = test_input($_POST["username"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z0-9 ]*$/",$username)) {
  $usernameErr = "Only letters, numbers and white space allowed";
    }
  }
}

function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>



<?php

   if ($usernameErr == '') 
    {

    $db = pg_connect('host=localhost dbname=test user=myuser password=mypass');
    $username = pg_escape_string($_POST['username']);
    $query = "SELECT username FROM host";
    $result = pg_query($query);
    if (!$result) {
        echo "Problem with query " . $query . "<br/>";
        echo pg_last_error();
        exit();
    }


while($myrow = pg_fetch_assoc($result)) {
     if ($username == $myrow[username]) {$usernameErr = "Username already exist";}
     else { $query = "INSERT INTO host(username) VALUES('" . $username . "')";}

     printf ("$myrow[username]>");

    }

   $result = pg_query($db, $query);
         if (!$result) {
         $errormessage = pg_last_error();
             echo "Error with query: " . $errormessage;
         exit();
         }

    $username = "";

    pg_close();

 }
?>


<p><span class="error">* required field.</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
   <input type="text" name="username" placeholder="User Name" value="<?php echo $username;?>">
   <span class="error">* <?php echo $usernameErr;?></span>
   <br><br>
   <input type="submit" name="submit" value="SAVE">
</form>


</body>
</html>

2 个答案:

答案 0 :(得分:3)

问题出在while语句中;当它在数据库中发现一致时,它会打印“用户已存在”消息,但不是停止循环,而是继续将用户名与生成插入记录的其他记录进行比较。将while语句代码更改为:

while($myrow = pg_fetch_assoc($result)) {
    if ($username == $myrow[username]) {
        $usernameErr = "Username already exist";
        break;
    }
    else {
        $query = "INSERT INTO host(username) VALUES('" . $username . "')";

        $result = pg_query($db, $query);
        if (!$result) {
            $errormessage = pg_last_error();
            echo "Error with query: " . $errormessage;
            exit();
        }

        $username = "";
    }

    printf ("$myrow[username]>");
}

这对你有用。您还可以为数据库中的用户名列定义唯一约束。

答案 1 :(得分:0)

好的,这是我找到的解决方案,它正在为我工​​作。

谢谢

    $usernamefound = false;

 while($myrow = pg_fetch_assoc($result)) {
     if ($username == $myrow[username]) {
    $usernameErr = "Username already exist";
            $usernamefound = true;
    break;                
    }
     }
    if ($usernamefound == false) { 
             $query = "INSERT INTO host(username) VALUES('" . $username . "')";

             $result = pg_query($db, $query);
         if (!$result) {
           $errormessage = pg_last_error();
               echo "Error with query: " . $errormessage;
           exit();
          }

           $username = "";

       }

     printf ("$myrow[username]>");