【问题标题】:Prepopulate dynamically made form php预填充动态生成的表单 php
【发布时间】:2020-04-13 07:08:48
【问题描述】:

我遇到了以下问题:我做了一个表格,根据数据库中满足一定要求的产品数量有一定的输入。这是我的代码:

<?php
if (isset($submissionid) && isset($producttitle)) {
  $sql3 = "SELECT * FROM submissies WHERE submissie_id = '$submissionid' ";
  $data = $conn ->query($sql3);
  $result2 = mysqli_fetch_assoc($data);


  $nrofproducts = $result2[$producttitle];
  settype($nrofproducts, "integer");

}
$psql = "SELECT * FROM product_status WHERE task_id = '$submissionid' AND product_title = '$producttitle'";
$pdata = $conn ->query($psql);
$presult = (isset($pdata))? mysqli_fetch_assoc($pdata) : '';

//GEBRUIK HASH VOOR PID< OM ZE TOCH IETS UNIEK TE GEVEN
if (!empty($presult)) {
  if (isset($_POST['submit'])) {
    for ($b = 0; $b < $nrofproducts; $b++ ) {
      $sql6 = "DELETE FROM product_status WHERE task_id = '$submissionid' AND product_title = '$producttitle'";
      mysqli_query($conn, $sql6);
    }
    for ( $b = 0; $b < $nrofproducts; $b++ ) {
      $serialnr = $_POST['serialnr'. $b];
      $pstatus = $_POST['pstatus' . $b];
      $additional_info = $_POST['bijzonderheden' . $b];
      $merk = $_POST['merk' . $b];
      $type = $_POST['type' . $b];
      $datechecked = date("d-m-Y");
      $sql8 = "INSERT INTO product_status ( product_title, serie_nr, product_status, task_id, bijzonderheden, merk, type, datum_gekeurd) VALUES ('$producttitle', '$serialnr', '$pstatus', '$submissionid', '$additional_info', '$merk', '$type', '$datechecked')";
      mysqli_query( $conn, $sql8);
    }
    header('Location: task.php?id='.$submissionid);
  }
} else {
  if (isset($_POST['submit'])) {
    for ( $a = 0; $a < $nrofproducts; $a++ ) {
      $serialnr = $_POST['serialnr'. $a];
      $pstatus = $_POST['pstatus' . $a];
      $additional_info = $_POST['bijzonderheden' . $a];
      $merk = $_POST['merk' . $a];
      $type = $_POST['type' . $a];
      $datechecked = date("d-m-Y");
      $sql4 = "INSERT INTO product_status ( product_title, serie_nr, product_status, task_id, bijzonderheden, merk, type, datum_gekeurd) VALUES ('$producttitle', '$serialnr', '$pstatus', '$submissionid', '$additional_info', '$merk', '$type', '$datechecked')";
      mysqli_query( $conn, $sql4);

      header('Location: task.php?id='.$submissionid);
    }
  }
}
?>

<html elements etc>

<?php 
for ($i=0; $i < $nrofproducts; $i++):
    if ($producttitle == "blusslang" || $producttitle == "vluchtset" || 
        $producttitle == "ademluchtslang" || $producttitle == "ademluchtkap" || 
        $producttitle == "h2s_meter" || $producttitle == "bhv_verbandtrommer" || 
        $producttitle == "aed") 
    {
          $showbrand = "no";
    } else {
          $showbrand = "yes";
    }
?>
    <form action="product.php?product=<?=$producttitle;?>&submissionid=<?=$submissionid ;?>" method="post">
        <tr>
            <th scope="row"><?=$i + 1; ?></th>
            <td style="text-align:center"><input type="<?=($showbrand == "yes")? "text": "hidden";?>" class="form-control" name="merk<?= $i;?>" placeholder="Merk"></td>
            <td style="text-align:center"><input type="<?=($producttitle == "aed" || $producttitle == "bhv_verbandtrommel")? "hidden" : "text";?>" class="form-control" name="serialnr<?= $i;?>" placeholder="Serienummer" value="<?=($producttitle == "aed" || $producttitle == "bhv_verbandtrommel")? "1" : "" ;?>"></td>
            <td style="text-align:center">
                <select class="custom-select mr-sm-2" name="pstatus<?php echo $i;?>">
                    <option value="gekeurd">Gekeurd</option>
                    <?=($producttitle == "gasmasker" || 
                        $producttitle == "vluchtset" || 
                        $producttitle == "ademluchtslang" || 
                        $producttitle == "ademluchtkap")?"" 
                        : '<option value="gerepareerd">Gerepareerd</option>';
                    ?>
                    <option value="afgekeurd">Afgekeurd</option>
                </select>
            </td>
            <td style="text-align:center">
                <input type="text" class="form-control" name="bijzonderheden<?= $i;?>" placeholder="bijzonderheden">
            </td>
          </tr>
<?php 
    endfor; 
?>
        </tbody>
        </table>

<input type="submit" class="btn btn-info" name="submit" value="Opslaan">
<!-- KNOP MET CHECKBOX, VOOR NIEUWLEVERING. HIERONDER DAN 1 VELD DIE ZE KUNNEN INVULLEN MET NIEUW PRODUCT EN DAN KUNNEN SUBMITTEN< DAT GAAT DAN NAAR DE FACTUREREN DATABASE. -->
<button class="btn btn-info"><a style="text-decoration: none; color: white;" href="task.php?id=<?=$submissionid; ?>">Ga terug</a></button>
    </form>

结果是这样的: Form dynamically created

你可以看到这个有 10 行,但根据产品的不同,行数会有所不同,标题也会有所不同。

我想要的是从我的数据库中填写数据,以防表格已经填写过一次(我已经知道如何检查表格是否已填写)。然后我希望用户能够填写/编辑所有表格并重新提交。我遇到的问题是我不能简单地添加一个填充字段的while循环,这会干扰for循环。我能做什么?

我将使用数据库中的数据填充它的 while 循环示例:

$data = $conn->query("SELECT * FROM table WHERE status = 'something");

<?php while($row = mysqli_fetch_assoc($data)): ?>
    <tr>
      <th scope="row"><?=$row['name'];?></th>
      <td><input value="<?=$row['age'];?>"></td>
      <td><input value="<?=$row['whatver'];?>"></td>
      <td><input value="<?=$row['something'];?>"></td>
    </tr>
    <?php endwhile; ?>

提前致谢!

编辑:

我试过这段代码:

<?php while($row = mysqli_fetch_assoc($conn->query("SELECT * FROM product_status WHERE task_id = '$submissionid' AND product_title = '$producttitle'"))): ?>
        <?php for ($i=0; $i < $nrofproducts; $i++):
          if ($producttitle == "blusslang" || $producttitle == "vluchtset" || $producttitle == "ademluchtslang" || $producttitle == "ademluchtkap" || $producttitle == "h2s_meter" || $producttitle == "bhv_verbandtrommer" || $producttitle == "aed") {
            $showbrand = "no";
          } else {
            $showbrand = "yes";
          }
          ?>
          <form action="product.php?product=<?=$producttitle;?>&submissionid=<?=$submissionid ;?>" method="post">
            <tr>
              <th scope="row"><?=$i + 1; ?></th>
              <td style="text-align:center"><input type="<?=($showbrand == "yes")? "text": "hidden";?>" class="form-control" name="merk<?= $i;?>" placeholder="Merk" value="<?=$row['product_title'];?>"></td>
              <td style="text-align:center"><input type="<?=($producttitle == "aed" || $producttitle == "bhv_verbandtrommel")? "hidden" : "text";?>" class="form-control" name="serialnr<?= $i;?>" placeholder="Serienummer" value="<?=($producttitle == "aed" || $producttitle == "bhv_verbandtrommel")? "1" : "" ;?>"></td>
              <td style="text-align:center">
                <select class="custom-select mr-sm-2" name="pstatus<?php echo $i;?>">
                    <option value="gekeurd">Gekeurd</option>
                    <?=($producttitle == "gasmasker" || $producttitle == "vluchtset" || $producttitle == "ademluchtslang" || $producttitle == "ademluchtkap")?"" : '<option value="gerepareerd">Gerepareerd</option>' ;?>
                    <option value="afgekeurd">Afgekeurd</option>
                </select>
              </td>
              <td style="text-align:center">
                <input type="text" class="form-control" name="bijzonderheden<?= $i;?>" placeholder="bijzonderheden">
              </td>
            </tr>
          <?php endfor; ?>
        <?php endwhile; ?>

好处是它显示了产品的标题,坏的是它是一个永无止境的循环。 Image of ouput (infinite rows)

我尝试的代码的另一个问题是,当产品不在数据库中时,它不会显示任何表行,但它应该显示,因此用户可以第一次填写它。 enter image description here

【问题讨论】:

  • 你想插入数据库吗?不清楚
  • 我想显示已经在数据库中的信息,然后再次提交所有数据。
  • 编辑了我的帖子,现在更清楚了吗?
  • 更好!你可以在你的while循环中插入查询并插入从select查询中获取的数据:跨度>
  • 感谢您的回复!所以我想知道,我应该把while循环放在for循环下面吗?

标签: php sql for-loop while-loop


【解决方案1】:

这是一个简单的示例,您可以如何做到这一点。 用循环做任何你想做的事,将数据加载到你的输入中。它会的。

 while($row = mysqli_fetch_assoc($data)){
   $row['name'];
   $row['age'];
   $row['whatver']
 }

选择查询完成后,开始插入查询

 if(isset(submit)){
    // Do your filters here
    $sql = "INSERT INTO your_table(name, age, whatver) VALUES (?, ?, ?)";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "sss", $row['name'], $row['whatver'], $row['age']);
    mysqli_stmt_execute($stmt);
 }

不要忘记过滤输入。 或者你可以用更新查询来做到这一点

 if(isset(submit)){
    // Do your filters here
    $sql = "UPDATE your_table SET name=?, age=?, whatver=?  WHERE id=?";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "isss", $_SESSION['id'], $row['name'], $row['whatver'], $row['age']);
    mysqli_stmt_execute($stmt);
 }

【讨论】:

  • 是的,我了解 while 循环部分:) 请查看我帖子中的编辑部分。我添加了我尝试过的代码,它有点工作(它显示了产品的标题,来自数据库,正如我想要的那样!),但抛出了无限数量的行。
  • 由于 ERR_CONNECTION_REFUSED 不知道为什么,我可以看到图像 :)
  • 哦,奇怪!它基本上显示了无限数量的行,但是其中的数据是我想要的!
  • 简而言之,问题是,我如何确保while和for循环不会相互干扰。
  • 其实我的例子是自动插入到数据库中,但是你的是在提交中,所以你必须在while循环之外做,否则你会得到无限的查询。在 if(isset(submit)) 的 while 循环中使用相同的查询,就像选择和更新一样,请参阅此链接向下滚动到 update.php 它几乎与您想要的相同:tutorialrepublic.com/php-tutorial/…
猜你喜欢
  • 2015-09-30
  • 2017-12-17
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多