Q:

Цикл обработки полей формы и добавления записи в БД

Привет! Помогите решить задачу. Как я понимаю, она достаточно простая, но я только пытаюсь разобраться с PHP.
Суть вопроса/задачи: у меня есть поля ввода в форме, которых, в зависимости от условий, может быть до 30. И они могут быть не все заполнены (т.е. 1-12, 14,15 с записями 13, 16 без, потом опять с записями и т.д.).
Каждое поле я обрабатываю следующим образом:
// если заполнена первая кнопка
if ($_POST['BT1_pair']) {       
    if ( $_POST['distribution_board'] == 'ШР') $_POST['BT1_distribution'] = 'Р'.$_POST['BT1_distribution'];
    else if ( $_POST['distribution_board'] == 'MJ21V00' || $_POST['distribution_board'] == 'MJ22V00' || $_POST['distribution_board'] = 'MJ23V00' ) {
         $_POST['BT1_distribution'] = 'ПК'.$_POST['BT1_distribution'];  } 
    // добавляем к индексу №
    $_POST['distribution_board'] = $_POST['block'].''.$_POST['distribution_board'];
    //$_POST['code_connections'] = $_POST['btn_two_index'].'.'.$_POST['btn_two'].':'.$_POST['btn_one_index'].'.'.$_POST['btn_one'];
    // формируем шифр       
    $_POST['code_btn'] = $_POST['distribution_board'].'.'.$_POST['BT1_distribution'].'.'.$_POST['BT1_pair'];
    //делаем запись в базу
    mysqli_query($CONNECT, "INSERT INTO `GGS_btn` 
        VALUES ('', '$_POST[index]', '1', '$_POST[distribution_board]', '$_POST[BT1_distribution]', '$_POST[BT1_pair]', '$_POST[code_btn]' )"); 
}

Пока написал только для одной кнопки, но понимаю, что можно сделать цикл и к BT (BT1) увеличивать число до 30 и таким образом обработать все поля. Но пока не смог это реализовать, не хватает знаний...
Буду крайне признателен за помощь в реализации задачи!

A:

Никогда не подставляйте значения переменных непосредственно в текст запроса. Надо использовать привязку переменных. Кроме того более эффективно подготовить запрос один раз и потом его вызывать несколько раз внутри цикла. Таким образом мы избегаем стадии компиляции каждого запроса в БД.
С учетом сказанного может выглядеть как то так:
// Подготавливаем запрос. Вместо переменных ставим знаки "?"
$stmt = mysqli_prepare($CONNECT, "INSERT INTO `GGS_btn` VALUES ('', ?, ?, ?, ?, ?, ?)");
if(! $stmt) { обработка ошибки создания запроса }

// Привязываем переменные (в порядке следования "?" в запросе)
// Буквы в первой строке - типы параметров 's'-строка, 'i' - integer
$stmt->bind_param("sissss",$_POST['index'], $i, $dboard, $dist, $pair, $cbtn);

// Заполняем фиксированные параметры
$dboard = $_POST['block'].''.$_POST['distribution_board'];

for($i=1; $i<=30; $i++) {
  if ($_POST['BT'.$i.'_pair']) {       
    if ( $_POST['distribution_board'] == 'ШР') $dist = 'Р'.$_POST['BT'.$i.'_distribution'];
    else if ( $_POST['distribution_board'] == 'MJ21V00' || $_POST['distribution_board'] == 'MJ22V00' || $_POST['distribution_board'] = 'MJ23V00' ) {
         $dist = 'ПК'.$_POST['BT'.$i.'_distribution'];  } 
    else { $dist=$_POST['BT'.$i.'_distribution']; }
    // формируем шифр       
    $cbtn = $_POST['distribution_board'].'.'.$_POST['BT'.$i.'_distribution'].'.'.$_POST['BT'.$i.'_pair'];

    $pair = $_POST['BT'.$i.'_pair'];
    // Выполняем запрос.
    // Будут использованы текущие значения из переменных, привязанных перед циклом.
    if( ! $stmt->execute() ) { обработка ошибки вставки }
  }
}
$stmt->close();

Так же очень рекомендую всегда перечислять имена столбцов в предложениях INSERT INTO GGS_btn(col1, col2, ...) VALUES(..). Во первых вы сразу в коде видите какую переменную в какую колонку вы реально вставляете. Не надо сверятся с структурой таблицы каждый раз читая код. Во вторых, при изменениях структуры таблицы, у вас не будут появляться сложно вылавливаемые ошибки по всему приложению.
А что касается полей формы, лучше называйте их вроде <input ... name='BT_pair[1]'>, тогда в коде можно будет использовать гораздо легче читаемое $_POST['BT_pair'][1].

