php - 从输入 [] 获取数据时,从 PDO 中的数组重复插入时循环混乱
问题描述
- 有一个特殊的出勤和缺勤项目作为大学的职责
- 我创建了一个表单,通过使用 [] 到 git 数组 git 他的输入表单数据库
- 一切正常,但是:
- ** 当我从表单中插入数据时,我找不到正确的方法让它正常工作**
- 我曾经循环 ** for ** for go to next index 和 ** foreach ** 获取单选按钮的索引
这是我的表,我有它形成数据库:
<br>
<div class="row justify-content-md-center">
<h2>شاشة ادخال الحضور والغياب للطالب </h2>
<br><br>
</div>
<br><br>
<form action="" dir="rtl" method="POST">
<fieldset>
<legend>اختيار بيانات التحظير :</legend>
<div class="row">
<div class="col">
<select class="form-control" name="phase_student">
<option value="">المرحلة</option>
<?php
$QueryDB = "SELECT * FROM `phase_student`";
$DoQuery = mysqli_query($Con, $QueryDB);
$ChekRows = mysqli_num_rows($DoQuery);
if ($ChekRows > 0) {
while ($Rows = mysqli_fetch_assoc($DoQuery)) {
echo "<option value='" . $Rows['num_phase'] . "'> " . $Rows['phase'] . " </option>";
}
} else {
echo "<option value=''>لا توجد بيانات مرحلة </option>";
} ?>
</select>
</div>
<div class="col">
<select class="form-control" name="classe">
<option value="">الصف</option>
<?php
$QueryDB2 = "SELECT * FROM `classe`";
$DoQuery2 = mysqli_query($Con, $QueryDB2);
$ChekRows2 = mysqli_num_rows($DoQuery2);
if ($ChekRows2 > 0) {
while ($Rows2 = mysqli_fetch_assoc($DoQuery2)) {
echo "<option value='" . $Rows2['num_class'] . "'> " . $Rows2['class'] . " </option>";
}
} else {
echo "<option value=''>لا توجد بيان الصفوف </option>";
} ?>
</select>
</div>
<div class="col">
<select class=" form-control" name="prong">
<option value="">الشعبة</option>
<?php
$QueryDB3 = "SELECT * FROM `prong`";
$DoQuery3 = mysqli_query($Con, $QueryDB3);
$ChekRows3 = mysqli_num_rows($DoQuery3);
if ($ChekRows3 > 0) {
while ($Rows3 = mysqli_fetch_assoc($DoQuery3)) {
echo "<option value='" . $Rows3['num_prong'] . "'> " . $Rows3['prong'] . " </option>";
}
} else {
echo "<option value=''>لا توجد بيان شعب </option>";
} ?>
</select>
</div>
</div>
<br>
<div class="row">
<div class="col">
<select class="form-control" name="item">
<option value="">اسم المادة</option>
<?php
$QueryDB6 = "SELECT * FROM `item`";
$DoQuery6 = mysqli_query($Con, $QueryDB6);
$ChekRows6 = mysqli_num_rows($DoQuery6);
if ($ChekRows6 > 0) {
while ($Rows6 = mysqli_fetch_assoc($DoQuery6)) {
echo "<option value='" . $Rows6['num_item'] . "'> " . $Rows6['item'] . " </option>";
}
} else {
echo "<option value=''>لا توجد بيان المواد </option>";
} ?>
</select>
</div>
<div class="col">
<select class=" form-control" name="monthe">
<option value="">الشهر</option>
<?php
$QueryDB5 = "SELECT * FROM `monthe`";
$DoQuery5 = mysqli_query($Con, $QueryDB5);
$ChekRows5 = mysqli_num_rows($DoQuery5);
if ($ChekRows5 > 0) {
while ($Rows5 = mysqli_fetch_assoc($DoQuery5)) {
echo "<option value='" . $Rows5['num_month'] . "'> " . $Rows5['monthe'] . " </option>";
}
} else {
echo "<option value=''>لا توجد بيان الاشهر </option>";
} ?>
</select>
</div>
<div class="col">
<input type="date" class="form-control" name="thisDay" value="">
</div>
</div>
</fieldset>
<br>
<br>
<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<th>متسلسل</th>
<th>اسم الطالب</th>
<th>حاضر</th>
<th>غائب</th>
<th>مستئذن</th>
<th> ملاحظات</th>
</tr>
</thead>
<tbody>
<tr>
<?php
$queryStu = "SELECT * FROM `student_academia` ";
$DoQuerystu = mysqli_query($Con, $queryStu);
$ChekRowsstu = mysqli_num_rows($DoQuerystu);
if ($ChekRowsstu > 0) {
while ($Rowsstu = mysqli_fetch_assoc($DoQuerystu)) {
echo " <td> <span> " . $Rowsstu['num__student'] . "</span> <input type='hidden' name ='IdStu[]' value='" . $Rowsstu['num__student'] . "' > </td>";
echo " <td> <span> " . $Rowsstu['name_student'] . "</span> <input type='hidden' name ='NaStu[]' value='" . $Rowsstu['name_student'] . "' > </td>";
echo " <td>
<div class=\"form-check\">
<label class=\"form-check-label\">
<input class=\"form-check-input\" type=\"radio\" name=\"attend[" . $Rowsstu['num__student'] . "]\" value=\"1\" id=" . $Rowsstu['num__student'] . ">
</label>
</div>
</td>
<td>
<div class=\"form-check\">
<label class=\"form-check-label\">
<input class=\"form-check-input\" type=\"radio\" name=\"attend[" . $Rowsstu['num__student'] . "]\" value=\"0\" id=" . $Rowsstu['num__student'] . ">
</label>
</div>
</td>
<td>
<div class=\"form-check\">
<label class=\"form-check-label\">
<input class=\"form-check-input\" type=\"radio\" name=\"excusable[" . $Rowsstu['num__student'] . "]\" value=\"1\" id=" . $Rowsstu['num__student'] . ">
<input class=\"form-check-input sr-only\" type=\"radio\" name=\"excusable[" . $Rowsstu['num__student'] . "]\" value=\"0\" id=" . $Rowsstu['num__student'] . " checked >
</label>
</div>
</td>
<td><input type='text' class='form-control' name='attendNote[]' placeholder='ملاحظات ' /></td>
</tr>
";
}
} else {
echo "لا توجد بيان طلاب";
}
?>
</tbody>
</table>
</div>
<br>
<br>
<div class=" row justify-content-center">
<div class="col-3">
<input class="btn btn-outline-primary btn-block" type="submit" name="savedata"
value="حفظ"/>
</div>
<div class="col-3">
<input class="btn btn-block btn-outline-warning " type="reset" value="مسح"/>
</div>
<div class="col-3">
<button type="button" class="btn btn-block btn-outline-danger" name="close">خروج
</button>
</div>
</div>
</form>
这是我张贴我的表格的抱怨:
<?php
include "header.php";
//connect to data base oraginal con
include "ConDB.php";
// connect to database but Php Data Opject conect
$db = new PDO("mysql:host=localhost;dbname=school_db", "root", "");
// utf8 supurt arabic
$db->exec("SET CHARACTER SET utf8");
// show error on connect
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// when some body click save button
if (isset($_POST['savedata'])) {
$phase_student = $_POST['phase_student'];
$classe = $_POST['classe'];
$prong = $_POST['prong'];
$item = $_POST['item'];
$monthe = $_POST['monthe'];
$thisDay = $_POST['thisDay'];
//array
$IdStu = $_POST['IdStu'];
$NaStu = $_POST['NaStu'];
$attends = $_POST['attend'];
$excusables = $_POST['excusable'];
$attendNote = $_POST['attendNote'];
echo "<br>";
var_dump($NaStu);
echo "<br>";
var_dump($IdStu);
echo "<br>";
var_dump($attends);
echo "<br>";
var_dump($attendNote);
echo "<br>";
var_dump($excusables);
echo "<br>";
/*
$queryInsertAttend = "INSERT INTO `outcom_month`(`num__student`, `name_student`, `num_month`, `num_class`,`class`, `prong`, `num_item`, `item`, `duties(20)`, `oral(20)`, `assiduity(20)`, `edit(40)`, `total`, `tribnte`, `note_avant`, `note_guardian`) VALUES (
$num__student ,$num__student, $num_month ,$num_class,$num_class,$prong,$num_item,$num_item,
$duties,$oral,$assiduity,$edit,$edit,$tribnte,$note_avant,$note_avant)";
**/
//
// $id = new ArrayIterator($IdStu);
// $at = new ArrayIterator($attend);
// $atnot = new ArrayIterator($attendNote);
//
// $dataa = new MultipleIterator(MultipleIterator::MIT_NEED_ALL);
//
// $dataa->attachIterator($id);
// $dataa->attachIterator($at);
// $dataa->attachIterator($atnot);
////
if (!empty($_POST)) {
//$insert_stu_Attend = $db->prepare("insert into test values (?,?,?,?,?,?,?,?)");
$insert_stu_Attend = $db->prepare("insert into test2 values (?,?,?,?,?,?,?,?)");
$insert_stu_Attend->bindParam(1, $first);
$insert_stu_Attend->bindParam(2, $second);
$insert_stu_Attend->bindParam(3, $third);
$insert_stu_Attend->bindParam(4, $forth);
$insert_stu_Attend->bindParam(5, $fifth);
$insert_stu_Attend->bindParam(6, $sixth);
$insert_stu_Attend->bindParam(7, $seventh);
$insert_stu_Attend->bindParam(8, $eighth);
for ($i = 0; $i < 3; $i++) {
foreach ($IdStu as $s) {
$dd = 1;
$first = $IdStu[$i];
$second = $monthe;
$third = $item;
$forth = $classe;
$fifth = $thisDay;
$sixth = $attends[$s];
$seventh = $excusables[$s];
$eighth = $attendNote[$i];
$insert_stu_Attend->execute();
}
}
}
} else {
echo '<br>';
echo " لم يتم الادخال";
}
?>
每次我得到表中唯一的第一排。
表定义:
CREATE TABLE test (
num__student int(11) NOT NULL UNIQUE,
year_study date NOT NULL,
num_item int(11) NOT NULL,
calss varchar(15) NOT NULL,
date_day date NOT NULL,
attendee tinyint(1) NOT NULL,
excusable tinyint(1) NOT NULL,
nate mediumtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
解决方案
显然,您使用的bindParam
in 不是最正确的方式。
根据这个:https://www.w3schools.com/php/php_mysql_prepared_statements.asp,你应该在循环之前绑定它们,并使用循环只调整你绑定的变量。
我以你的代码为例,好吗?
if (!empty($_POST)) {
$insert_stu_Attend = $db->prepare("insert into test values (?,?,?,?,?,?,?,?)");
$insert_stu_Attend->bindParam(1, $first);
$insert_stu_Attend->bindParam(2, $second);
$insert_stu_Attend->bindParam(3, $third);
$insert_stu_Attend->bindParam(4, $forth);
$insert_stu_Attend->bindParam(5, $fifth);
$insert_stu_Attend->bindParam(6, $sixth);
$insert_stu_Attend->bindParam(7, $seventh);
$insert_stu_Attend->bindParam(8, $eighth);
foreach ($IdStu as $key => $s) {
$dd = 1;
$first = $IdStu[$key];
$second = $monthe;
$third = $item;
$forth = $classe;
$fifth = $thisDay;
$sixth = $attends[$s];
$seventh = $excusables[$s];
$eighth = $attendNote[$key];
$insert_stu_Attend->execute();
}
}
根据文档,它应该可以工作。让我知道进展如何。
编辑 我删除了 for 并只保留了 foreach,因为我假设您正在使用 FOR 来循环来自不同数组的结果,考虑到为此结果发送的用户数量。
推荐阅读
- java - JavaFX - 在彼此之上绘制多边形时获取像素颜色
- javascript - 如何使任何悬停的颜色比原始颜色更暗/更亮
- flutter - BottomNavigationBar 页面更改导致 StreamBuilder 数据重新加载
- java - 用springboot实现css多选
- html - 覆盖父 CSS 表类
- haskell - 可表示函子包
- android - 构建失败,原因:读取 zip 文件时出错
- php - Test count is more than data count of data-provider in CodeCeption
- excel - Excel VBA 中心页眉/页脚“左对齐”
- php - wamp 无法访问已创建的 wordpress 站点