Php 不带复选框更新多个记录

Php 不带复选框更新多个记录,php,html,Php,Html,我需要在提交表单时将多个记录更新到数据库中。表单字段重复显示所有值,但代码似乎什么也没做。当有人点击提交时,对于隐藏字段中显示的每个数据ID,应更新进度和上次修改日期字段。我在谷歌上搜索过,似乎到处都找不到答案。任何帮助都将不胜感激。谢谢 以下是更新代码: if(isset($_POST['dataID'])){ foreach($_POST['dataID'] as $updateid){ $progress = $_POST['progress_'.$updateid

我需要在提交表单时将多个记录更新到数据库中。表单字段重复显示所有值,但代码似乎什么也没做。当有人点击提交时,对于隐藏字段中显示的每个数据ID,应更新进度和上次修改日期字段。我在谷歌上搜索过,似乎到处都找不到答案。任何帮助都将不胜感激。谢谢

以下是更新代码:

  if(isset($_POST['dataID'])){
    foreach($_POST['dataID'] as $updateid){
      $progress = $_POST['progress_'.$updateid];
      $last_modified_date = $_POST['last_modified_date_'.$updateid];
         $updateUser = "UPDATE data SET 
                      progress='".$progress."',last_modified_date='".$last_modified_date."' 
                      WHERE dataID=".$updateid;
         mysqli_query($sdpc_i,$updateUser);
      }
  }

}
?><form method="post" name="form1" enctype="multipart/form-data">
<select title="progress" name="progress[]" id="progress" class="form-control form-control-sm-3">
                  <option selected value="">Select One</option>
                  <option value="Contract Sent">Contract Sent</option>
                  <option value="Approved">Approved</option>
                  <option value="With Legal">With Legal</option>
                  <option value="Declined">Declined</option>
                  <option value="Vendor Unresponsive">Vendor Unresponsive</option>
                  <option value="Approved/No Data Collected">Approved/No Data Collected</option>
                </select>
 <?php
while(!$district_results_private->atEnd()) {
?>
              <input name="dataID[]" type="text" id="dataID" value="<?php echo($district_results_private->getColumnVal("dataID")); ?>" />
              <?php
  $district_results_private->moveNext();
}
$district_results_private->moveFirst(); //return RS to first record
?>
<input name="last_modified_date[]" type="hidden" id="last_modified_date" value="<?php echo date('Y-m-d'); ?>" />
 <input type="image" src="images/save.png" name="submit" id="submit" alt="Save" />
        </form>

--------------------------------------------
UPDATE:

Thank you so much for your help! I did what you said and I am still getting these errors. 

Notice: Undefined index: progress in /var/www/html/progress_workflow_multiple3.php on line 97

Notice: Undefined index: dataID in /var/www/html/progress_workflow_multiple3.php on line 98

Warning: Invalid argument supplied for foreach() in /var/www/html/progress_workflow_multiple3.php on line 98


Here is the code I have: 

<?php
$stmt = mysqli_stmt_init($sdpc_i);
mysqli_stmt_prepare($stmt, "UPDATE data SET progress = ?, last_modified_date = CURDATE() WHERE dataID = ?");
mysqli_stmt_bind_param($stmt, 'si', $progress, $dataID);
$progress = $_POST['progress'];
foreach ($_POST['dataID'] as $dataID) {
    mysqli_stmt_execute($stmt);
}
?> 


Here is the form code: 

<label for="progress"></label>
              <span class="small_links">
                <select title="progress" name="progress" id="progress" class="form-control form-control-sm-3">
                  <option value="">Select One</option>
    <option>Contract Sent</option>
    <option>Approved</option>
    <option>With Legal</option>
    <option>Declined</option>
    <option>Vendor Unresponsive</option>
    <option>Approved/No Data Collected</option>
                </select>
              </span>
            <div id="div1"></div>
            <div id="div2"></div>
            <div id="div3"></div>
            <?php
while(!$district_results_private->atEnd()) {
    ?>
    <input name="dataID[]" type="text" value="<?php echo $district_results_private->getColumnVal("dataID"); ?>" />
    <?php
    $district_results_private->moveNext();
}
$district_results_private->moveFirst(); //return RS to first record
?>
            </p>
          </div>
        </div>
        <p>&nbsp;</p>
        <p>
          <input type="image" src="images/save.png" name="submit" id="submit" alt="Save" />
        </form>

您的表单有3个基本部分,不包括提交课程,供用户进行交互:

…进展领域 …dataId字段这可能会出现多次 …lastMod字段 progress字段只出现一次,因此将其数据结构化为数组没有任何好处。此外,选择字段将默认为其第一个选项,因此不需要在第一个选项上选择。此外,当选项的值与选项的文本完全相同时,可以安全地忽略value属性

<select title="progress" name="progress" class="form-control form-control-sm-3">
    <option value="">Select One</option>
    <option>Contract Sent</option>
    <option>Approved</option>
    <option>With Legal</option>
    <option>Declined</option>
    <option>Vendor Unresponsive</option>
    <option>Approved/No Data Collected</option>
</select>
lastMod字段可以从文档中完全省略。您总是在提交时传递当前日期,不希望用户摆弄它-好消息是,您可以将其直接硬编码到sql中,用户将无法触摸它

至于更新查询,最佳实践表明,为了安全和稳定,您应该实现一个已准备好的语句,并在一个循环中将动态值绑定到它

未经测试-我从不使用过程语法

$stmt = mysqli_stmt_init($sdpc_i);
mysqli_stmt_prepare($stmt, "UPDATE data SET progress = ?, last_modified_date = CURDATE() WHERE dataID = ?");
mysqli_stmt_bind_param($stmt, 'si', $progress, $dataID);
$progress = $_POST['progress'];
foreach ($_POST['dataID'] as $dataID) {
    mysqli_stmt_execute($stmt);
}

p、 我希望数据不是您真正的表名,因为它是不好的/不精确的/非描述性的。将其命名为直观的/逻辑的/表达的。

除了dataID之外,所有的POST变量都是具有1值的数组,您应该使用$\u POST['progress'][0]来访问它们。您的代码非常容易受到攻击。它容易受到sql注入、xss和CSRFS的攻击,我应该将其更改为此吗?向我展示您最新代码的3v4l.org演示链接,并键入确切的错误作为注释,这可能是最简单的方法。我现在在床上,所以我可能要到早上才能回复。非常感谢你的帮助。我已经在我的帖子底部添加了一个新的问题。谢谢您仍然需要检查表单是否与ifisset$\u POST['dataID'一起提交{或任何提交检查。否则,当还没有提交第一页加载时,它将尝试保存。好的。谢谢。我从未使用过3v4l.org,但是,我很高兴这样做。我想你需要这样的东西:当我解决了你的问题后,你可以。在问题解决之前,请澄清你被卡住的地方,以便我可以将页面转到WARd决议。
$stmt = mysqli_stmt_init($sdpc_i);
mysqli_stmt_prepare($stmt, "UPDATE data SET progress = ?, last_modified_date = CURDATE() WHERE dataID = ?");
mysqli_stmt_bind_param($stmt, 'si', $progress, $dataID);
$progress = $_POST['progress'];
foreach ($_POST['dataID'] as $dataID) {
    mysqli_stmt_execute($stmt);
}