【问题标题】:what is causing this endforeach error when I try to upgrade the site to PHP 7.4?当我尝试将站点升级到 PHP 7.4 时,导致此 endforeach 错误的原因是什么?
【发布时间】:2021-10-03 01:38:24
【问题描述】:

嘿,我的这段代码导致我的网站彻底崩溃:

<select size="1" class="<?php echo $this->level; ?> mobilenav" onchange="document.location.href = '/'+this.value">

<?
if(/*$this->level == "level_1"*/ false) {
?>
    <option value="">Navigation...</option>
<?php foreach ($this->items as $item): 
  
    $classes = explode(" ",$item["class"]); 

    ?>

      <optgroup label="<?= $item["link"] ?>">
          <?= $item["subitems"] ?>
      </optgroup>
  <?php endforeach; ?>
<?
} else {
    foreach ($this->items as $item):

        $classes = explode(" ",$item["class"]);

        ?>
        <?php if ($item['isActive'] || in_array("trail",$classes)): ?>
        <option class="<?php echo $item['class']; ?>" selected="selected"><span class="<?php echo $item['class']; ?>"><?php echo $item['link']; ?></span></option>
    <?php else: ?>
        <option<?php if ($item['class']): ?> class="<?php echo $item['class']; ?>"<?php endif; ?> value="<?php echo $item['href']; ?>"><?php echo $item['link']; ?></option>
    <?php endif; ?>
    <?php endforeach;
}?>
</select>

故事:我正在升级我目前的旧网站,以便能够将其与最新版本的 PHP 一起使用。

这是我得到的错误:

[2021-07-27 08:08:38] request.CRITICAL: Uncaught PHP Exception ParseError: "syntax error, unexpected 'endforeach' (T_ENDFOREACH), expecting end of file" at /var/www/vhosts/web/templates/nav_dropdown.html5 line 20 {"exception":"[object] (ParseError(code: 0): syntax error, unexpected 'endforeach' (T_ENDFOREACH), expecting end of file at /var/www/vhosts/web/templates/nav_dropdown.html5:20)"} []

我不明白为什么它期望代码在第 20 行结束,也许有人对我有一个快速的答案? 提前致谢。 汉斯。

【问题讨论】:

  • 那个语法曾经是正确的吗?我希望&lt;?php endforeach; ?&gt;
  • @Sam020 与什么相反?以下} 是单独的,关闭else 块。
  • 在php7.4中你不能使用&lt;?你需要写&lt;?php
  • @IMSoP 对不起,这个语法有点新。但是我在示例中看到 foreach-loop 有两种不同的语法,对我来说,第二个 foreach 看起来没有关闭。但显然我错了:)
  • @Sam020 "endforeach;"可以去任何其他 PHP 代码可以去的任何地方。 &lt;php foreach($a as $b): echo $b; endforeach; echo "done"; ?&gt; 完全有效。

标签: php web


【解决方案1】:

看起来错误不是来自 PHP 的 版本,而是 配置:您在新服务器/安装上关闭了 short_open_tag 设置。

由于这里混合了短标签 (&lt;?) 和完整标签 (&lt;?php),如果短标签关闭,PHP 将只读取其中的一半。对于 PHP,ifelse 和第二个 foreach 根本不存在(它们将成为输出的一部分),所以就好像你写了这个:

<select size="1" class="<?php echo $this->level; ?> mobilenav" onchange="document.location.href = '/'+this.value">

    <option value="">Navigation...</option>
<?php foreach ($this->items as $item): 
  
    $classes = explode(" ",$item["class"]); 

    ?>

      <optgroup label="<?= $item["link"] ?>">
          <?= $item["subitems"] ?>
      </optgroup>
  <?php endforeach; ?>

        <?php if ($item['isActive'] || in_array("trail",$classes)): ?>
        <option class="<?php echo $item['class']; ?>" selected="selected"><span class="<?php echo $item['class']; ?>"><?php echo $item['link']; ?></span></option>
    <?php else: ?>
        <option<?php if ($item['class']): ?> class="<?php echo $item['class']; ?>"<?php endif; ?> value="<?php echo $item['href']; ?>"><?php echo $item['link']; ?></option>
    <?php endif; ?>
    <?php endforeach;
}?>
</select>

【讨论】:

  • 谢谢。我用你的代码试过了,但它仍然有一些问题,所以我继续使用 Plesk 并打开 Short_open_tag。现在一切正常 :-) 再次感谢!
  • @hansmans 好吧,这将教会你在复制和粘贴代码之前更仔细地阅读:我没有说你应该使用上面的代码;我说这就是您当前的代码在 PHP 中的样子。如果设置解决了问题,请随意“接受”此答案(分数旁边有勾号),以便将问题标记为“已解决”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2010-09-08
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多