****注意**:我已经在此站点上问了这个问题,并被提出了一个解决方案,但我的逻辑无法理解,但仍然无法实现。因此,这是初始问题的经过编辑的版本,以使其更简洁,更清楚,以便希望能得到更多答复。我还将标题更改为希望更有意义的东西。**

我已经开始与MySQL(完全新手)一起学习PHP,并且已经创建了一个包含问题和选项表的数据库,作为测验应用程序项目的一部分,以帮助我学习。我认为通过通过PHP处理的表单提交问题和选项来填充数据库将是一个很好的学习经验。

概括地说,我遇到的问题是,我有以下形式:

[数据输入表]

http://i.stack.imgur.com/3S0gu.png
    具有单个字段常量元数据的表单(可变行)的问题部分

        <div class="questinfo">
            <div class="questmetadata">

            <select name="questfield[0][subject_id]">
                <option>BA</option>
                <option>MY</option>
                <option>PA</option>
                <option>BB</option>
                <option>CC</option>
                <option>UA</option>
                <option>HM</option>
                <option>CG</option>

            </select>
             <input name="questfield[0][chapter_id]">

            <input name="questfield[0][topic_id]">
             <input name="questfield[0][is_active]">
            <select name="questfield[0][type]">
                <option>P</option>
                <option>L</option>
            </select>

            <select name="questfield[0][level]">
                <option>1<option>
                <option>2 II<option>
                <option>3<option>
            </select>

            </div>

            <div class="questrow">
            <input  name="questfield[1][questid]">
            <input  name="questfield[1][numero]">
            <textarea  name="questfield[1][question]"></textarea>
            </div>

<div class="questfield">
            <input  name="questfield[2][id]">
            <input  name="questfield[2][numero]">
            <input name= "questfield[2][is_active]">
            <textarea  name="questfield[2][question]"></textarea>
        </div>


            <div class="questrow">
            <input  name="questfield[3][questid]">
            <input  name="questfield[3][numero]">
            <textarea  name="questfield[3][question]"></textarea>
            </div>


表格的选项部分;具有唯一对应元数据字段的变量选项字段。

    <div class="optionfield">
        <input type="text" name ="optionfield[0][optid]">
        <input type="text" name ="optionfield[0][choice]">
        <input type="text" name ="optionfield[0][question_numero]">
        <input type="checkbox" name ="optionfield[0][is_answer]">

        </div>

        <div class="optionfield">
        <input type="text" name ="optionfield[1][optid]">
        <input type="text" name ="optionfield[1][choice]">
        <input type="text" name ="optionfield[1][question_numero]">
        <input type="checkbox" name ="optionfield[1][is_answer]">
        </div>


        <div class="optionfield">
        <input type="text" name ="optionfield[2][optid]">
        <input type="text" name ="optionfield[2][choice]">
        <input type="text" name ="optionfield[2][question_numero]">
        <input type="checkbox" name ="optionfield[2][is_answer]">
        </div>


        <div class="optionfield">
        <input type="text" name ="optionfield[3][optid]">
        <input type="text" name ="optionfield[3][choice]">
        <input type="text" name ="optionfield[3][question_numero]">
        <input type="checkbox" name ="optionfield[3][is_answer]">
        </div>


This is the corresponding PHP;  only the first row is entered into the question table but the options table has all four rows.(because unlike for the questions section of the form, all the column entries in the options table by necessity must correspond to a distinct field in the form)

    $optsql=" INSERT INTO

    options


    SET
    optid=:optid,
    question_numero=:question_numero,
    choice=:choice,
    is_answer=:is_answer,
    answer_explanation=:answer_explanation";

$questsql=" INSERT INTO questions

            SET
            questid=:questid,
            numero=:numero,
            question=:question,
            subject_id=:subject_id,
            chapter_id=:chapter_id,
            topic_id=:topic_id,
            type=:type,
            level=:level,
            is_active=:is_active

        ";


$optstmt=$clsdb->prepare($optsql);
$queststmt=$clsdb->prepare($questsql);



    foreach($_POST['optionfield'] as $optinput){

    $optdata= array(

        'optid'=>$optinput['optid'],
        'question_numero'=>$optinput['question_numero'],
        'choice'=>$optinput['choice'],
        'answer_explanation'=>$optinput['answer_explanation'],
        'is_answer'=>$optinput['is_answer']);

$optstmt->execute($optdata);


}

foreach($_POST['questfield'] as $questinput){

$questdata= array(

        'questid'=>$questinput['questid'],
        'numero'=>$questinput['numero'],
        'question'=>$questinput['question'],
        'subject_id'=>$questinput['subject_id'],
        'chapter_id'=>$questinput['chapter_id'],
        'topic_id'=>$questinput['topic_id'],
        'type'=>$questinput['type'],
        'level'=>$questinput['level'],
        'is_active'=>$questinput['is_active']);

        $queststmt->execute($questdata);

}


该表格分为两部分:问题和相应选项响应一个提交按钮,但将数据插入数据库中不同的(选项和问题)表中。在上图中,我在表单的问题部分有四行字段(请原谅其样式或缺少样式)。第一行用于元数据,其下的三行(均以文本框结尾)表示要在数据库中输入的三个独立的问题行。元数据行包含我要填充三个问题行中相应列的数据一旦提交到数据库,使用我当前的PHP代码,仅插入一个问题行以及相应的元数据。我想要的是以下内容:

[期望结果]

http://i.stack.imgur.com/9LpJP.png

但是元数据已填写(而不是零)。元数据应根据表单中为各种提交选择的内容而有所不同,但对于给定提交同时插入的任意数量的行,其元数据应相同。

根据上述代码,一个名为Martin Law的用户提出了以下解决方案:

foreach($_POST['questfield'] as $key => $value){
//static vars(metadata)
$questdata[$key] = $value;
foreach($_POST['optionfield'] as $key => $value){
    //changing vars(answers)
    $questdata[$key] = $value;
    //Write to db
    $stmt->execute($query);
}


}

但是,上面的代码返回一个通知错误:“箭头到字符串转换”,我发现这是因为传递给execute函数的$ questdata是多维数组。此外,我不了解此代码的逻辑。我有单独的插入查询以及为问题和选项准备的语句,但是在上面的代码中仅隐含一个语句和query($ query)。“ $ query”应该是什么? ?同样在代码中,有一个嵌套的foreach循环,该循环传递“ optionfield”数组并将元素分配给$ questdata,这如何适合主要涉及问题表的问题的解决方案?有人可以详细说明马丁解决方案的逻辑,以及如何根据提供的数据成功实施它,或者提供原始解决方案吗?谢谢。

最佳答案

考虑从questfield数组中分解元数据,因为它们对于表单保持静态。在插入查询中,重新使用那些标量$_POST字段以及动态的questfield值(questid,numero,question):

的HTML

<div class="questmetadata">
  <select name="subject_id">
      <option>BA</option>
      <option>MY</option>
      <option>PA</option>
      <option>BB</option>
      <option>CC</option>
      <option>UA</option>
      <option>HM</option>
      <option>CG</option>
  </select>

  <input name="chapter_id">

  <input name="topic_id">
  <input name="is_active">

  <select name="type">
      <option>P</option>
      <option>L</option>
  </select>

  <select name="level">
      <option>1<option>
      <option>2 II<option>
      <option>3<option>
  </select>
</div>


更改后,请确保调整questfield的索引:

<div class="questrow">
   <input  name="questfield[0][questid]">
   <input  name="questfield[0][numero]">
   <textarea  name="questfield[0][question]"></textarea>
</div>


的PHP

...
foreach($_POST['questfield'] as $questinput){

    $questdata= array(
        'questid'=>$questinput['questid'],         // DYNAMIC FIELDS
        'numero'=>$questinput['numero'],
        'question'=>$questinput['question'],
        'subject_id'=>$_POST['subject_id'],        // STATIC FIELDS
        'chapter_id'=>$_POST['chapter_id'],
        'topic_id'=>$_POST['topic_id'],
        'type'=>$_POST['type'],
        'level'=>$_POST['level'],
        'is_active'=>$_POST['is_active']
    );

    $queststmt->execute($questdata);
}

关于php - 如何在一次提交中将相同和多个行的静态和动态数据从PHP表单插入MySQL数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39185594/

10-14 16:34
查看更多