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