Объедините 2 поля ввода из списка входов в php

В двух отдельных текстовых полях есть список имен и инвестиций.

name 1    investment 1
name 2    investment 2
name 3    investment 3
name 4    investment 4
name 5    investment 5

......

у меня есть поля базы данных как user1, user2, user3... Поэтому, когда пользователь отправляет форму, я хочу сохранить ее как «имя 1, инвестиции 2…». в каждом поле.

Например: Иоанн, 1200 г.

  Peter, 200

Я могу просто объединить каждый ввод, назначив их разным переменным, но это сделает мой код очень длинным, потому что имеется около 40 элементов ввода.

Может ли кто-нибудь предложить эффективный способ добиться этого? Я использую CodeIgniter.


person LiveEn    schedule 09.11.2011    source источник
comment
Где имя 1 инвестиции 1? Это названия полей ввода HTML на вашей странице?   -  person Dan    schedule 09.11.2011
comment
да, каждое входное имя именуется как имя1,имя2,имя3... а входные данные об инвестициях сохраняются как инвестиции1, инвестиции2, инвестиции3...   -  person LiveEn    schedule 09.11.2011


Ответы (2)


Если я правильно понимаю, ваш интерфейс выглядит так:

<form action="action.php" method=POST>
  <input type="text" name="name1">
  <input type="text" name="investment1">
  <BR />

  <input type="text" name="name2">
  <input type="text" name="investment2">
  <BR />

  ...
</form>

И вам нужен простой способ прочитать все поля. Если да, то предлагаю следующее:

$i = 1;
while (isset($_POST['name'.$i]) AND isset($_POST['investment'.$i]))
{
    ${'user'.$i} = $_POST['name'.$i] . ', ' . $_POST['investment'.$i];
    $i = $i + 1;
}

В результате вы получите набор переменных с именами $user1, $user2, $user3..., которые затем можно использовать в стандартном операторе INSERT.

Однако ваша база данных, вероятно, нуждается в серьезной переработке.

ОБНОВЛЕНИЕ: дизайн не нормализован, и вы пытаетесь сохранить два разных типа данных в одном поле.

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

CREATE TABLE investments {
    investment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    investor VARCHAR,
    amount FLOAT
};

Обычно вы делаете один INSERT для каждой строки на вашей странице:

INSERT INTO investments (investor, amount) 
VALUES ('Peter', 200.00);

Если вы как-то сгруппируете свои инвестиции, скажем, по страницам или продуктам, то дизайн будет выглядеть примерно так:

CREATE TABLE pages {
    page_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
};

CREATE TABLE investments {
    investment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    page_id INT REFERENCES pages(page_id),
    investor VARCHAR,
    amount FLOAT
};

Это означает, что вы создаете новую страницу для каждого набора инвестиций. Еще лучше было бы что-то вроде этого:

CREATE TABLE pages {
    page_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR
};

CREATE TABLE investors {
    investor_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR
};

CREATE TABLE investments {
    page_id INT REFERENCES pages(page_id),
    investor_id INT REFERENCES investor(investor_id),
    amount FLOAT,
    PRIMARY KEY (page_id, investor_id)
};

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

Вот несколько ссылок, которые могут помочь:

person Gustav Bertram    schedule 09.11.2011
comment
Я согласен, когда вы говорите, что база данных, вероятно, нуждается в серьезной переработке. - person Salman A; 09.11.2011
comment
Я немного новичок в php и sql, если возможно, не могли бы вы привести небольшой пример, каким будет эффективный дизайн базы данных? - person LiveEn; 09.11.2011
comment
Добавлено к моему ответу. Надеюсь, поможет. - person Gustav Bertram; 09.11.2011
comment
Большое спасибо... Есть идея! :) - person LiveEn; 18.11.2011

Если вы назовете свои входы так: <input name="name[]" type="text">, вы должны получить массив в php, который вы можете перебирать

$result = array();
foreach($_POST['name'] as $i => $name) {
  if (isset($_POST['investment'][$i]) {
    $result[] = $name . ', ' . $_POST['investment'][$i];
  }
}
person Dennis C    schedule 09.11.2011