我该如何处理已经使用用户名的情况?

时间:2011-01-01 07:05:39

标签: php error-handling mysqli

为了练习PHP和MySQL开发,我正在尝试为在线国际象棋游戏创建用户注册系统。

最佳做法是什么:

  • 我应该如何处理(可能)当用户尝试注册时,他所选择的用户名已被使用的可能性,特别是在涉及函数返回值时?我应该在INSERT查询之前创建单独的SELECT查询吗?

  • 如何处理各种页面标题?($gPageTitle = '...'; require_once 'bgsheader.php';相当丑陋)

(到目前为止我编写的代码的摘录已经在历史中。)

4 个答案:

答案 0 :(得分:1)

嗯,有一件事你可以做而不是在底部附近重复代码是这样的:

if( $result === true ) {
    $gPageTitle = 'Registration successful';
    $response = <p>You have successfully registered as ' . htmlspecialchars( $username ) . ' on this site.</p>';
} elseif( $result == 'exists' ) {
    $gPageTitle = 'Username already taken';
    $response = '<p>Someone is already using the username you have chosen. Please try using another one instead.</p>';
} else {
    trigger_error('This should never happen');
}

require_once 'bgsheader.php';
echo $response;
require_once 'bgsfooter.php';

另外,你可以在函数中返回false而不是字符串'exists',而不是它有很大的不同。

检查错误编号并不错,我确信这就是为什么它是一个包含的功能。如果您真的想要做一些不同的事情,可以通过选择用户名来检查是否已有该用户的用户。如果没有结果,则插入用户,否则,给出错误。

我喜欢在表单上进行错误处理的一件事是将所有错误字符串保存到数组中,如$ error ['username'],$ error ['email']等,然后让它运行通过单独错误检查每个输入以设置所有错误字符串,然后有一个类似这样的函数:

function error($field)
{
     global $error;
     if(isset($error[$field]))
     {
          echo $error[$field];
     }
}

然后在表单中的每个字段后调用它以在表单上提供错误报告。当然,表单页面必须提交给自己,但是你可以将所有错误检查逻辑放在一个单独的文件中,如果设置了$ _POST ['whatever']则执行include。如果您的表单是以表格或其他形式格式化的,您甚至可以执行echo '<tr><td class="error">' . $error[$field] . '</td></tr>之类的操作,并自动在字段下方插入另一行以保留错误(如果有)。

此外,请务必记住过滤您的输入,即使它应自动过滤。永远不要将帖子信息直接传递到数据库而不检查它。我还建议使用特定的超全局变量来执行操作,比如$ _POST而不是$ _REQUEST,因为$ _REQUEST包含$ _GET,$ _POST和$ _COOKIE变量,并且有人可以做一些奇怪的事情,例如提交到页面?username =页面之后的任何内容,然后你有$ _POST ['username']和$ _GET ['username'],我不确定$ _REQUEST如何处理它。可能会有$ _REQUEST ['username'] [0]和$ _REQUEST ['username'] [1]。

另外,有点关于页面标题。不知道你是否设置了这样的设置,但你可以在标题中做这样的事情:

$pageTitle = "My Website";
if(isset($gPageTitle))
{
    $pageTitle .= "- $gPageTitle";
}
echo "<title>$pageTitle</title>";

这会使页面正常加载“我的网站”作为标题,并在设置$ gPageTitle时附加“ - 用户名已存在”或“我的网站 - 用户名已存在”作为标题。

答案 1 :(得分:1)

在尝试SELECT之前,请单独INSERT检查用户名是否已被使用。

更重要的是,我建议您编写的脚本具有以下结构。它将表示逻辑(例如HTML)与其他处理(例如验证,数据库,业务逻辑)强烈分离。这是模型 - 视图 - 控制器范例的一个重要方面,通常被认为是最佳实践。

<?php

// The default state of the form is incomplete with no errors.
$title = "Registration";
$form_completed = false;
$errors = array();

// If the user is submitting the form ..
if ($_POST) {

    // Validate the input.
    // This includes checking if the username is taken.
    $errors = validate_registration_form($_POST);

    // If there are no errors.
    if (!count($errors)) {

        // Add the user.
        add_user($_POST['username'], $_POST['password']);

        // The user has completed.
        $form_completed = true;

        // Optionally you could redirect to another page here.

    } else {

        // Update the page title.
        $title = "Registration, again!"

    }

}

?>

<html>
<head>
<title>Great Site: <?= $title ?></title>
<body>

<?php if ($form_complete): ?>

    <p>Thanks for registering!</p>

<?php else: ?>

    <?php if (count($errors)): ?>
    <ul>
    <?php foreach ($errors as $error): ?>
    <li><?= $error ?></li>
    <?php endforeach; ?>
    </ul>
    <?php endif; ?>

    <form method="post">
    Username: <input type="text" name="username">
    Password: <input type="password" name="password">
    <input type="submit">
    </form>

<?php endif; ?>

</body>
</html>

答案 2 :(得分:0)

  1. 您应该进入表单并允许您的页面重定向到另一个页面,其中有“插入数据库用户名”。
  2. 假设输入的用户名是$_POST['username']之类的帖子变量。
  3. 让您的数据库检查该用户名存在的位置:

    $res = mysql_query("SELECT * FROM table WHERE username='$_POST['username']'") or die(mysql_error());
    if(mysql_num_rows($res) > 0) {
    echo "Username exists.";
    // more code to handle username exist    
    } else {
    // ok here.
    }
    
  4. 基本上做的是检查您的表是否已包含现有用户名。如果没有用户名,mysql_num_rows($res)将返回0。

答案 3 :(得分:0)

我认为Neigyl先生的答案需要单独访问数据库,这不是一个好主意,因为它只会增加你的应用程序的性能开销。  我不是一个PHP大师,但我知道我的方式,虽然我不记得===运算符。 ==我记得。  您可以将函数调用直接传递给IF语句。

if (addUser($username, $passwd));

我没有看到使用$ gPageTitle变量有什么问题,但是您可能必须首先将其声明为“global”然后使用名称空间,以便您可以在“header.php”中实际访问它,因为“标题”。 php“将不知道如何解决此页面的变量。 虽然我个人不喜欢弄乱命名空间,但我宁愿从“header.php”调用一个函数并将页面标题传递给它

  display_title($pgTitle);

  display_title("Registration Successfull");

  $header->display_title("Registration Successfull")

如果你更喜欢OO风格

如果有帮助,请告诉我。 :)