2013-03-13 3 views
0

add another itemДобавить еще один пункт/строку в форме, вставить в БД

Эти два поля вставляются в базу данных. Однако я хочу дать пользователю возможность «Добавить другой элемент». Они должны иметь возможность, в идеале, добавить столько элементов, сколько им нравится. Когда они отправляют форму, данные будут вставлены в таблицу mysql.

Как я могу это сделать? Создание 10 дополнительных столбцов в моей базе данных для размещения дополнительных добавляемых элементов не кажется реалистичным и идеальным.

Спасибо за помощь!

Вот отрывок из моего кода, где я вставить свои данные в БД:

if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
          { 
            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 
            $stmt->close(); 
          } 
+1

Ваш код? можете ли вы опубликовать его на jsfiddle? –

+0

Создание дополнительных столбцов в вашем db? Вы, конечно, делаете что-то не так, ищете некоторые «нормализации базы данных». –

+0

@MehdiKaramosly Отредактировано мое сообщение – Alex

ответ

0

Просто используйте:

name="item[]" 

для пункт # '

и

name="description[]" 

<input type="text" name="item[]" /><input type="text" name="description[]" /> 

Для описания товара на поле и на вашей стороне сервера итерации через оба из них. в интерфейсе просто создайте скрипт, который дублирует этот узел много раз.

EDIT

Основанная в коде вы показали, это должно быть что-то похожее на код ниже:

if(isset($_POST['item']){ 
for($i = 0; $i < count($_POST['item']); $i++){ 
$number = $_POST['item'][$i]; 
$description= $_POST['description'][$i]; 
if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
          { 
            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 
            $stmt->close(); 
          } 
} 

В вашем JavaScript сделать, как показано ниже:

function addRow(){ 
    document.getELementById('container').el.innerHTML += '<input type="text" name="item[]" /><input type="text" name="description[]" />' ; 
} 

HTML код :

<form name='myform' > 

<div id="container"> 
<input type="text" name="item[]" /><input type="text" name="description[]" />  
</div> 
    <p onclick="addRow() ;" >Add another item</p> 
</form> 

Надеюсь, это поможет.

UPDATE

Попробуйте это:

if(isset($_POST['item']){ 

if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
{ 
    for($i = 0; $i < count($_POST['item']); $i++){ 
    $number = $_POST['item'][$i]; 
    $description= $_POST['description'][$i]; 

            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 

    } 
    $stmt->close(); 

} 
+0

Если у меня нет другого товара, он отлично работает. Но если я добавлю больше элементов, я получаю 'Warning: mysqli :: prepare() [mysqli.prepare]: Не удалось получить mysqli' для каждого добавленного элемента. Один элемент добавляется в базу данных, но любые дополнительные элементы НЕ являются и получают упомянутую ошибку. – Alex

+0

@Alex Попробуйте включить в UPDATE, который я только что добавил. –

+0

Отлично! Спасибо. – Alex

1

Это довольно сложным вопрос, но есть некоторые довольно простые решения. Во-первых, вам нужно будет изменить внутренний PHP-скрипт, который вы используете для обработки переменной количества элементов.

Например, прямо сейчас, вы, вероятно, что-то вроде:

$item_number = $_POST['item_number']; 
$item_description = $_POST['item_description']; 
add_item_to_db($item_number, $item_description); 

Вам нужно изменить свой код для обработки обработки массива элементов:

$item_numbers = $_POST['item_number']; 
$item_descriptions = $_POST['item_description']; 
// validate that count($item_numbers) == count($item_descriptions) 
for ($i = 0; $i < count($item_numbers); $i++) { 
    add_item_to_db($item_numbers[$i], $item_descriptions[$i]); 
} 

Там довольно немного обработки ошибок, которые вам нужно выполнить выше, что не показано. Если пользователь вводит другое число item_numbers, чем item_descriptions, вам нужно будет определить, как его обрабатывать. Кроме того, любое из полей может быть пустым. В некоторых случаях могут быть ошибки, другие - нет.

Вы должны изменить свой HTML:

<input type="text" name="item_number[]" /> 
<input type="text" name="item_description[]" /> 

Обратите внимание на [] в названии. Это задает массив значений для каждого.

Наконец, вам нужно динамически добавлять новый набор из ввода объектов на экране, когда пользователь нажимает Добавить другой пункт ссылки. Я бы рекомендовал использовать jQuery для этого. Для достижения этой цели вы могли бы сделать что-то вроде:

jQuery('<input type="text" name="item_number[]" /><input type="text" name="item_description[]" />').appendTo('#someDiv'); 

Убедитесь, что новый вход элементов добавляются внутри элемента формы. Очевидно, что осталось много кода для написания. Это всего лишь базовый пример концепций.