【问题标题】:Array always comes back as empty数组总是返回为空
【发布时间】:2009-04-14 10:34:54
【问题描述】:

下面是我的游戏注册表单,它正在查找用户可能犯的错误,但即使发现错误,它也不会将其添加到$errors 数组中。当我print_r 数组时它返回空。

我认为 if 函数出了点问题,因为如果我从 if 函数之一之外向数组中添加一个值,它就会添加它。

这是我的代码:

if (isset($_GET['action'])){
db_connect();
db_select();

if ($_GET['action'] == "register"){
  $username = $_POST['username'];
  $password = $_POST['password'];
  $confirm = $_POST['confirm'];
  $email = $_POST['email'];
  $agree = $_POST['agree'];

  $errors = array();
  if (!isset($username)){
    $errors['0'] = "You did not specifiy a username";
  }elseif (ereg("[^a-z0-9]", $username)) {
    $errors_array['0'] = "Usernames can only contain lowercase letters and numbers";
  }elseif (mysql_num_rows(mysql_query("SELECT username FROM users WHERE username = '{$username}'")) > 0) {
    $errors['0'] = "The username you chose has already been taken";
  }

  if (!isset($password)){
    $errors['1'] = "You did not specify a password";
  }elseif ($password != $confirm){
    $errors['1'] = "The password and password confirm fields do not match";
  }

  if (!isset($email)){
    $errors['2'] = "You did not specify a E-mail address";
  }elseif (mysql_num_rows(mysql_query("SELECT email FROM users WHERE email = '{$email}'")) > 0) {
    $errors['2'] = "The E-mail you specified is already being used";
  }
  print_r($errors);
  }
}

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    首先你这样做:

    $username = $_POST['username'];
    $password = $_POST['password'];
    $confirm = $_POST['confirm'];
    $email = $_POST['email'];
    $agree = $_POST['agree'];
    

    然后检查 $username、$password 等是否为isset()。这将始终返回 true(因为您刚刚初始化了它们)。您应该对 $_POST 变量(即不是您创建的变量)执行 if(isset())。

    因此,您的所有检查都将完美运行,因为您不会进行任何检查实际数据(有效的电子邮件地址、最小/最大用户名长度等)的检查。

    发现此类问题的一种简单方法是将error_reporting 设置为E_ALL。这将显示所有错误/警告/通知/等。如果您使用不存在/尚未设置的变量,则会向您发出警告。

    【讨论】:

      【解决方案2】:

      一些要点:

      • 在一个地方使用$errors_array 而不是$errors
      • 写入数组时不要使用索引,而是使用$errors[] = "some_error"。这会将some_error 添加到数组的末尾。

      【讨论】:

        【解决方案3】:

        嗯,我要做的第一件事就是不要按键寻址您的数组。如果唯一的错误是没有电子邮件地址,那么您真的希望唯一的错误被“2”索引吗?

        对用户更好 $error[] = 'Something...";

        【讨论】:

          【解决方案4】:

          尝试在创建时向您的数组添加测试用例。

          $errors = array('test'=>'Test');
          

          然后,如果您仅在 print_r 时收到此输出,您就知道您的 if 语句没有按预期工作。

          如果没有关于变量在输入时具有哪些值的更多信息,则难以调试。

          也许做一个 $_POST (print_r($_POST)) 的转储来确保你得到你认为的值。

          【讨论】:

            【解决方案5】:

            在你调用 $errors_array['0'] 的地方,你应该通过 $errors[] = "Foo"; 来添加到数组中

            第二请看Safe SQL

            第三次检查 if 语句正在运行。将echo "1"; 放入您的每个 if 语句中(并将每个位置的数字加 1。然后您可以看到实际运行的内容。(如果有的话))

            【讨论】:

              【解决方案6】:

              解决了我自己的问题,我应该在我的 if 函数中使用“empty”而不是“!isset”。因为它们的设置如下所示:

              $username = $_POST['username'];
              $password = $_POST['password'];
              $confirm = $_POST['confirm'];
              $email = $_POST['email'];
              $agree = $_POST['agree'];
              

              无论如何感谢您的帮助。

              【讨论】:

              • 这是问题的附录(编辑)或对解决方案/问题的评论。但绝对不是答案。
              猜你喜欢
              • 2019-12-02
              • 2020-09-03
              • 1970-01-01
              • 2021-12-10
              • 2021-09-08
              • 1970-01-01
              • 1970-01-01
              • 2018-08-28
              • 2012-12-20
              相关资源
              最近更新 更多