回声从PHP包含文件不能在IE中工作

时间:2011-03-06 16:01:32

标签: php internet-explorer echo

我有一个简单的表单,可以将注册信息发布到mailchimp帐户。从包含文件返回的表单和消息在Firefox中完美运行,但在IE中没有发生任何事情。如果没有输入电子邮件地址,它应该返回错误,就像在Firefox中一样。我不知道如何解决这类问题。如果有错误,它应该将错误回显到表单上的div,这在Firefox中再次完美运行并且在IE中没有任何反应。对我来说完全是无稽之谈。我今天需要这个工作。我已经尝试将文件移动到与index.php相同的位置,更改权限等,没有运气。我需要一些重要的帮助!我甚至无法让这段代码回到IE中:if(!$ _ GET ['email']){return“没有提供电子邮件地址”; }

您可以访问以下网址:www.terrybryan.com/index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Ajax Mailing List Sign Up System</title>
        <link type="text/css" rel="stylesheet" href="css/default.css" />

    </head>

    <body>
        <form id="signup" action="<?=$_SERVER['PHP_SELF']; ?>" method="get" style="width:250px;">
          <fieldset>

              <label for="email" id="email-label">Email Address</label>
              <input type="text" name="email" id="email" />


              <label for="zipcode" id="zipcode-label">Zip Code</label>
              <input type="text" name="zipcode" id="zip" />

               <label for="events" id="events-label">Receive future info from us?</label>
               Yes<input type="radio" name="events" value="Yes" checked="checked" />
               No<input type="radio" name="events" value="No" />

               <label for="hearabout" id="hearabout-label">How did you hear about us?</label>
               <select name="hearabout" id="hearabout">
<option value="Ice">Ice</option>
<option value="Radio">Radio</option>
<option value="Friend">Friend</option>
<option value="Door Hanger">Door Hanger</option>
</select>
            <br /><br />
              <input type="image" src="i/join.jpg" name="submit" value="Join" class="btn" alt="Join" />
              <br /><br />
            <div id="response">
                <? require_once 'store-address.php'; if($_GET['submit']){ echo storeAddress(); } ?>
              </div>
          </fieldset>
        </form>    

        <!-- Some fancy Ajax stuff to store the sign up info. If you don't want to use it, just delete it and the form will still work  -->

    </body>
</html>

这里是消息来自的包含文件:

<?php
/*///////////////////////////////////////////////////////////////////////
Part of the code from the book 
Building Findable Websites: Web Standards, SEO, and Beyond
by Aarron Walter (aarron@buildingfindablewebsites.com)
http://buildingfindablewebsites.com

Distrbuted under Creative Commons license
http://creativecommons.org/licenses/by-sa/3.0/us/
///////////////////////////////////////////////////////////////////////*/
require_once('MCAPI.class.php');

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"; 
    }


    // grab an API Key from http://admin.mailchimp.com/account/api/
    $api = new MCAPI('********');

    // grab your List's Unique Id by going to http://admin.mailchimp.com/lists/
    // Click the "settings" link for the list - the Unique Id is at the bottom of that page. 
    $list_id = "********";

    // Merge variables are the names of all of the fields your mailing list accepts
    // Ex: first name is by default FNAME
    // You can define the names of each merge variable in Lists > click the desired list > list settings > Merge tags for personalization
    // Pass merge values to the API in an array as follows
    $mergeVars = array('ZIPCODE'=>$_GET['zipcode'],
                        'EVENTS'=>$_GET['events'],
                        'HEARABOUT'=>$_GET['hearabout']);

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

}

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

有没有人知道为什么这个简单的表单不能像在Firefox和其他浏览器中一样在IE中运行?

谢谢,

布莱恩

4 个答案:

答案 0 :(得分:2)

原因如下:在IE中使用图片按钮时,当您点击它时,它会发送$_POST['nameofbutton']$_POST['nameofbutton_x'],而不是发送$_POST['nameofbutton_y']。现在,Firefox同时发送$_POST['nameofbutton_x']$_POST['nameofbutton_y']以及$_POST['nameofbutton']。 _x和_y值存储您在图像按钮上单击的位置的x和y坐标,因此您可以根据用户单击用于执行图像映射等操作的位置执行不同的操作。

因此,当您测试if($_GET['submit']){ echo storeAddress(); } ?>时,您无法在IE上获取它,因为IE没有$_GET['submit']它有$_GET['submit_x']$_GET['submit_y'] ,因此您必须测试$_GET['submit_x']或y。

至少我认为格式为_x和_y,可能略有不同。简单的方法是print_r($_GET);

哦,顺便说一句,小心使用Get for forms,特别是如果他们必须传输大量潜在的长信息,IE在地址栏中有255个字符的限制,之后的任何内容都会被切断并且遗漏了$ _GET或格式错误。最好使用Post表格。获取仅适用于构建CMS控制器链接或注册电子邮件验证链接等所有内容。

答案 1 :(得分:1)

我建议编辑你的html代码以便提交:

自:

<input type="image" src="i/join.jpg" name="submit" value="Join" class="btn" alt="Join" />

要:

<input type="submit" name="submit" value="Join" class="btn" alt="Join" />

类型提交通常是可靠的,其他类型(包括,遗憾的是,图像提交等)通常在不同的浏览器中以不同的方式实现。不依赖的另一件事是提交的内容,因为在某些情况下提交html而不是值(通常使用除标准提交值之外的其他内容),或者在页面上提交多个表单,这样烦人的事情。

所以一般情况下,最好选择一个简单的<input type='submit' ...etc,然后简单地检查提交的存在,并且不要过于具体提交提交内容。

答案 2 :(得分:1)

我建议使用一种非常简单的方法,使用CSS设置按钮样式,或者执行<a href="javascript:;" onclick="document.yourformname.submit"><img src="path/to/your/image" alt="my image button" /></a>

答案 3 :(得分:0)

由于PHP在服务器上运行,它应该(通常)为浏览器提供相同输入的相同响应。由于表单使用“get”方法,因此输入完全由URL指定(加上标题,包括cookie,但这些似乎不会在这里考虑)。

在任何情况下,当您从Firefox提交表单时,您应该会看到表单提交的URL出现在Firefox地址栏中。如果PHP脚本将重定向作为响应发出,则URL可能只会非常短暂地出现。无论哪种方式,它都应该在您的浏览器历史记录中可用。

如果您可以将该URL复制到IE的地址栏并从IE提交相同的请求(同样,假设不涉及cookie),那么您应该从服务器获得几乎相同的响应。如果你没有像在Firefox中那样在IE的浏览器窗口中看到相同的东西,可能有几个原因。

  1. 查看来源。 (查看 - &gt;查看来源)。如果它完全空白,则脚本可能无法正确执行。

  2. 如果您有权访问服务器错误日志,请检查与您的请求相关的错误消息。一个理智的PHP实现(与一个理智的服务器合作)将提供错误日志记录。有时,这确实是了解脚本运行情况的唯一方法。如果您可以通过FTP帐户访问Web服务器,则可能会在顶级或附近找到日志。

  3. 如果您无权访问该服务器,您仍然可以通过Firebug LiteFiddler2获得有关您的请求所发生情况的低级视图。