我的表单会立即将所有员工的日期,时间和超时提交到名为的数据库表中考勤。从数据库表中获取员工的姓名,每个员工都有唯一的ID。 现在的问题是,我如何格式化可以立即将数据插入数据库的查询。这是我的PHP代码。
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "employee_record";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$output="";
$query= "SELECT * ";
$query.= "FROM employe ";
$result=mysqli_query($conn,$query);
if(!$result){
echo ("Database query failed. ".mysqli_connect_error());
}
<form action="test.php" method="POST" >
<table border="1" style="margin-top: 20px">
<thead>
<th>Employee Name</th>
<th>Date</th>
<th>Time In</th>
<th>Time Out</th>
</thead>
<tbody>
<?php
$id=array();
$date=array();
$timein=array();
$timeout=array();
while($employe = mysqli_fetch_assoc($result)){
echo "<tr><td>";
echo "<input type=\"hidden\" name=\"id[]\" value=\"";
echo $employe['id'];
echo "\"/>";
echo $employe['firstname']." ".$employe['lastname']."</td>";
echo "<td><input type=\"date\" name=\"date[]\" value=\"\"/></td>";
echo "<td><input type=\"datetime-local\" name=\"timein[]\" value=\"\"/></td>";
echo "<td><input type=\"datetime-local\" name=\"timeout[]\" value=\"\"/></td>";
echo "</tr>";
}
?>
</tbody>
</table>
<input type="submit" name="submit" value="Submit" />
</form>
?>
现在说我有像......的数据 ID(1,2,3), 日期(DATE1,DATE2,DATE3), timeIn(TIME1,TIME2,时间3), 超时(TIME1,TIME2,时间3)。 数据量的变化因为从数据表中获取ID,其中员工数量可以更多或更少。现在我只是坚持如何将数据插入数据库中的ID。 任何帮助将不胜感激..
答案 0 :(得分:2)
在回顾完我的原始答案之后,我意识到我今天不会使用这种方法。基本上因为现在我知道,在单个事务中逐行执行一个预准备语句是足够快的,除非我们讨论的是数千行(当数据是用户生成的情况时不太可能)。答案中也缺少任何SQL注入保护,现在参数化查询没有问题。
$ids = [];
$dates = [];
$timeIns = [];
$timeOuts = [];
// validate $_POST data and put into arrays above
$stmt = $conn->prepare("
UPDATE attendance SET
date = ?,
tiemeIn = ?,
timeOut = ?
WHERE user_id = ?
");
$numRows = count($ids);
$conn->begin_transaction();
for ($i = 0; $i < $numRows; $i++) {
$stmt->bind_param('sssi', $date[$i], $timeIns[$i], $timeOuts, $ids[$i]);
$stmt->execute();
}
$conn->commit();
要插入包含N列的多个(M)行,您可以使用以下语法:
INSERT INTO tablename
(colname1, colname2, .. , colnameN)
VALUES
(valueRow1Colname1, valueRow1Colname2, .. , valueRow1ColnameN),
(valueRow2Colname1, valueRow2Colname2, .. , valueRow2ColnameN),
..
(valueRowMColname1, valueRowMColname2, .. , valueRowMColnameN);
您可以使用函数 join 或 implode 使用PHP创建该查询。
$ids = array();
$dates = array();
$timeIns = array();
$timeOuts = array();
// validate $_POST data and put into arrays above
$numInserts = count($ids);
if ($numInserts > 0) {
$values = array();
for ($i = 0; $i < $numInserts; $i++) {
$values[] = "({$ids[$i]}, '{$dates[$i]}', '{$timeIns[$i]}', '{$timeOuts[$i]}')";
}
$valuesJoined = join(',', $values);
$query = "
INSERT INTO attendance (user_id, date, tiemeIn, timeOut)
VALUES {$valuesJoined}
ON DUPLICATE KEY UPDATE
date = VALUES(date),
tiemeIn = VALUES(tiemeIn),
timeOut = VALUES(timeOut)
";
$result=mysqli_query($conn,$query);
}
答案 1 :(得分:0)
如果我正确地理解了这个问题,那么沿着这些方向的某些东西可能有所帮助当然,这是未经测试的数据,但我认为这个想法应该有效。
/*
------------------------------
To process the form submission
------------------------------
*/
$update=false;/* change this if the final output sql looks correct..*/
$keys=array_keys( $_POST );
$length=count( $_POST[ $keys[ 0 ] ] );
for( $i=0; $i < $length; $i++ ){
$params=array();
foreach( $keys as $field ) {
$value=$_POST[ $field ][ $i ];
if( $field!=='id' ) $params[]="`{$field}`=\"".str_replace('"',"'",$value)."\"";
else $where=" where `id`='".$value."';";
}
$sql="update `employee` set ".implode(', ',$params ) . $where;
if( $update ) $result=mysqli_query( $conn, $sql );
else echo $sql.'<br />';
}
答案 2 :(得分:-1)
if(isset($_POST['submit']) ){
print_r($_POST);// die;
/* Array
(
[date] =2019-11-18
[id] = Array
(
[8] = 8
[9] = 9
[11] = 11
[14] = 14
[15] = 15
[17] = 17
[16] = 16
)
[a_status] = Array
(
[8] = present
[9] = present
[11] = present
[14] = present
[15] = present
[17] = present
[16] = present
)
[submit] = Submit
)*/
$i=0;
$id =$_POST['id'];
$a_status = $_POST['a_status'];
$date = $_POST['date'];
foreach ($a_status as $key => $id) {
$sql = "INSERT INTO `tbl_attendance`(`stid`, `date`, `a_status`) VALUES('$key','".$_POST['date']."','$id')";
echo $sql; //die;
$res = mysqli_query($conn,$sql);
// print_r($res);
$i++;
}
//hi
}
?>