【问题标题】:Updating database with array holding form data使用包含表单数据的数组更新数据库
【发布时间】:2018-05-15 12:02:31
【问题描述】:

我有一个表单可以动态加载要从我的数据库中更新的数据。第一个表单域包含表 1 中的一个问题,第二个表单域包含每个问题的可选答案,例如选项 a、b、c、d。表格如下所示:

问题 1

  • 选项a

  • 选项 b

  • 选项 c

  • 选项 d

问题 2

  • 选项a

  • 选项 b

  • 选项 c

  • 选项 d

等等(动态)。在提交表单时,应更新对问题和答案的所有更改。我的问题是我无法正确地将问题和选项以正确的格式保存在数组中,我如何使用他们的唯一 ID 更新我的数据库。

这就是我目前所拥有的......

我的数据库结构

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

?>

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

}
?>

此刻数组的内容有所有问题和最后一个问题的最后一个选项。我想要的是为每个问题及其选项提供一个数组,以及如何使用这个数组来更新数据库。非常感谢您的帮助

【问题讨论】:

  • 请用相关的数据库结构更新您的问题,以及缺少的查询:$getusr
  • @HtmHell 我更新了我的问题

标签: php arrays for-loop


【解决方案1】:

您没有将输入数组与问题 ID 相关联,并且在选项输入中您根本没有使用数组。

我在您的代码中添加了一些更改,包括优化 - 您每次都在循环内查询,而不是在循环外查询一次。看看我添加的 cmets 以便更好地理解。

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

了解结果并相应地编写代码。

【讨论】:

  • 感谢您抽出宝贵时间回答,我无法获得表单的任何输出(表单不显示),我认为这是因为$getopt 查询,AND 运算符可能会被忽略,因为到 ' 和 '"' 我不确定,但我没有得到 SQL 错误,但没有输出
  • 代替$getopt = $pdo-&gt;prepare("SELECT * FROM questions WHERE qid ...'"); 做:die("SELECT * FROM questions WHERE qid IN ('" . implode("','", array_keys($question)) . "') AND eid='$cid'"); 并告诉我输出是什么
  • SELECT * FROM questions WHERE qid IN ('58027e82e62e3','58027e833dd54','58027e8371483','58027e8371494') AND eid='3' 查询似乎没问题,但表单没有输出任何内容
  • 只有按钮取消和更新显示所以我写了一段代码来打印一些文本如果按钮被点击但没有任何反应。关于表单为什么不起作用的任何想法?
  • 问题出在数组上,我不知道为什么,但是当我在任何数组声明之前输出其他数据时,我得到了一个输出,但之后的所有内容都是空白
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多