Correct source code, but I got parse error: syntax error, unexpected '}'

Correct source code, but I got parse error: syntax error, unexpected '}'

现在我正在尝试建立一个网站的本地镜像。我有这个网站的整个数据库和源代码。 网站在服务器上运行顺利,但是当我尝试在本地访问网站的 login.php 时,出现解析错误:语法错误,意外的'}'。 我查看了login.php的源码,语法应该没有问题。我也尝试了不同版本的 php,但一次又一次地出现相同的语法错误。谁能帮我找出问题所在?

login.php中php部分的源代码:

<?php
if ($form->Value("email") != "")
    ?>
<script>document.getElementById('email').value = "<?php echo $form->Value("email"); ?>"</script>
<?
if ($form->Value("pass") != "")
    ?>
<script>document.getElementById('pass').value = "<?php echo $form->Value("pass"); ?>"</script>
<?
$fields = array("email", "pass");
for ($i=0 ; $i<count($fields) ; $i++) {
    if ($form->Error($fields[$i]) != "") {
        ?>
<script>DisplayMsg(document.getElementById("<?php echo $fields[$i]; ?>"), "<?php echo $form->Error($fields[$i]); ?>", false);</script>
<?php
    }//Parse error here: syntax error, unexpected '}' 
    else {
        ?>
<script>DisplayMsg(document.getElementById("<?php echo $fields[$i]; ?>"), "", true);</script>
<?php
    }
}

?>

我正在使用 XAMPP 来设置我的本地环境。 我是 php 的新手,如果我需要 post 更多信息,请告诉我

将 php 代码放入 html 页面的方式不太可读。您可以试试这种格式:

<?php for ($i=0 ; $i<count($fields); $i++): ?>
    <?php if ($form->Error($fields[$i]) != ""): ?>
        <script>DisplayMsg(document.getElementById("<?php echo $fields[$i]; ?>"), "<?php echo $form->Error($fields[$i]); ?>", false);</script>
    <?php endif; ?>
<?php endfor; ?>

这也将避免花括号出现问题。

这可能是因为您在本地测试时禁用了 short_open_tag。此设置控制 <? ?> 等标签在解析期间是否被解释为 PHP。

结果是这个块:

<?
$fields = array("email", "pass");
for ($i=0 ; $i<count($fields) ; $i++) {
    if ($form->Error($fields[$i]) != "") {
        ?>

永远不会作为 PHP 执行。

因此,右大括号在此处使用时不会关闭任何内容:

<?php
    }//Parse error here: syntax error, unexpected '}' 
    else {
        ?>

这就是为什么在一种情况下出现解析错误而在另一种情况下却没有。

此处的语法错误是由于 if 块的开始和结束大括号位于不同类型的开始 php 标记中。例如下面会抛出类似的语法错误:

<?php 
if (TRUE) {
?>
    <script> ..... </script>
<? //Short open tag, differnet from <?php in previous block
}
?>

虽然这不会抛出任何语法错误:

<?php 
if (TRUE) {
?>
    <script> ..... </script>
<?php 
}
?>