【问题标题】:PHP displaying error for already used Username and empty fieldPHP显示已使用的用户名和空字段错误
【发布时间】:2012-11-30 16:55:04
【问题描述】:

我希望 PHP 确保用户名尚未使用,并检查该字段是否为空。对不起,当谈到 php 时,我是个大菜鸟。这是我的代码:

// Check for an Username:
    $dup = mysql_query("SELECT user_username FROM users WHERE user_username='".$_POST['user_username']."'");
        if(mysql_num_rows($dup) >0){
            $errors[] = 'Username already used.';
        }
        else{
            $un = mysqli_real_escape_string($dbc, trim($_POST['user_username']));
            echo '<b>Congrats, You are now Registered.</b>';
        }
        else {
            $errors[] = 'You forgot to enter your Username.';
            }

【问题讨论】:

  • 您需要阅读 SQL 注入 - 将用户输入的内容直接添加到您的 SQL 查询中是一件非常非常糟糕的事情。
  • 你得到的确切错误是什么?

标签: php mysql validation registration forum


【解决方案1】:

您有两个无法使用的else 语句。此外,您需要转义您的 $_POST 数据。最后,随着时间的流逝,您应该远离 mysql_* 函数。使用 mysqli 或 PDO。

<?php
$sql = sprintf("SELECT user_username FROM users WHERE user_username='%s'",
        mysql_real_escape_string($_POST['user_username']));
$dup = mysql_query($sql);
if(empty($_POST['user_username'])){
    $errors[] = 'You forgot to enter your Username.';
}elseif(mysql_num_rows($dup) >0){
    $errors[] = 'Username already used.';
}else{
    $un = mysqli_real_escape_string($dbc, trim($_POST['user_username']));
    echo '<b>Congrats, You are now Registered.</b>';
}?>

在我看来,另一种更简单的流程是 try/catch 语句。这样,如果用户名为空,您就不必进行不必要的数据库调用:

<?php
try{
    if(empty($_POST['user_username'])){
        throw new Exception('You forgot to enter your Username.');
    }

    $sql = sprintf("SELECT user_username FROM users WHERE user_username='%s'",
        mysql_real_escape_string($_POST['user_username']));
    $dup = mysql_query($sql);

    if(mysql_num_rows($dup) >0){
        throw new Exception('Username already used.');
    }

    echo '<b>Congrats, You are now Registered.</b>';

}catch(Exception $e){
    echo $e->getMessage();
}?>

【讨论】:

    【解决方案2】:

    在执行任何 SQL 查询之前,您应该先检查输入是否存在。

    if (!empty($_POST['user_username']) && isset($_POST['user_username'])) {
      $dup = mysql_query("SELECT user_username FROM users WHERE user_username='".$_POST['user_username']."'");
      if(mysql_num_rows($dup) >0){
        $errors[] = 'Username already used.';
      }
      else {
        echo 'Username is available.';
      }
    }
    else {
      $errors[] = 'Username is empty';
    }
    

    正如其他人评论的那样,mysql_* 函数已被弃用,您还需要考虑如何清理您的输入。

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 2014-04-15
      • 2014-10-29
      • 2017-07-07
      • 2015-12-25
      • 1970-01-01
      • 2016-07-28
      • 2013-10-01
      相关资源
      最近更新 更多