通过PHP从HTML表单插入数据库的多个选项

时间:2016-03-06 16:55:33

标签: javascript php jquery html mysql

我有下拉列表,选择任何值后它添加了一些字段的新行,示例如下图所示:

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>
您可以在JS FIDDLE

查看

Javascript 代码

我创建了JS FIDDLE来检查表单的那一部分。你有想法如何解决它吗?

8 个答案:

答案 0 :(得分:6)

您需要使用此格式创建表单

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

当您使用此格式提交表单时,您将在insert.php中的$_POST['CertificateType']中收到数字键阵列

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);
}
} 

答案 1 :(得分:5)

使用您的小提琴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);
  }
}     

:)

答案 2 :(得分:3)

看,我发现的是:

  1. 首先,将CertificateType[]替换为CertificateType中的<select id='options' name="CertificateType[]" class="field-style div-format align-left"> 因为,这个下拉列表不是多个。根据{{​​1}}功能,您只需onchangeSTCWCodeCertNo&amp; FromCert个值,它们是多个(非ToCert下拉列表)。 您可以做的是:您可以附加一个CertificateTypehidden text,其中将插入CertificateTypeHidden[]下拉列表的值。

  2. 正如我在Ist Point指出的那样。 CertificateType不是多重的。所以,它只考虑一个值。您可以做的是:如上所述,您可以使用CertificateType而不是CertificateType而不是CertificateTypeHidden[]

  3. 更改后,代码应该是这样的。 (如果你遵循以上几点)

    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[]'>属性中。在提交页面或 insert.php 页面中,使用value执行foreach

    通过它。一切顺利。

答案 3 :(得分:2)

你循环遍历$ _POST ['CertificateType'],(你的配置)只包含一个值(在选择字段上没有多选)

答案 4 :(得分:2)

你正在使用整个错误的循环。相反,您需要运行循环,例如STCWCode POST变量。

但我建议您更改javascript代码,并将输入名称设为row[0][STCWCode], row[0][CertNo],依此类推,row[0]为第一行,row[1]为第二行等等。然后,您可以使用$_POST['row']

运行循环

答案 5 :(得分:2)

您需要为证书选择值创建一个隐藏输入,下拉列表仅用于创建新行但您需要使用Array表单创建新输入,可能更改下拉列表名称,例如CertificateType [] =&gt; CertificateTypeList和带有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>

答案 6 :(得分:1)

我还没看过所有的东西,但你的输入字段似乎在小提琴中都有相同的名字。

所有行的第一个输入似乎是“name =”STCWCode []“。你看过你的$ _POST并验证你可以看到你的所有输入或者是否只有第一行的输入?我认为名字可能是一个问题。

答案 7 :(得分:1)

您正尝试在单个代码中插入整个数组。首先考虑一下。然后从数组中获取内容并使用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
 }

`