通过json_encode()在数据库表中插入多个字符串POST的问题

时间:2011-09-02 10:35:10

标签: php codeigniter json

我使用jQuery添加新输入。表中的每一行都包含几个输入,我想将数据作为数组添加到数据库中:

<table>
tr 1: <tr>
<input name="name" value="Translate">
<input name="explanation" value="Searches">
<input name="tv" value="Email">
</tr>
<br>
tr 2: <tr>
<input name="name" value="Phone">
<input name="explanation" value="Chat">
<input name="tv" value="Business">
</tr>
tr 3: <tr>
<input name="user" value="jimi">
</tr>
</table>

DEMO

tr 1的值为:翻译&amp; 搜索&amp; 电子邮件
tr 2的值为:电话&amp; 聊天&amp; 商家
tr 3的值是: jimi

我在json_encode()tr 1上使用tr 2对数据进行编码并将其一起插入数据库。 tr 3不在该数组中,它是单独的值:

$data = array(
    'units' => json_encode(
                 array(
                 'name' => $this -> input -> post('name'),
                 'explanation' => $this -> input -> post('explanation'),
                 'tv' => $this -> input -> post('tv')
                )
    ),
    'user' => $this -> input -> post('user')
);
$this -> db -> insert('hotel_submits', $data);

这里的问题是只有值“tr 2”插入到数据库中 我希望将值(tr 1和tr 2)一起插入数据库中。

我在数据库中:

{"name":Phone,"explanation":Chat,"tv":Business}

我想要这个

{"name":Translate,"explanation":Searches,"tv":Email, "name":Phone,"explanation":Chat,"tv":Business}

更新

如果每个checkbox中有多个tr (1 & 2),其中一些checked,则如何在数据库中插入(它们),如下所示:

DEMO

<table>
 tr 1:
<tr>
    <input name="name" value="Translate">
    <input name="explanation" value="Searches">
    <input name="tv" value="Email">
    <input type="checkbox" name="checkbox[]" value="Mootools" checked> 
    <input type="checkbox" name="checkbox[]" value="PowerTools" checked>
    <input type="checkbox" name="checkbox[]" value="Read">
</tr>


 tr 2:
<tr>
    <input name="name" value="Phone">
    <input name="explanation" value="Chat">
    <input name="tv" value="Business">
    <input type="checkbox" name="checkbox[]" value="Clientcide"> 
    <input type="checkbox" name="checkbox[]" value="Library" checked> 
    <input type="checkbox" name="checkbox[]" value="Framework" checked>
</tr>


 tr 3:
<tr>
    <input name="user" value="jimi">
</tr>
</table>

我想要数据库:

  

[{“name”:“翻译”,“解释”:“搜索”,“电视”:“电子邮件”,"checkbox":["Mootools","PowerTools"]},{“姓名”:“电话”,“解释”:“聊天“,”电视“:”商家“,"checkbox":["Library","Framework"}]

1 个答案:

答案 0 :(得分:1)

由于行中的输入共享其名称,因此最后一行中的输入会重写其他输入的值。要解决此问题,您需要使用[]指定名称并迭代发布的数据:

 <table>
tr 1: <tr>
<input name="name[]" value="Translate">
<input name="explanation[]" value="Searches">
<input name="tv[]" value="Email">
</tr>
<br>
tr 2: <tr>
<input name="name[]" value="Phone">
<input name="explanation[]" value="Chat">
<input name="tv[]" value="Business">
</tr>
tr 3: <tr>
<input name="user" value="jimi">
</tr>
</table>

$units = array();
$names = $this->input->post('name');
$explanations= $this->input->post('explanation');
$tvs= $this->input->post('tv');
//this works ONLY if you have equal number of names, explanations and tvs
foreach ($names as $idx=>$name){
    $units[] = array(
        'name'=>$name, 
        'explanation'=>$explanations[$idx],
        'tv'=>$tvs[$idx]
    );
}

$data = array('units'=>json_encode($units), 'user'=>$this -> input -> post('user'));
$this -> db -> insert('hotel_submits', $data);

这段代码并不理想,但应该有效,所以这是一个很好的起点。此外,您无法拥有json_encode所需的内容,因此它看起来像

[{name:..., explanation:..., tv:...},{name:..., explanation:..., tv:...}]

事实上你可以,但是你很难生成和解析它。

更新,这很难。我们的想法是明确地为您的输入分配索引,即

tr1:name[0], explanation[0], tv[0], checkbox[0][],checkbox[0][],checkbox[0][]         
tr2:name[1], explanation[1], tv[1], checkbox[1][],checkbox[1][],checkbox[1][]

循环变为

$checkboxes= $this->input->post('checkboxes');
foreach ($names as $idx=>$name){
    $units[] = array(
        'name'=>$name, 
        'explanation'=>$explanations[$idx],
        'tv'=>$tvs[$idx],
        'checkboxes'=>$checkboxes[$idx]
    );
}