如何在PHP中POST一个关联数组

13

我有以下表单:

<form action="options.php" method="post">
    <input type="text" name="deptid" id="deptid" />
    <input type="text" name="deptname" id="deptname" />
    <input type="submit" name="submit" id="submit" value="save" />
</form>

编辑

在提交之前,是否可能将这两个值传递到一个关联数组中?我希望以这种形式传递:

array('deptid'=>'deptname')

我需要这个是因为我避免修改目标 PHP 文件(options.php) 的脚本。

谢谢。


1
@HankyPanky - cURL与此有什么关系? - Jared Farrish
因为他说“只使用PHP脚本”。所以如果他必须仅使用PHP脚本在此页面上发布数据,那么对于初学者来说,我认为cURL是不错的选择。 - Hanky Panky
@HankyPanky - 如果服务器正在联系另一个服务器以将信息拉回到服务器,则会出现这种情况。这是客户端到服务器到客户端再返回服务器...?我不知道cURL在这种情况下如何发挥作用。 - Jared Farrish
也许我误解了问题。对此我很抱歉。 - Hanky Panky
7个回答

26

这里有一个使用纯HTML的方法,可以让你接近你想要到达的地方,而且只使用HTML:

<form action="options.php" method="post">
    <input type="text" name="options[deptid]" id="deptid" />
    <input type="text" name="options[deptname]" id="deptname" />
    <input type="submit" name="submit" id="submit" value="save" />
</form>

这将在 PHP 中给你:

$post_options = array(
    'options' => array(
        'deptid '=> '[that input element value]',
        'deptname' => '[that input element value]'
    )
);

然后您可以像这样访问它(包括消毒):

$post_options = array('options');

if (is_numeric($post_options['deptid'] && $post_options['deptid'] > 0) {
    // Do whatever 
}

if (is_string($post_options['deptname'] && strlen($post_options['deptname'] > 2)) {
    // Do whatever 
}

编辑

或者... 您想在input name属性中引用deptid,并使用它来修改部门名称的行?这似乎意味着类似于以下内容:

<?php

$deptid = 1;
$deptname = 'Department of Silly Walks';

?><input type="hidden" name="options[<?=$deptid?>]" value="<?=$deptname?>">

输出结果为:

<input type="hidden" name="options[1]" value="Department of Silly Walks">

http://codepad.org/DtgoZGe7

这种方法的问题在于$deptid的值成为一个并未直接命名或引用的值。我认为,由于该值从服务器到客户端再回来时的抽象,实现起来可能存在潜在问题,因此我建议使用顶部的代码。实际上差别不大,但更具自说明性。

请注意,如果您想序列化部门列表,则会有一些麻烦。例如,您可以尝试以下方法:

<input type="text" name="options[][deptid]" id="deptid" />
<input type="text" name="options[][deptname]" id="deptname" />

这将为每个input添加一个索引值。然而...它们不会直接关联。因此,您将得到每个键的两个从零开始的数组。

在这种情况下,我建议使用JavaScript添加每个新部门的input元素,这样您可以给每个元素分配一个数字,例如:

<input type="text" name="options[0][deptid]" id="deptid" />
<input type="text" name="options[0][deptname]" id="deptname" />
<br/>
<input type="text" name="options[1][deptid]" id="deptid" />
<input type="text" name="options[1][deptname]" id="deptname" />
<br/>
<input type="text" name="options[2][deptid]" id="deptid" />
<input type="text" name="options[2][deptname]" id="deptname" />
<br/>
<input type="text" name="options[3][deptid]" id="deptid" />
<input type="text" name="options[3][deptname]" id="deptname" />

或者使用老派的POSTBACK方法,使用PHP计算$POST['options']并"手动"添加一个具有相同索引的新输入行。这是一个常见的陷阱,所以如果你在某些时候需要这个,你只需要认真思考一下。


在这种情况下,它仍然是一样的...一个数组内嵌另一个数组。 - Netorica
@Mahan - 没错。这非常有用;看一下我的编辑,里面有一个分发的例子,当你有多个新条目并且想通过 POST options 数组直接管理部门列表时。 - Jared Farrish
好的,我只是在按照原帖的代码进行操作,看看他以后是否会更改。 - Netorica
@Mahan - 这是提供的内容:array('deptid'=>'deptname')。如果没有客户端JavaScript操作输入值(例如,作为在“提交”时修改的隐藏值),那似乎表示将名称与行ID分离。因此,OP可能只需要<input type="hidden" name="<?=$deptid?>" value="<?=$deptname?>">。我突然想到了这个。希望我们能听到来自OP的回复。 - Jared Farrish
@user1134475 - 你需要使用PHP从数据库或源中获取$deptid$deptname,并插入它(例如使用模板方法)。这只是你存储数据的地方。这个问题的典型解决方法是模型-视图-控制器(MVC)设计模式。 - Jared Farrish
@Jared - 感谢您提供如此详细的答案。我已经编辑了我的问题。在提交到目标 PHP(在这种情况下是 options.php)之前,我需要关联数组。是否可以在没有 JavaScript 的情况下实现这一点? - user1134475

6

$_POST已经是一个关联数组我建议您不要让事情变得更加复杂,因为$_POST已经保存了来自表单的数据

$myassoc = $_POST;
print_r($myassoc);

您将收到的关联数组与表单中输入元素(包括textarea)的name属性相同并按名称组织。

其他见解

根据我所看到的代码,您希望在到达PHP服务器端代码时将deptname数据放入deptid。您可以做的是将其分配给键deptid

$_POST['deptid'] = $_POST['deptname'];
$myassoc = $_POST;
print_r($myassoc);

1
我认为我所想的与OP想要的完全不同;POST是关联数组,但我认为OP希望键和值在POST数组内部关联。 - Jared Farrish
他想要将其与POST数组“合并”,对吗? - Netorica

3
<form method="post">
    <input type="text" name="formdata['deptid']" />
    <input type="text" name="formdata['deptname']" />
    <input type="submit" />
</form>

<?php
    if(isset($_POST['formdata']))
    {
       $deptid = $_POST['formdata']['deptid'];
       $deptname = $_POST['formdata']['deptname'];
    }
?>

1
使用适当的结构构建JS对象,使用JSON.stringify()将其转换为JSON,进行POST请求,然后执行json_decode($_POST['data'],true)
您将获得从JS对象到PHP关联数组的完全副本。删除第二个参数true以获取PHP对象。

0

$_POST 已经是一个关联数组。

你可以通过将 $_POST 赋值给一个变量来重新构建所需的形式的数组。

$myarray = $_POST;

现在 $myarray 是你需要的。执行 var_dump($myvar);

谢谢,但我不想修改服务器上的PHP脚本(options.php)。 - user1134475

-1

你为什么想要这样做呢? 但是,你可以通过这种方式发送“数组”:

<form method="post">
    <input type="text" name="textboxes[]" />
    <input type="text" name="textboxes[]" />
    <input type="submit" />
</form>

<?php
    if(isset($_POST['textboxes']))
        var_dump($_POST['textboxes']);
?>

-1
$deptid = $_POST['deptid'];
$array = array($$deptid => $_POST['deptname']);
print_r($array);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接