【问题标题】:$_GET not deserializing/getting the value from checked check-boxes$_GET 不反序列化/从选中的复选框中获取值
【发布时间】:2013-04-02 17:25:24
【问题描述】:

我对@9​​87654323@ 没有太多经验。我尝试总是使用 POST 方法,所以我可能会遗漏一些明显的东西。

我正在使用一个插件,它通过 GET 方法向服务器发送一个请求,其中一个值是用 jQuery serialize() 完成的序列化表单。

通常,至少在使用$_POST 时,该值可以很容易地分配给接收PHP 文件中的工作变量。据我所知,这并没有发生。

它保持它的序列化表示。当我尝试使用$array = unserialize($string) 对其进行反序列化时,它返回了bool(false)

接收端的var_dump($_GET) 举个例子:

array(2) {
  ["hook"]=>
  string(15) "hook%5B2%5D=107"
  ["_"]=>
  string(13) "1364920519074" //This is a serial no. generated by the plugin
}

在类似情况下,var_dump($_POST) 会直接显示值“107”,这正是我要寻找的。​​p>

感谢您的帮助。

这里是 Javascript:

$(document).ready(function () {
  var str;
  oTable = $("#myTable").dataTable({
    "fnServerParams": function (aoData) {
      aoData.push({
        name: 'hook',
        value: str
      });
    },
  });
  $("#filter").change(function () {
    str = $("#filter").serialize();
    oTable.fnReloadAjax("filter_prange.php");
  });
});

为了将来参考,我在 Scones 的 cmets 之后展示了修改后的脚本。因此解决方案是返回原始 php 文件并更改检索值的方式。从表单中获取值的方法从serialize()更改为适应插件,它只能处理硬数字。所以这实际上显示了从选中的复选框中检索值的两种不同方式。我相应地修改了标题。

<script>
$(document).ready(function() {
    var str = [];
        oTable = $("#myTable").dataTable({
    "fnServerParams": function (aoData) {
        aoData.push({ name:'str', value:str });}
});

$("#filter").change(function(){
str=[];
 $('#filter :checked').each(function() {
   str.push($(this).val());
 });
oTable.fnReloadAjax("filter_prange.php");
 });

});

这就是触发这一切的形式:

                           <form id = "filter">
<input class="hook1" type="checkbox" value="115" name="hook[0]">  
<input class="hook1" type="checkbox" value="116" name="hook[1]"> 
<input class="hook1" type="checkbox" value="107" name="hook[2]">
</form> 

【问题讨论】:

  • 我认为这是 PHP,是吗?您可能想在问题中添加php 标签。
  • 发送请求的 JavaScript 代码是什么样的?看起来好像它正在发送编码的hook[2]=107
  • 抱歉给我带来了麻烦。我在原帖中添加了js脚本,
  • 回答 MrSlayer。对,那是正确的。这些是名为 hook[number] 的表单复选框。这意味着在这种情况下,选中了值为 107 的第三个复选框。
  • @BernardA 在这种情况下,JavaScript 序列化而不是 PHP 反序列化存在问题。或许您可以提供更多关于 JS 插件的详细信息(是 DataTables)?

标签: php javascript get


【解决方案1】:

答案涉及错误的假设。隐含的假设:“javascript 已正确发送到 php”是错误的。

PHP 接收字符串“?hook=hook%2b2%2d=107&_=1364920519074”并将其转换为上面显示的数组。

想到了两个问题:

  • 为什么要使用自定义发送方法而不是像$.ajax() 这样的预定义发送方法?您是否使用其他框架进行数据传输?
  • aoData.push({name : 'hook', value : str });},中提供的javascript中str的真实内容是什么

如果没有更多关于函数dataTable 和生成的html 的内容,就不能再多说这个问题了。

【讨论】:

  • 谢谢烤饼。看看我能不能回答你的问题。关于自定义发送方式,我完全同意你的看法,但这就是插件的设置方式。所以 fnReloadAjax 在某种程度上是一个“定制的”Ajax 调用。我在 Ajax POST 方法中进行了相同的设置,一切正常。但是如果我想拥有表格插件,它肯定有很多优点,我需要适应。关于案例中str的内容是“hook%5B2%5D=107”。这是 jquery serialization() 的结果,正如我在回复 MrSlayer 的评论中所解释的那样。
  • 尝试$('input[name=hook]:checked', '#filter').val(); 而不是str = $("#filter").serialize();,它应该可以工作。所以你只是传递价值
  • 谢谢烤饼。按照你们的 cmets,我改变了方向,回到了信息的来源,而不是在接收端。所以我尝试了这个'code' $('#filter :checked').each(function() {str.push($(this).val());});'code' 而不是 serialize() 和它工作正常。我感谢你为我指明了正确的方向。
【解决方案2】:
/**
 * Temp fix to get value. Try serializing the contents of the variable, and not the 
 * variable itself.
 */
if (preg_match('/\=(.*)/', $_GET["hook"], $match))
{
  $val = $match[1];
}

【讨论】:

  • 嗨,肯恩。当脚本中只有一个值时,它可以完成这项工作,但当有多个值时,它就不起作用了。我如何使它适用于多个值。我试图让 $val 成为一个数组,但它不同意我的看法。谢谢。
  • 这有点复杂,但你可以使用 preg_match_all,然后使用 foreach ($matches[0] as $match)。同样,我认为您正在序列化令牌(key op val)而不仅仅是val。试试 .value.serialize 或 .text.serialize
【解决方案3】:

我建议您编写自己的序列化方法来永久解决问题。但是我有一个问题,你有没有发现这个序列化id是从哪里以及为什么为复选框生成的?我猜这种行为不是 JQuery 的一部分(请参阅:http://api.jquery.com/serialize/)。

【讨论】:

  • 感谢用户...这实际上正是代码 str = $("#filter").serialize();,当人们检查时所做的:。我在另一个 php 文件中有完全相同的脚本,结果完全相同。唯一的区别是,在这种情况下,它是一个带有 POST 方法的常规 Ajax 调用,可以顺利工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2019-12-31
  • 2017-04-18
  • 2021-05-20
相关资源
最近更新 更多