Вложенные поля ввода (родительская и дочерняя структура) - PullRequest
1 голос
/ 11 мая 2011

Я нахожусь в очень сложной ситуации, когда у меня есть страница, на которой можно вводить записи, и есть родительская / дочерняя структура (или записи / вложенные записи, если вы ее называете).Многие записи / подзаписи могут добавляться динамически (строки клонируются и вставляются после следующей строки), когда пользователю нужно добавить больше.

Структура :

<div class="row">
   <strong>Parent record:</strong> <input type="text" name="parent-record[]" />
   <div class="row">
       <strong>Child record:</strong> <input type="text" name="child-record[]" />
   </div>
   <span class="add-subrecord">Add another sub-record</span>
</div>
<span class="add-record">Add another record</span> 

Проблема на стороне PHP, когда у меня 2 цикла for, 1 в цикле for, например:

for($i = 0; $i < count($_POST['parent-record']); $i++)
{
    $sql = "INSERT INTO records (input) VALUES ('" . $_POST['parent-record'][$i] . "')";
    $result = $db->sql_query($sql);

    $parent_id = $db->sql_nextid(); // mysql_insert_id

    for($j = 0; $j < count($_POST['child-record']); $j++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }
}

Однако, когда процесс завершен, у каждого дочернего элемента есть родительский элемент для цикла. первая основная запись, даже когда я добавляю 2-3 основные записи (не дочерние записи), например:

+------+---------+----------+
| id   | input   | parent   |
+------+---------+----------+
| 1    | random  | 0        | <- indicates it is a parent
| 2    | random1 | 1        | <- child record, parent is record id: 1
| 3    | random2 | 1        | <- child record, parent is record id: 1
| 4    | random3 | 1        | <- this should be a parent, but it's added as a child
| 5    | random4 | 1        | <- this one too
+------+---------+----------+

Мне нужно какое-то решение, как этобудет работать при создании вложенной формы ввода, в которой все дочерние элементы имеют родительский идентификатор блока записи.

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Может быть, вы можете изменить имена для ввода формы следующим образом:

<div class="row">
  <strong>Parent record:</strong> <input type="text" name="parent-record[1]" />
  <div class="row">
    <strong>Child record:</strong> <input type="text" name="parent-record[1]child-record[]" />
  </div>
  <span class="add-subrecord">Add another sub-record</span>
</div>
<span class="add-record">Add another record</span> 

Я предполагаю, что вы используете JavaScript для добавления новых входов.Вы можете использовать имена, как указано выше, но увеличивать число.

В массиве записей PHP каждый родитель должен иметь массив дочерних записей.

1 голос
/ 11 мая 2011

Ваша проблема заключается в том, как вы перебираете записи. Вы начинаете со вставки первой родительской записи. Затем вы перебираете все дочерние записи - , включая дочерние записи, принадлежащие разным родителям. Например, возьмите следующий пользовательский ввод:

parent1
  child1a
  child1b
parent2
  child2a

Это сгенерирует следующий массив $ _POST:

$_POST['parent-record'] = array('parent1', 'parent2');
$_POST['child-record'] = array('child1a', 'child1b', 'child2a');

Итак, вы можете видеть, что после вставки parent1 в базу данных вы затем вставляете все дочерние записи, которые неправильно назначают parent1 в качестве родителя child2a.

Вам нужен способ определить, какие дети принадлежат к какому из родителей.

И ПОМНИТЕ для кодирования ввода пользователя перед его вставкой в ​​запрос SQL !!

$sql = "INSERT INTO records (input) VALUES ('" . mysql_real_escape_string($_POST['parent-record'][$i]) . "')";
0 голосов
/ 11 мая 2011

Посмотрите на последнюю часть вашего кода:

for($j = 0; $j < count($_POST['child-record']); $i++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }

Я думаю, что это должно быть:

 for($j = 0; $j < count($_POST['child-record']); $j++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }

j ++ вместо i ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...