【问题标题】:Storing array of PHP $_POST variables as array将 PHP $_POST 变量数组存储为数组
【发布时间】:2015-04-21 01:18:30
【问题描述】:

我正在研究一个 WordPress 进程,但这似乎更像是一个与 WordPress 特定相关的一般 PHP 和数组操作问题,在这种情况下与 WooCommerce 相关。

如果我有一个表单可以提交 1 到大约 35 个相同类型的条目,那么据我了解,我可以按如下方式创建它。我正在使用名字和姓氏。

表单输入,简化后如下所示:

echo '  <input type="text" name="first_name[]" id="first_name" />';
echo '  <input type="text" name="last_name[]" id="last_name" />';

在上面的完整版本中,行会根据需要重复多次,使用迭代变量将 id 顺序区分,并预先填充和隐藏其他值。有一个并行版本旨在将变量作为隐藏字段发布。

发布操作如下所示:

if (isset($_POST) == true) {
    $att_data = array(
        'last_name'         => $_POST['last_name'],
        'first_name'        => $_POST['first_name']
    );

WordPress 函数 add_post_meta 然后应该将 $att_data 添加到数据库中。它可以作为没有表单的直接“添加”操作正常工作,或者使用虚拟变量代替 $_POST[...]。然而不幸的是,在我的调试控制台上使用表单/提交/$_POST 的版本给我的是

["last_name"]=> NULL ["first_name"]=> NULL 

因此,表单正在提交,或者至少 post 操作正在发布,并且数组正在发送,但 $_POST 变量没有被捕获。为什么不呢?

附加:等一下 - 我想知道 WooCommerce 是否在重新定向之前清除了所有 $_POST 变量......现在正在研究。

【问题讨论】:

  • 你试过转储完整的$_POST,只是为了看看它包含什么?
  • 您是否尝试过var_dump($_POST); 来查看变量发生了什么?编辑:是的,@mevius 说的。
  • 不幸的是,出于测试目的,提交操作会重定向到新页面,所以 var_dump($_POST) 只是给了我新页面上的帖子变量。在我编写一个新函数之前,在相关页面上的活动表单之外的新区域中生成一个新表单,或者想一想,阻止重定向发生(这是 WooCommerce 结帐操作的一部分),我首先想清楚我的语法“应该”按书面形式工作。我会这样做(这是一个比听起来更复杂的操作),除非有一种简单的方法可以在其他地方捕获 $_POST 转储,我不知道。
  • 页面上的 var_dump($_POST) 禁用了重定向,会生成一个空数组。我现在想知道(虽然,我什至不知道这是否合理),如果 WooCommerce 刷新其结帐表单提交的 $_POST 变量,其中我的表单是“嵌套的”(不是字面上的“嵌套”,因为这是不允许的 - 我的在 WooC 的“下订单”上形成捎带。
  • 你能试试die(var_dump($_POST)吗?我一直在使用它。

标签: php arrays wordpress forms woocommerce


【解决方案1】:

我最近遇到了类似的问题,但不是 wordpress。我使用了htmlentities()serialize() 函数,所以它看起来像htmlentities(serialize($array)),这对我有用。

希望对你有帮助

【讨论】:

  • 感谢您的回复,但我不确定您在哪里应用了这两个功能。当我在数组定义后添加一行 - $att_data = htmlentities(serialize($att_data)); - 它不会产生好的结果:(主要是同一个“空”转储的一个奇怪版本。
  • 必须在发送后数组数据之前应用。当我这样做时,我正好有一个“值”属性--> &lt;input type="hidden" name="data" value="&lt;?php echo htmlentities(serialize($list)); ?&gt;"&gt;
  • echo ' &lt;input type="hidden" name="purchaser_fname[]" id="first_name_hidden" value="Suzy" /&gt;'; 将是提供重复隐藏值的简单版本(以生成 Suzys 的子数组。
  • (在先前的评论中返回太快:一个更复杂的版本,使用其他地方的变量和值,如下所示:echo ' &lt;input type="hidden" name="purchaser_fname[]" id="purchaser_fname_hidden" value="'.$user_info['billing_first_name']['0'] .'" /&gt;';
  • 该死,又做了一次:我尝试了不同的输入版本,但我不确定如何处理用户提供的值。例如echo ' &lt;input type="text" name="first_name[]" id="first_name'.$number_rows.'" value="" /&gt;';(所需的输入实际上非常简单 - 这就是让这个问题如此令人沮丧的原因!)
【解决方案2】:

关于为什么 $_POST 在这种特定情况下不起作用(WooCommerce 结帐下订单)的基本问题我没有答案,但我相信我的语法可能是正确的或接近的,因为相同或几乎当我用“get”方法替换表单中的“post”,将变量更改为 $_GET 变量,并将新表单与旧表单分开时,相同的语法起作用。此外,也许是指示性的,$_POST 在第二种形式中也不起作用,即使是在它的新位置。我偶然发现 $_GET 确实有效。

由于在此例程中安全性并不是真正需要考虑的问题(只需为已登录的购票用户预订预订名称),而且我相信请求将低于 $_GET 3000 个字符的限制,或者如果需要,后者会有其他解决方法,我将使用 $_GET 解决方案,直到并且除非我能够发现(或者有人告诉我!)Woo Checkout 中的问题是什么。这似乎是一个 WordPress/WooCommerce 问题,而不是我最初怀疑的 PHP 问题。

我留下了一个新任务,这将导致我提出一个也在 WordPress/PHP 边界上的问题(就像这个网站很多时候,至少对我而言),与排序有关基于结果数组的输出。我一直看到类似的问题,但还没有遇到这个特定的问题得到回答,但这将是另一篇文章的主题,因为我目前不确定答案是否会更多 PHP(数组排序)或特定于 WordPress。如果任何阅读此主题的人觉得我当前的计划短路了,无论是通过预测我的问题还是将我引导到可以完成这项工作的资源,请成为我的客人。

感谢所有提出建议的人,他们至少基本确认表面上没有任何语法错误,以及提供调试建议的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2015-02-10
    • 2011-09-04
    • 2013-01-14
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多