【问题标题】:Insert to database multiple options from HTML form via PHP通过 PHP 从 HTML 表单向数据库插入多个选项
【发布时间】:2016-06-20 04:09:46
【问题描述】:

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

我有 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 FIDDLE

查看

我创建了JS FIDDLE 来检查表单的该部分。你知道如何解决它吗?

【问题讨论】:

  • 您收到一些错误信息吗?您是否有一个具有自动递增 ID 的表?
  • @Jan 不,没有任何错误,只插入第一行值。是的,有 ID - 自动递增。
  • 添加到 PHP 脚本 (error_log("Running");) 并检查 apache 错误日志文件以查看您在日志中看到 (Running) 的次数
  • @Tasos 我尝试使用error_log("Running");,但没有任何反应(没有打印)
  • 你正在运行什么操作系统,例如 linux、windows 等?

标签: javascript php jquery html mysql


【解决方案1】:

你需要用这种格式创建表单

<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>

当您以这种格式提交表单时,您将收到 数字键数组 in $_POST['CertificateType'] in 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);
}
} 

【讨论】:

  • 这是技术代码方面的最佳答案,但您应该解释为什么他们应该将其更改为我理解 OP 可能不会的格式。
  • 谢谢@MartinBarker。我会尝试在编辑中解释。
  • @Hirenpatel 感谢您的回答,但可能会添加 100 行或更多行,所以我需要重复它 &lt;input name="CertificateType[0]" type="hidden"&gt;&lt;input name="CertificateType[1]" type="hidden"&gt; 最多 100 次?如果用户添加 101 行会发生什么?它会崩溃......没有任何动态方法可以实现它还是我误解了什么?
  • 您需要使用您正在使用的 jquery 代码创建这种类型的表单。您不需要手动创建每个&lt;input name="CertificateType[0]" type="hidden"&gt;。您可以修改您的 jquery 以生成这种格式的表单。如果添加 100 行,在服务器端,您将获得一个包含 100 行的数组(索引从 0 到 99)。您可以使用 foreach 循环遍历它。因为这里将是数字键数组,所以它可以很容易地循环。你怎么能说,它会崩溃? @无限
  • 在问题本身中,您的方法是在 post 请求中获取多个 CertificateType。使用您的方法,您的 foreach 循环遍历的次数,它将命中数据库。我建议不要在 forloop 中使用插入查询。代替 , 使用 PDO w3schools.com/php/php_mysql_insert_multiple.asp
【解决方案2】:

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

:)

【讨论】:

  • 感谢您的回答,但由于我知识贫乏,我无法理解在 HTML 方面到底应该做什么,请您提供更多信息吗?跨度>
  • jsfiddle with js changes 还有什么?
  • 不太明白怎么做,但它确实有效!非常感谢!
  • @Infinity 请告诉我你不明白的地方。
【解决方案3】:

看,我发现的是:

  1. 首先,将&lt;select id='options' name="CertificateType[]" class="field-style div-format align-left"&gt; 中的CertificateType[] 替换为CertificateType 因为,这个下拉列表不是多个。基于onchange 功能,只有你得到STCWCodeCertNoFromCertToCert 值,它们是多个(不是CertificateType 下拉列表)。 你可以做的是:你可以附加一个hidden text,即CertificateTypeHidden[]CertificateType下拉列表的值将被插入。

  2. 正如我在 Ist Point 中指出的那样。 CertificateType 不是多个。所以,它只考虑一个值。你可以做的是:正如我上面写的,你可以使用CertificateTypeHidden[],而不是CertificateType,比如foreach($_POST['CertificateTypeHidden'] as $key =&gt; $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['STCWCode'] as $key =&gt; $val){ 删除了foreach($_POST['CertificateType'] as $key =&gt; $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];  
    .
    .
    .
}
?>

这是唯一的问题。一切安好。只需附加一个隐藏字段。 (&lt;input type='hidden' name='CertificateTypeHidden[]'&gt;)。所选下拉列表的哪些值位于此隐藏字段的value 属性中。在提交页面或 insert.php 页面中,使用 CertificateTypeHidden 执行 foreach

通过它。一切顺利。

【讨论】:

  • 谢谢你的回答,看起来很详细,但我仍然无法在 HTML 端正确实现,你能告诉我 HTML 端应该是什么样子吗?
  • 看,坦率地说。我在我的系统中尝试了您的代码,并且我实际上是在尝试为证书类型添加另一个文本框。但是,我无法理解您最终提供的 jsfiddle 代码。因为,这段代码是你的,所以对你来说很容易。冷静点,照我说的做。只要您选择 CertificateType 下拉菜单。新行带有文本框。因此,您只需要添加一个隐藏字段,即CertificateTypeHidden,该选定的下拉值将出现并坐下。而且,没有什么可做的了。之后,我的代码将起作用。我百分百确定。 如有任何疑问,请随时询问 @Inf
【解决方案4】:

您循环访问 $_POST['CertificateType'],它(使用您的配置)将只包含一个值(选择字段上没有多选)

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      您需要为证书创建一个带有选定值的隐藏输入,下拉列表仅用于创建新行,但您需要使用数组形式创建一个新输入,可以更改下拉名称,例如 CertificateType[] => 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>
      

      【讨论】:

        【解决方案7】:

        我还没有查看所有内容,但是您的输入字段在小提琴中似乎都具有相同的名称。

        所有行的第一个输入似乎是“name="STCWCode[]”。您是否查看了您的 $_POST 并确认您可以看到您的所有输入,或者是否只有第一行的输入?我认为名称可能是个问题。

        【讨论】:

        • 我不认为这是名称的问题,这里是使用的数组,据我所知它应该可以工作......
        【解决方案8】:

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

        `

        【讨论】:

          猜你喜欢
          • 2018-07-30
          • 1970-01-01
          • 2015-01-19
          • 2014-04-18
          • 1970-01-01
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多