【问题标题】:While in a for loop causing server to return error在 for 循环中导致服务器返回错误
【发布时间】:2018-05-27 00:54:28
【问题描述】:

我正在编写一个php 脚本,它将生成一个随机的 16 位字符串(包含数字和字母)。它将通过表单中的数字输入类型创建用户告诉它的尽可能多的字符串。

我编写了一个 for 循环来处理执行代码 x 次(用户通过表单告诉它执行多少次),但是将 while 循环放在我的 for 循环中会导致 500 Internal Server Error

$generate_num 是用户通过表单提供的内容。

这是我正在使用的:

for($x = 0; $x <= $generate_num; $x++){
    function makeString() {
      $salt = "abchefghjkmnpqrstuvwxyz0123456789";
      srand((double)microtime()*1000000); 
      $i = 0;
      while ($i <= 15) {
          $num = rand() % 33;
          $tmp = substr($salt, $num, 1);
          $string = $string . $tmp;
          $i++;
      }
      return $string;
    }

    $string = makeString();  
}

我在 PHP 错误检查器网站上运行了我的代码,但它没有说我有任何错误。任何有关为什么这可能会导致 500 服务器错误的见解将不胜感激。提前致谢!

【问题讨论】:

  • 你在 foo 循环中多次定义函数
  • 另外请注意,您应该只调用一次srand(),而您调用的$salt 与加密盐无关。我希望您不要尝试将结果用于加密目的。

标签: php function for-loop while-loop


【解决方案1】:

您正在循环中声明一个函数。这是无效的语法,请在任何 IDE 或本地机器上运行代码,以便您了解。

500 是内部服务器错误,您可以查看 apache 日志以获得更好的想法。

你可以让它像这样工作:

    function makeString() {
      $salt = "abchefghjkmnpqrstuvwxyz0123456789";
      srand((double)microtime()*1000000); 
      $i = 0;
      while ($i <= 15) {
          $num = rand() % 33;
          $tmp = substr($salt, $num, 1);
          $string = $string . $tmp;
          $i++;
      }
      return $string;
    }

    $generate_num= 5;
    for($x = 0; $x <= $generate_num; $x++){
        $string = makeString();  
        echo $string. "<br/>";
    }

【讨论】:

  • 不能在循环中声明函数吗?抱歉,如果这是一个愚蠢的问题,请不要过多地使用循环。我现在在本地机器上运行这个网站,并得到了那个错误。
  • 查看我的代码。您正在使用 php 中不允许的循环声明同名函数。
【解决方案2】:

你在for循环中多次声明同一个函数,会导致

PHP 致命错误:无法重新声明 makeString()

除此之外,您的代码中有一个未定义的$string 变量,这将导致警告。

【讨论】:

    【解决方案3】:

    你应该在你的循环之外定义你的函数。虽然它不是无效的,但它会在 for 循环循环时创建一个新函数(这不是必需的,您不能重新声明函数)。 此外,您的 $string 变量必须作为参数或通过use ($string) 传递给函数。现在该函数无法访问该变量。

    $string = '';
    
    for($x = 0; $x <= $generate_num; $x++){
        $string .= makeString();  
    }
    
    function makeString() {
        $string = '';
        $salt = "abchefghjkmnpqrstuvwxyz0123456789";
        srand((double)microtime()*1000000); 
        $i = 0;
    
        while ($i <= 15) {
            $num = rand() % 33;
            $tmp = substr($salt, $num, 1);
            $string = $string . $tmp;
            $i++;
        }
    
       return $string;
    }
    

    【讨论】:

      【解决方案4】:

      你可以试试这个代码:

      function makeString() {
        $salt = "abchefghjkmnpqrstuvwxyz0123456789";
        srand((double)microtime()*1000000); 
        $i = 0;
        while ($i <= 15) {
            $num = rand() % 33;
            $tmp = substr($salt, $num, 1);
            $string = $string . $tmp;
            $i++;
        }
        return $string;
      }
      
      for($x = 0; $x <= $generate_num; $x++){
          $string = makeString();  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多