проблема с вставкой нескольких строк POST в таблицу базы данных с помощью json_encode () - PullRequest
0 голосов
/ 02 сентября 2011

Я использую 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: Перевести & Поиски & Электронная почта
значения для tr 2: Телефон & Чат & Бизнес
значения для 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}

UPDATE:

Если в каждом tr (1 & 2) есть несколько checkbox, а некоторые из них 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": "Translate", "объяснение": "Поиски", "tv": "Электронная почта", "checkbox":["Mootools","PowerTools"]}, {"name": "Телефон", "объяснение": "Чат" , "тв": "Бизнес", "checkbox":["Library","Framework"}]

1 Ответ

1 голос
/ 02 сентября 2011

Поскольку входные данные в ваших строках имеют общие имена, входные данные в последней строке перезаписывают значения других входных данных.Чтобы преодолеть это, вам нужно присвоить имена с помощью [] и перебрать опубликованные данные:

 <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]
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...