-2

当用户忘记用户名时,我试图返回用户名。我让它再次验证他们的电子邮件地址,但由于某种原因,它一直说“错误:找不到用户名”。我希望使用正确的 mysqli 语法。

if (isset($_POST['user'])) {
    $email = mysqli_real_escape_string($con, $_POST['email']);
    $username = "";
    if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
        $errmsg = 'Error: ' . $email . ' is not a valid email address';
    } else {
        $query = "SELECT email FROM admin WHERE email = '$email'";
        $results = mysqli_query($con, $query);

        $query2 = mysqli_fetch_array($results);

        if ($query2 == 0) {
            $errmsg = 'Error: ' . $email . ' is not found, please try again';
        }
        if (!errmsg) {
            $getuname = "SELECT * FROM admin WHERE email = '$email'";
            if (!mysqli_query($con, $getuname)) {
                die('Error: ' . mysqli_error($con));
            }
            $row = mysql_fetch_array($getuname);
        }
        $username = '<div class="registersuccess">Your username is: ' . $row['username'] . '</div>';
    }
    $username = '<div class="registererror">Error: cannot find username</div>';

    mysqli_close($con);
}

在这方面我是个菜鸟,但我很确定这是正确的。如果不是我哪里出错了?

4

4 回答 4

1

这些是我注意到的一些错误:

  • 你正在做if (!errmsg),但没有这样的常数,if (!$errmsg)而是你想要的。

  • 正如 Marc B 指出的那样,您正在做,$row = mysql_fetch_array($getuname);但您想要$row = mysqli_fetch_array($getuname);

此外,您描述的具体问题可能是由于$username声明之前的mysqli_close声明。您正在重置$username那里的值,无论数据库查询的结果如何,它总是会回显相同的消息。

$username = "";
if(condition)
{
    # code ...
}
else
{
    # code ...
}
$username = '<div class="registererror">Error: cannot find username</div>';
mysqli_close($con); 

这是您的代码中的许多逻辑错误之一。用适当的缩进构造if-else块,你不应该有这个问题。

于 2013-09-27T18:29:28.240 回答
0

你的代码是一场灾难。您正在使用ereg,自石器时代以来已被弃用。您正在混合调用 mysql (no i) 和 mysqli (with i) 库。它们不可互换且彼此不兼容。

您需要切换到preg功能,并在 SINGLE mysql 库上进行标准化。由于mysql也已弃用,mysqli请仅使用。

    $row = mysql_fetch_array($getuname);
               ^^^---note the LACK of an i

if (!errmsg){
    ^^^--note the lack of a $ sign, meaning this is undefined/undeclared constant.
于 2013-09-27T18:28:08.633 回答
0

更改这部分代码:

    if (!errmsg){
      $getuname = "SELECT * FROM admin WHERE email = '$email'";
      if (!mysqli_query($con,$getuname))
        {
          die('Error: ' . mysqli_error($con));
        }
      $row = mysql_fetch_array($getuname);
    }       
    $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>';
 }
 $username = '<div class="registererror">Error: cannot find username</div>';

到:

    if (!errmsg){
      $getuname = "SELECT * FROM admin WHERE email = '$email'";
      $uresult = mysqli_query($con, $getuname);
      if (!$uresult))
        {
          die('Error: ' . mysqli_error($con));
        }
      $row = mysqli_fetch_array($uresult);
      if ($row) {
        $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>';
      } else {
        $username = '<div class="registererror">Error: cannot find username</div>';
    }
  }

你的错误:

  • 你打电话mysql_fetch_array而不是mysqli_fetch_array.
  • 您将 SQL 字符串传递给mysql_fetch_array,而不是mysqli_query.
  • 你没有检查是否返回了一行,你只是$username无条件地设置——首先是成功消息,然后是失败消息。
于 2013-09-27T18:39:59.930 回答
0

我在您的代码中发现了一些错误,您可以在 Mark B 和 Amal Murali 的回答中看到错误。让我让你的else块更简单,更清晰。您只能使用 1 个查询而不是 2 个查询。

else {
    $query = mysqli_query("SELECT * FROM admin WHERE email = '$email'");
    $row = mysqli_fetch_array($query);
    $numrows = mysqli_num_rows($query);
    if (!$errmsg){
        if($numrows == 0) {
            $errmsg = 'Error: '.$email.' is not found, please try again'; 
                // or here you can add message like Cannot find username
        }
        else
        {
            $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>';
        }
 }  
于 2013-09-27T18:47:25.927 回答