php - 使用包含表单数据的数组更新数据库
问题描述
我有一个表单可以动态加载要从我的数据库中更新的数据。第一个表单域包含表 1 中的一个问题,第二个表单域包含每个问题的可选答案,例如选项 a、b、c、d。表格如下所示:
问题 1
选项一
选项 b
选项c
选项d
问题2
选项一
选项 b
选项c
选项d
等等(动态)。提交表单时,应更新对问题和答案的所有更改。我的问题是我无法正确地将问题和选项以正确的格式保存在数组中,我如何使用他们的唯一 ID 更新我的数据库。
这是我到目前为止所拥有的......
我的数据库结构
我的表格.php
<?php
$cid = $_GET['course_id'];
$i = 0;
$z= 0;
$host = 'localhost';
$dbname = 'einstower_elearn';
$username = "root";
$password = "";
$pdo = new PDO('mysql:dbname=einstower_elearn;host=localhost', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$question[] = 0;
$mysqli = new mysqli("localhost", "root", "", "einstower_elearn");
$getusr = $pdo->prepare("SELECT * FROM questions WHERE eid= '$cid'");
$getusr->execute();
$count_q = $getusr->rowCount();
$getusr->setFetchMode(PDO::FETCH_ASSOC);
while($obj = $getusr->fetch())
{
//Create an array for question ID
$question[] = $obj['qid'];
}
//for each question get its options from another table
foreach ($question as $key => $value) {
# code...
$getopt = $pdo->prepare("SELECT * FROM questions WHERE qid= '$value' AND eid='$cid'");
$getopt->execute();
$count_questions = $getopt->rowCount();
if ($count_questions>=1){
$getopt->setFetchMode(PDO::FETCH_ASSOC);
while($obj = $getopt->fetch())
{
$z++;
$qid2 = $obj['qid'];
$questionName = $obj['qns'];
//form starts here
echo '
<form method="POST" action="edit_exam_course.php" enctype="multipart/form-data">
<input type="hidden" class="form-control" name="qid" value="'.$qid2.'">
<div class="row form-group" style="padding-top:40px !important;">
<div class="col-sm-2">
<label class="control-label modal-label">Question</label>
</div>
<div class="col-sm-10">
//Create an array for updated questions in form
<input type="text" value="'.$questionName.'" class="form-control" name="l_title[]" required>
</div>
</div>';
$getopt = $pdo->prepare("SELECT * FROM options WHERE qid= '$qid2'");
$getopt->execute();
$count_mat = $getopt->rowCount();
$getopt->setFetchMode(PDO::FETCH_ASSOC);
while($obj = $getopt->fetch())
{
$i++;
$optionTitle = $obj['option'];
$optionID = $obj['optionid'];
echo '<div class="rwo form-group">
<label class="col-md-12 control-label" for="' . $i . '1"></label>
<div class="col-md-12">
//option ids (unique)
<input type="hidden" class="form-control" name="questid" value="'.$optionID.'">
<input id="' . $i . '1" name="optTitle" value="'.$optionTitle.'" class="form-control input-md" type="text">
</div>
</div>';
}}
}elseif ($count_questions<=0) {
unset($question);
$question[] = null;
}
}
?>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> Cancel</button>
<button type="submit" name="update_exam_course" class="btn btn-primary"><span class="glyphicon glyphicon-check"></span>Update</button>
</div>
?>
编辑考试课程.php
<?php
session_start();
include_once('connection.php');
if(isset($_POST['update_exam_course'])){
//for each question i want to update the question and its options
foreach ($_POST['l_title'] as $p) {
//query would be here
var_dump($_POST);
}
}
?>
目前数组的内容有所有问题和最后一个问题的最后一个选项。我想要的是为每个问题及其选项提供一个数组,以及如何使用这个数组来更新数据库。您的帮助将不胜感激
解决方案
您没有将输入数组与问题 ID 相关联,并且在选项输入中您根本没有使用数组。
我在您的代码中添加了一些更改,包括优化 - 您每次都在循环内查询,而不是在循环外查询一次。查看我添加的评论以更好地理解。
<?php
$cid = $_GET['course_id'];
$i = 0;
$z = 0;
$host = 'localhost';
$dbname = 'einstower_elearn';
$username = "root";
$password = "";
$pdo = new PDO('mysql:dbname=einstower_elearn;host=localhost', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$mysqli = new mysqli("localhost", "root", "", "einstower_elearn");
$getusr = $pdo->prepare("SELECT * FROM questions WHERE eid= '$cid'");
$getusr->execute();
$count_q = $getusr->rowCount();
// Initialising questions array
$question = [];
while ($obj = $getusr->fetch(PDO::FETCH_ASSOC)) {
// Adding question to array with 'qid' as a key.
$question[$obj['qid']] = $obj;
}
// Initializing options array
$options = [];
// Selecting options
$getopt = $pdo->prepare("SELECT * FROM options WHERE qid IN ('" . implode("','", array_keys($question)) . "')");
while ($obj = $getopt->fetch(PDO::FETCH_ASSOC)) {
// Adding option to array with 'qid' as a key.
$options[$obj['qid']][] = $obj;
}
// Selecting questions
$getopt = $pdo->prepare("SELECT * FROM questions WHERE qid IN ('" . implode("','", array_keys($question)) . "') AND eid='$cid'");
// Looping through questions
while ($obj = $getopt->fetch(PDO::FETCH_ASSOC)) {
$z++;
$qid2 = $obj['qid'];
$questionName = $obj['qns'];
//form starts here
echo '
<form method="POST" action="edit_exam_course.php" enctype="multipart/form-data">
<input type="hidden" class="form-control" name="qid" value="' . $qid2 . '">
<div class="row form-group" style="padding-top:40px !important;">
<div class="col-sm-2">
<label class="control-label modal-label">Question</label>
</div>
<div class="col-sm-10">
//Create an array for updated questions in form
<input type="text" value="' . $questionName . '" class="form-control" name="question[' . $qid2 . ']" required>
</div>
</div>';
foreach ($options[$obj['qid']] as $obj) {
$i++;
$optionTitle = $obj['option'];
$optionID = $obj['optionid'];
echo '
<div class="rwo form-group">
<label class="col-md-12 control-label" for="' . $i . '1"></label>
<div class="col-md-12">
//option ids (unique)
<input id="' . $i . '1" name="optTitle[' . $qid2 . '][' . $optionID . ']" value="' . $optionTitle . '" class="form-control input-md" type="text">
</div>
</div>';
}
}
?>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span>
Cancel
</button>
<button type="submit" name="update_exam_course" class="btn btn-primary"><span
class="glyphicon glyphicon-check"></span>Update
</button>
</div>
在 ajax 页面中执行:
<?php
var_dump($_POST);
或者
<?php
print_r($_POST);
了解结果并相应地编写代码。
推荐阅读
- docker - TypeError:描述不是函数。在 Gitlab CI 上运行 Selenium 测试时
- html - Spring - 电子邮件正文中具有多个链接的 java 邮件
- tosca - 如何在 tosca 自动化工具中选择文件上传
- php - 如何使用 php 在一个软件上运行命令
- javascript - JavaScript 在数组中查找单个元素
- c# - 如何在完整多边形的两点之间的某处添加一个点
- android - 设置 Cardview 形状和背景半透明
- firebase - 如何模拟/存根 react-native-firebase?
- python - Python 轮询记录传感器数据
- c - Check if subarray with sum 0 exists or not