【问题标题】:Parse error: syntax error, unexpected $end on line 1解析错误:语法错误,第 1 行出现意外 $end
【发布时间】:2015-01-27 04:37:12
【问题描述】:

我正在编写一个与 MailChimp 的 API 集成的 wordpress 插件,用于将电子邮件地址存储在 MailChimp 列表中。

我有一个通过 AJAX 在提交表单时运行的“store-address.php”。

该插件在 本地 或 GoDaddy WordPress 安装上对 url 进行 AJAX 处理时有效。但不适用于托管在“MediaTemple.net”上的临时站点。

当我对“store-address.php”进行 ajax 调用时,我收到此错误...

解析错误:语法错误,第 1 行 /wp-content/plugins/plugin-name/mailchimp-api/inc/store-address.php 中的意外 {

这是我的 ajax 函数

$('#subscribe').submit(function(e) {

        $.ajax({
            url: $plugin_url '/plugin-name/mailchimp-api/inc/store-address.php',
            data: 'ajax=true&email=' + escape($('#email').val()),
            success: function(msg) {
                $('#response').html(msg);
            }
        });

        return false;
    });


我的“store-address.php”看起来像这样。
<?php
 if(session_id()==''){
  session_start();
 }
 function storeAddress(){

 /*
  * Validation
  */
 if(!$_GET['email']){ return "No email address provided"; } 

 if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['email'])) {
    return "Email address is invalid"; 
 }

 require_once('MCAPI.class.php');

 /*
  * get MailChimp API details from the plugin settings stored in the session.
  */     $mcKey = $_SESSION['mc_api_key'];
 $mcID = $_SESSION['mc_list_id'];

 $api = new MCAPI($mcKey);
 $list_id = $mcID;

 if($api->listSubscribe($list_id, $_GET['email'], '') === true) {
    return 'Success! Check your email to confirm sign up.';
 }else{
    return 'Error: ' . $api->errorMessage;
 }

}

  /*
   * If being called via ajax, autorun the function
   */
  if($_GET['ajax']){ echo storeAddress(); }
?>

php版本 5.5

正如我之前提到的,此代码适用于本地环境和 goDaddy 托管站点。只是不在MediaTemple上我也扫过代码有没有PHP语法错误,什么都找不到。

任何帮助或指出正确的方向都是天赐之物。 谢谢

【问题讨论】:

  • 这是通过includerequire 包含在另一个文件中的吗?
  • 不,我在上述函数中使用jQuery AJAX调用文件
  • 是的,我看到了,但我也看到这是一个 Wordpress 网站,这意味着在您到达这一步之前,还有很多其他的东西正在运行。 PHP 中的错误unexpected $end 表示大括号、圆括号或方括号在您的代码中的某处不匹配;我敢打赌,实际上是在您访问此文件之前。
  • 可能是个愚蠢的建议,但您可以尝试将session_start(); 放入storeAddress() 中吗?
  • "Line 1" 表示不正确的换行符。在 Mac 上开发时,您必须使用 LF 而不是 CR 保存文件。

标签: php jquery ajax wordpress apache


【解决方案1】:

该错误是由于 FileZilla 的传输类型设置为“自动”而导致的,这会破坏换行符。

将传输类型切换为“二进制”并重新启动 FileZilla 后,我重新上传了插件,一切正常。

资源: Filezilla removes line breaks on php files

【讨论】:

    【解决方案2】:

    第 1 行意外 $end

    意外的$end 表示{ 大括号} 不匹配,因此未封闭的代码或控制块。

    如果解析器抱怨line 1,那么只有当您的 php 脚本确实只有一行时才会发生这种情况。第 1 行中最初的 &lt;?php 不可能自行触发。

    发生这种情况的唯一方法是换行符不匹配。 PHP 只关心 LF (0x0A)。但是,如果您在经典 Mac OS 或默认的编辑器上进行开发,CR (0x0D) 可能会用于换行符。 CRLF 的旧 DOS/Windows 组合也可以工作。但这不是你所拥有的。

    本质上,当代码在编辑器中正确显示时,PHP 会将其视为:

    <?php⏎if(session_id()=='')⏎{ session_start();⏎}⏎function storeAddress(){⏎// Validation⏎if(!$_GET['email']){ ...
    

    仅此而已。回车 CR 无效。 PHP 会理解前几条语句,但第一条注释// Validate 只是掩盖了其余代码。这就是为什么打开的函数声明会导致悬空的“$end”。

    【讨论】:

    • 我已将我的 cmets 更改为多行 /**/,现在得到“解析错误:语法错误,/wp-content/plugins/curts-modal-overlay/mailchimp 中的意外 '{' -api/inc/store-address.php 在第 1 行
    • 这与主机或请求类型无关。这完全取决于文件在上传过程中是如何被破坏的。使用 SCP 而不是 FTP。如果没有实际上传的二进制文件在某处可用(或再次:hexdump!),就不可能做出进一步的猜测。
    • FIXED 感谢@mario,我能够重新思考导致错误的原因。这让我想到了这个……stackoverflow.com/questions/4547516/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2014-01-01
    • 2014-08-08
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多