Вставка в базу данных нескольких параметров из HTML-формы через PHP


У меня есть раскрывающийся список, после выбора любого значения он добавляет новую строку с некоторыми полями, пример показан на рисунке ниже:

drop-down list

У меня есть insert.php для вставки значений в базу данных MySQL. Но есть проблема, что в базу данных вставляются только значения из первой строки.

PHP выглядит так:

foreach($_POST['CertificateType'] as $key => $val){ 

    $CertificateType = $val;

    $CertificateType = $_POST['CertificateType'][$key]; 
    $STCWCode        = $_POST['STCWCode'][$key];            
    $CertNo          = $_POST['CertNo'][$key];          
    $FromCert        = $_POST['FromCert'][$key];            
    $ToCert          = $_POST['ToCert'][$key];  

    $CertificateType = mysqli_real_escape_string($link, $CertificateType);  
    $STCWCode        = mysqli_real_escape_string($link, $STCWCode);                 
    $CertNo          = mysqli_real_escape_string($link, $CertNo);           
    $FromCert        = mysqli_real_escape_string($link, $FromCert);                 
    $ToCert          = mysqli_real_escape_string($link, $ToCert);      

    $sql3 = "INSERT INTO Tbl (
        CertificateType     
        ,UserId    
        ,STCWCode               
        ,CertNo                 
        ,FromCert               
        ,ToCert
        ,DateCreated
    ) VALUES (
        '$CertificateType',
        '$UserID',  
        '$STCWCode',            
        '$CertNo',          
        '$FromCert',            
        '$ToCert',
        now())";
    if(mysqli_query($link, $sql3)){
        echo "Resume created successfully.";
    } else{
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    }
} 

HTML выглядит так:

<fieldset class="fieldset-borders">
    <legend>4. Licenses & Certificates</legend>
    <ul class="header"> 
      <li>
        <select id='options' name="CertificateType[]" class="field-style div-format align-left">
          <option selected disabled value="0">Select certificates</option>
          <option value="1">One</option>
          <option value="2">Two</option>
          <option value="3">Three</option>  
        </select>  
      </li>
    </ul>  
    <ul class="cert" id="cert">     
      <li>
        <ul class="column">         
          <li><p class="test-label11">Name</p></li>                     
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">STCW Code</p></li>                        
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Cert. No</p></li>                     
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Place of Issue</p></li>                       
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Date of Issue</p></li>                        
        </ul>
      </li>
      <li>
        <ul class="column">         
          <li><p class="test-label11">Date of Expire</p></li>                       
        </ul>
      </li>
      </ul>
        <div class="action2" ></div>


</fieldset>

Код Javascript, который вы можете проверить на JS СКРИПКА

Я создал JS СКРИПКА чтобы проверить эту часть формы. У вас есть идеи, как это исправить?

Author: Infinity, 2016-03-06

8 answers

Используйте свой скрипичный JavaScript и добавьте тип сертификата в скрытое поле для каждой строки; и назовите его RowCertificateType так же, как и другие поля для строки;

<input type="hidden" name="RowCertificateType[]" value="" />
<!-- set value of this field same as you are showing in li as label for this row; -->

Затем в вашем php-скрипте используйте следующее:

foreach($_POST['RowCertificateType'] as $key=> $val){

  $CertificateType = $val;

  $STCWCode = $_POST['STCWCode'][$key];
  $CertNo = $_POST['CertNo'][$key];
  $FromCert = $_POST['FromCert'][$key];
  $ToCert = $_POST['ToCert'][$key];

  $CertificateType = mysqli_real_escape_string($link, $CertificateType);
  $STCWCode = mysqli_real_escape_string($link, $STCWCode);
  $CertNo = mysqli_real_escape_string($link, $CertNo);
  $FromCert = mysqli_real_escape_string($link, $FromCert);
  $ToCert = mysqli_real_escape_string($link, $ToCert);

  $sql3 = "INSERT INTO Tbl (
        CertificateType     
        ,UserId    
        ,STCWCode               
        ,CertNo                 
        ,FromCert               
        ,ToCert
        ,DateCreated
    ) VALUES (
        '$CertificateType',
        '$UserID',  
        '$STCWCode',            
        '$CertNo',          
        '$FromCert',            
        '$ToCert',
        now())";
  if(mysqli_query($link, $sql3)){
    echo "Resume created successfully.";
  }else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
  }
}     

:)

 5
Author: itzmukeshy7, 2016-03-18 13:28:39

Вам необходимо создать формы в этом формате

<form action="insert.php" method="post">  
<ul>
    <li>
        <input name="CertificateType[0]" type="hidden">
        <input name="CertificateType[0]['STCWCode']" type="text">
        <input name="CertificateType[0]['CertNo']" type="text">
        <input name="CertificateType[0]['PlaceofIssueCert']" type="text">
        <input name="CertificateType[0]['FromCert']" type="date">
        <input name="CertificateType[0]['ToCert']" type="date">
    </li>
    <li>
        <input name="CertificateType[1]" type="hidden">
        <input name="CertificateType[1]['STCWCode']" type="text">
        <input name="CertificateType[1]['CertNo']" type="text">
        <input name="CertificateType[1]['PlaceofIssueCert']" type="text">
        <input name="CertificateType[1]['FromCert']" type="date">
        <input name="CertificateType[1]['ToCert']" type="date">
    </li>
    ...
</ul>
</form>

При отправке формы в этом формате вы получите Массив числовых ключей в $_POST['CertificateType'] в insert.php

array(
  "0" => array(
           "STCWCode" => "somevalue",
           "CertNo" => "somevalue",
           "PlaceofIssueCert" => "somevalue",
           "FromCert" => "somevalue",
           "ToCert" => "somevalue",  
         ),
  "1" => array(
           "STCWCode" => "somevalue",
           "CertNo" => "somevalue",
           "PlaceofIssueCert" => "somevalue",
           "FromCert" => "somevalue",
           "ToCert" => "somevalue",  
         ),
   . . .
)

Здесь каждый индекс будет представлять одну строку.Это может быть восстановлено с помощью цикла foreach, как показано ниже:

Обновите свой php-код как

foreach($_POST['CertificateType'] as $val){ 

$CertificateType = $val;

$CertificateType = $val; 
$STCWCode        = $val['STCWCode'];            
$CertNo          = $val['CertNo'];          
$FromCert        = $val['FromCert'];            
$ToCert          = $val['ToCert'];  

$CertificateType = mysqli_real_escape_string($link, $CertificateType);  
$STCWCode        = mysqli_real_escape_string($link, $STCWCode);                 
$CertNo          = mysqli_real_escape_string($link, $CertNo);           
$FromCert        = mysqli_real_escape_string($link, $FromCert);                 
$ToCert          = mysqli_real_escape_string($link, $ToCert);      

$sql3 = "INSERT INTO Tbl (
    CertificateType     
    ,UserId    
    ,STCWCode               
    ,CertNo                 
    ,FromCert               
    ,ToCert
    ,DateCreated
) VALUES (
    '$CertificateType',
    '$UserID',  
    '$STCWCode',            
    '$CertNo',          
    '$FromCert',            
    '$ToCert',
    now())";
if(mysqli_query($link, $sql3)){
    echo "Resume created successfully.";
} else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
} 
 6
Author: Hiren patel, 2016-03-17 17:35:56

Видите, что я нашел:

  1. Во-первых, замените CertificateType[] на CertificateType в <select id='options' name="CertificateType[]" class="field-style div-format align-left"> Потому что этот выпадающий список не является множественным. Основываясь только на функциональности onchange, вы получаете STCWCode, CertNo, FromCert & ToCert значения, которые являются множественными (не раскрывающийся список CertificateType). Что вы можете сделать, так это: вы можете добавить один hidden text, а именно CertificateTypeHidden[], в который будет вставлено значение выпадающего списка CertificateType.

  2. Как я указал в Первом пункте. CertificateType не является множественным. Итак, он рассматривает только одно значение. Что вы можете сделать: Как я писал выше, вместо CertificateType вы можете использовать CertificateTypeHidden[], например foreach($_POST['CertificateTypeHidden'] as $key => $val){.

После изменений код должен выглядеть следующим образом. (Если вы будете следовать вышеуказанным пунктам)

<?php
foreach($_POST['CertificateTypeHidden'] as $key => $val){ 
  $CertificateType = $_POST['CertificateTypeHidden'][$key]; 
  $STCWCode        = $_POST['STCWCode'][$key];  
  $CertNo          = $_POST['CertNo'][$key];   
  $FromCert        = $_POST['FromCert'][$key];   
  $ToCert          = $_POST['ToCert'][$key];  
    .
    .
    .
}
?>

Для моей цели тестирования . Я удалил foreach($_POST['CertificateType'] as $key => $val){ с помощью foreach($_POST['STCWCode'] as $key => $val){. Все добавленные значения нескольких текстовых полей поступают правильно.

<?php
foreach($_POST['STCWCode'] as $key => $val){ 
  $CertificateType = $_POST['CertificateTypeHidden'][$key]; 
  $STCWCode        = $_POST['STCWCode'][$key];  
  $CertNo          = $_POST['CertNo'][$key];   
  $FromCert        = $_POST['FromCert'][$key];   
  $ToCert          = $_POST['ToCert'][$key];  
    .
    .
    .
}
?>

Это единственная проблема. Все хорошо. Просто добавьте одно скрытое поле. (<input type='hidden' name='CertificateTypeHidden[]'>). В котором значения выбранного выпадающего списка приходят и сидят в value атрибут этого скрытого поля. На странице отправки или insert.php страница, выполните foreach с помощью CertificateTypeHidden.

Пройдите через это. Всего наилучшего.

 3
Author: Nana Partykar, 2016-03-10 15:54:45

Вы зацикливаетесь на $_POST['Тип сертификата'], который (с вашей конфигурацией) будет содержать только одно значение (без множественного выбора в поле выбора)

 2
Author: Christian Weber, 2016-03-10 14:38:30

Вы используете весь неправильный цикл. Вместо этого вам нужно запустить цикл, например, STCWCode переменная POST.

Но все же я бы посоветовал вам изменить код javascript и сделать имена ввода такими, как это row[0][STCWCode], row[0][CertNo] и так далее, где row[0] для первой строки и row[1] будет для второй строки и так далее. Затем вы можете запустить цикл с $_POST['row']

 2
Author: Rohit Awasthi, 2016-03-10 15:02:14

Вам нужно создать скрытый ввод с выбранным значением для сертификата, раскрывающийся список предназначен только для создания новой строки, но вам нужно создать новый ввод с формой массива, возможно, изменить имя раскрывающегося списка, например, certificatetype[]=>Список типов сертификатов и новое скрытое имя ввода с типом сертификата[]

UL не отправляется с формами только типов ввода.

<select id='options' name="CertificateList">
  <option selected disabled value="0">Select certificates</option>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>  
</select>

Создайте тег формы только один раз и входные данные для каждого повторения

<form action="insert.php" method="post">  
<ul>
    <li>
        <input name="CertificateType[]" type="hidden">
        <input name="STCWCode[]" type="text">
        <input name="CertNo[]" type="text">
        <input name="PlaceofIssueCert[]" type="text">
        <input name="FromCert[]" type="date">
        <input name="ToCert[]" type="date">
    </li>
    <li>
        <input name="CertificateType[]" type="hidden">
        <input name="STCWCode[]" type="text">
        <input name="CertNo[]" type="text">
        <input name="PlaceofIssueCert[]" type="text">
        <input name="FromCert[]" type="date">
        <input name="ToCert[]" type="date">
    </li>
    ...
</ul>
</form>
 2
Author: Mauricio Florez, 2016-03-12 21:11:00

Я еще не все просмотрел, но все ваши поля ввода, похоже, имеют одно и то же имя в скрипке.

Первый ввод всех строк, по-видимому, "name="STCWCODE[]". Вы посмотрели на свой $_POST и убедились, что можете видеть весь свой ввод или есть только ввод из первой строки? Я думаю, что имена могут быть проблемой.

 1
Author: drittponken, 2016-03-06 17:07:12

Вы пытаетесь вставить весь массив в один код. Сначала сосчитайте. А затем извлеките содержимое из массива и с помощью цикла for вставьте его в базу данных, например, если мое имя для текстового поля cellname[]

Затем для вставки это должно быть сделано

 $itemCount = count($_POST['cellname']);
 $info=$_POST['cellname'];
 for($i=0;$i<$itemCount;$i++) {
   $query = "INSERT INTO item (item_name) VALUES('$info[$i]') ";
  //rest of the queries
 }

`

 1
Author: Remya R, 2016-03-17 12:32:52