预填充动态生成的php表格

时间:2019-12-20 20:10:25

标签: php sql for-loop while-loop

我遇到了以下问题:我制作了一个表格,该表格基于数据库中满足某些要求的产品数量提供了一定数量的输入。这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

这是一个简单的示例。 使用循环执行所需的操作,将数据加载到输入中。会的。

 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);
 }
相关问题