【问题标题】:IE8 and below <input type="image"> value work aroundIE8 及以下 <input type="image"> 值变通
【发布时间】:2010-04-15 13:03:32
【问题描述】:

我有一个小问题,我正在尝试将两个按钮的输入(一个是,一个否)捕获到数据库中,但由于某种原因,数据库并不总是显示单击按钮的值,它只是显示空白。

<form  action="refer.php" method="post" id="formID" >
  <div class="prompt_container" style="float: left;">
    <span class="prompt_item"><input type="image" src="images/yes.jpg"
      alt="submit" value="yes" onclick="this.disabled=true,this.form.submit();"
      /></span>
    <input type="hidden" name="refer" value="yes">
  </div>
</form>

<form action="thank_you.php" method="post" id="formID" >
  <div class="prompt_container" style="float: right;">
    <span class="prompt_item"><input type="image" src="images/no.jpg"
      alt="submit" value="no" onclick="this.disabled=true,this.form.submit();"
      /></span>
    <input type="hidden" name="refer" value="no" >
  </div>
</form>

这是将其全部写入数据库的代码

session_start();

$name = $_SESSION['name'];

$tel = $_SESSION['tel'];
$email = $_SESSION['email'];
$refer = $_POST['refer'];
$curDate = date("Y-m-d");

mysql_connect ("host", "user", "pass") or die ('Error: ' . mysql_error());
mysql_select_db ("database");

$query = "INSERT INTO Table (id, name, tel, email, refered, date)
  VALUES('NULL', '".$name."', '".$tel."', '".$email."', '".$refer."', '".$curDate."')";

mysql_query($query) or die (mysql_error()); 

显然任何低于 IE8 的东西都会忽略所有 &lt;input type="image"&gt; 表单输入的 value 属性。

我怎样才能让它在所有浏览器中正常工作?也许是 jQuery 或 Javascript?

【问题讨论】:

  • 你能告诉我们你的代码吗?像表单字段这样基本的东西应该适用于当今使用的几乎所有浏览器。
  • 你能详细说明这个问题吗?您可能会展示您的实现 HTML 部分。
  • 好的,我会尽快编辑代码。
  • 我不明白,您正在禁用按钮,这会导致它们无法发送到服务器,并且您没有按钮名称,因此服务器不知道是什么打电话给他们
  • @kielie,代码“this.disabled=true”禁用表单按钮,禁用的表单字段不会发送到服务器。

标签: javascript jquery mysql html


【解决方案1】:

问题大概是在坐标 (1,2) 上单击:

<input type="image" name="foo" value="bar"/>

IE 会通过:

foo.x=1&foo.y=2

其他浏览器将通过的地方:

foo=bar&foo.x=1&foo.y=2

因此,要使图像输入跨浏览器工作,您需要嗅探name.x 参数的存在,而不仅仅是name

如果您需要两个不同的图像按钮,这意味着它们需要有两个单独的名称,而不是依赖于可能无法解析的不同 value​s:

<input type="image" name="foo.bar"/>
<input type="image" name="foo.bof"/>

然后在服务器端检查参数foo.bar.xfoo.bof.x是否存在。

[编辑重新:编辑]

<input type="image" value="yes"/>

这行不通。如果没有name 属性,image 输入就不是一个成功的控件,所以value 不会被传递,坐标数据也可能不会传递。

<input type="hidden" name="refer" value="yes">

无论点击哪个image,都将提交两个隐藏的输入。 image 输入的成功不会影响任何其他hidden 元素的成功。

$query = "INSERT INTO Table (id, name, tel, email, refered, date) VALUES('NULL', '".$name."', '".$tel."', '".$email."', '".$refer."', '".$curDate."')";

那里有一些非常危险的 SQL 注入。您应该与mysql_real_escape_string 或参数化查询交朋友。

【讨论】:

  • 所以我会寻找类似 POST_['foo.bar.x'] 的东西?还是我误解了情况?
  • 是的,如果单击&lt;input type="image" name="something"&gt;,您将在所有浏览器中获得带有数值的something.x 参数。
  • 如果是 PHP,您会寻找 $_POST[foo.bar_x]$_POST[foo_bar_x]。 PHP 很奇怪。
  • 谢谢大卫,我完全忘记了这一点。这确实是一个非常奇怪的功能。我想是 register_globals 的另一个受害者。我使用带点的名称作为信号,表明我正在将所需的值破解到名称中,但是,是的,可能最好在 PHP 中避免这种情况,而只使用例如。 $_POST['actionone_x']$_POST['actiontwo_x'].
  • 所以如果我使用 $_POST[foo_bar_x] 它应该适用于所有浏览器?
【解决方案2】:

为输入提供不同的名称检查提交的数据中是否存在name.x

【讨论】:

    【解决方案3】:

    我注意到您在提交表单之前禁用了输入。

    你不能这样做,如果你想提交这些输入的值。禁用的输入未提交

    您需要先将值复制到一些隐藏的输入中。

    【讨论】:

    • 我该怎么做?
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多