使用 pdo 将多维数组插入 mysql
Inserting multidiamenstional array into mysql with pdo
我有一个多维数组要插入 mysql table。尝试将日期时间时间与该数组中的其他元素一起添加。
但每次我收到这个错误。 :
Notice: Undefined offset: 10 in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php on line 47
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'att_status' cannot be null' in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php:60 Stack trace: #0 C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php(60): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php on line 60
我不明白问题出在哪里。
<?php
require_once("db_const.php");
if (!$_SERVER['REQUEST_METHOD']=='POST'
|| !$_POST['submit']=='save'
|| empty($_POST['subject_name'])
|| empty($_POST['subject_code'])
|| empty($_POST['department_name'])
|| empty($_POST['department_short_name'])
|| empty($_POST['teacher_name'])
|| empty($_POST['date'])
|| empty($_POST['time'])
|| empty($_POST['student'])
|| empty($_POST['stroll'])
|| empty($_POST['status'])
) {
header('Location: ../student_attendance.php?page=take-attendance');
} else {
## connect mysql server
/** $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
# check connection
if ($mysqli->connect_errno) {
echo "<p>MySQL error no {$mysqli->connect_errno} :
{$mysqli->connect_error}</p>";
exit();
}**/
## query database
# prepare data for insertion 538 072 662 2716
$subject_name = $_POST['subject_name'];
$subject_code = $_POST['subject_code'];
$department_name = $_POST['department_name'];
$department_short_name = $_POST['department_short_name'];
$teacher_name = $_POST['teacher_name'];
$date = $_POST['date'];
$time = $_POST['time'];
$student = $_POST['student'];
$student_roll = $_POST['stroll'];
$status = $_POST['status'];
$date=date_create_from_format("j-M-Y", $date);
$date= date_format($date,"Y-m-d");
$timestamp = date('Y-m-d H:i:s');
foreach($student as $k=>$v){
$st[] = array($subject_name, $subject_code, $department_name,
$department_short_name, $teacher_name, $date, $time, $timestamp, $v,
$student_roll[$k], $status[$k]); }
$db = new PDO('mysql:host=localhost;dbname=auto_attendance', 'root',
'');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert = $db->prepare(
'INSERT INTO student_attendance (subject_name , subject_code,
department_name, department_short_name,
teacher_name, date, time, timestamp, student_name, student_roll,
att_status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
foreach($st as $values) {
$result = $insert->execute($values);
}
if($result == true) {
echo "<script>alert('Record successfuly
Saved.');window.location.href='../student_attendance.php?page=take-
attendance';</script>";
}
else {
echo "<script>alert('Record couldnt be
Saved.');window.location.href='../student_attendance.php?page=take-
attendance';</script>";
}
}
?>
嗯,你的代码有点乱,所以我尽可能地清理了:
1。我更改了您的 if 语句,使其更具可读性,我还删除了 else 部分,因为如果未设置某些内容,您将重定向。
2。在每个 header()
调用之后也放置一个 exit();
。确保脚本执行已停止。
3。此外,我将您的数据库内容包装到一个 try and catch
块中以捕获 PDOExceptions
4。我还更改了 execute()
调用的分配,因为您想检查是否每次执行都成功,而不仅仅是最后一次
<?php
require_once("db_const.php");
function checkPostIndex(array $indexes = [""]) {
if(empty($indexes)) return FALSE;
return array_reduce($indexes, function($result, $v){
return $result && !empty($_POST[$v]);
}, TRUE);
}
$indexes = ["subject_name", "subject_code", "department_name", "department_short_name", "teacher_name", "date", "time", "student", "stroll", "status"];
if($_SERVER["REQUEST_METHOD"] !== "POST" || $_POST['submit'] !== "save" || checkPostIndex($indexes)) {
header("Location: ../student_attendance.php?page=take-attendance");
exit();
}
$subject_name = $_POST['subject_name'];
$subject_code = $_POST['subject_code'];
$department_name = $_POST['department_name'];
$department_short_name = $_POST['department_short_name'];
$teacher_name = $_POST['teacher_name'];
$date = $_POST['date'];
$time = $_POST['time'];
$student = $_POST['student'];
$student_roll = $_POST['stroll'];
$status = $_POST['status'];
$date = DateTime::createFromFormat("j-M-Y", $date)->format("Y-m-d");
$timestamp = date("Y-m-d H:i:s");
foreach($student as $k => $v) {
$tmpOne = (!empty($student_roll[$k])?$student_roll[$k]:"");
$tmpTwo = (!empty($status[$k])?$status[$k]:"");
$st[] = [$subject_name, $subject_code, $department_name, $department_short_name, $teacher_name, $date, $time, $timestamp, $v, $tmpOne, $tmpTwo];
}
try {
$db = new PDO("mysql:host=localhost;dbname=auto_attendance", "root", "");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert = $db->prepare('INSERT INTO student_attendance
(subject_name , subject_code, department_name, department_short_name, teacher_name, date, time, timestamp, student_name, student_roll, att_status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
foreach($st as $values) {
$result[] = $insert->execute($values);
}
} catch(PDOException $e) {
echo $e->getMessage();
}
?>
<script>alert('Record <?php echo (!in_array("FALSE", $result, true)?"successfuly":"couldnt be") ?> Saved.');window.location.href='../student_attendance.php?page=take-attendance';</script>
旁注:
在文件顶部添加 error reporting 以获得有用的错误消息:
<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
?>
(仅在测试时打开它,切勿在生产中打开!)
问题在于传递给 $_POST['status'] 的值;如果您追踪传递给此变量的内容,您会发现问题出在这里!
我有一个多维数组要插入 mysql table。尝试将日期时间时间与该数组中的其他元素一起添加。 但每次我收到这个错误。 :
Notice: Undefined offset: 10 in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php on line 47
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'att_status' cannot be null' in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php:60 Stack trace: #0 C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php(60): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\Auto-attendance\main\proccess_attendance.php on line 60
我不明白问题出在哪里。
<?php
require_once("db_const.php");
if (!$_SERVER['REQUEST_METHOD']=='POST'
|| !$_POST['submit']=='save'
|| empty($_POST['subject_name'])
|| empty($_POST['subject_code'])
|| empty($_POST['department_name'])
|| empty($_POST['department_short_name'])
|| empty($_POST['teacher_name'])
|| empty($_POST['date'])
|| empty($_POST['time'])
|| empty($_POST['student'])
|| empty($_POST['stroll'])
|| empty($_POST['status'])
) {
header('Location: ../student_attendance.php?page=take-attendance');
} else {
## connect mysql server
/** $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
# check connection
if ($mysqli->connect_errno) {
echo "<p>MySQL error no {$mysqli->connect_errno} :
{$mysqli->connect_error}</p>";
exit();
}**/
## query database
# prepare data for insertion 538 072 662 2716
$subject_name = $_POST['subject_name'];
$subject_code = $_POST['subject_code'];
$department_name = $_POST['department_name'];
$department_short_name = $_POST['department_short_name'];
$teacher_name = $_POST['teacher_name'];
$date = $_POST['date'];
$time = $_POST['time'];
$student = $_POST['student'];
$student_roll = $_POST['stroll'];
$status = $_POST['status'];
$date=date_create_from_format("j-M-Y", $date);
$date= date_format($date,"Y-m-d");
$timestamp = date('Y-m-d H:i:s');
foreach($student as $k=>$v){
$st[] = array($subject_name, $subject_code, $department_name,
$department_short_name, $teacher_name, $date, $time, $timestamp, $v,
$student_roll[$k], $status[$k]); }
$db = new PDO('mysql:host=localhost;dbname=auto_attendance', 'root',
'');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert = $db->prepare(
'INSERT INTO student_attendance (subject_name , subject_code,
department_name, department_short_name,
teacher_name, date, time, timestamp, student_name, student_roll,
att_status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
foreach($st as $values) {
$result = $insert->execute($values);
}
if($result == true) {
echo "<script>alert('Record successfuly
Saved.');window.location.href='../student_attendance.php?page=take-
attendance';</script>";
}
else {
echo "<script>alert('Record couldnt be
Saved.');window.location.href='../student_attendance.php?page=take-
attendance';</script>";
}
}
?>
嗯,你的代码有点乱,所以我尽可能地清理了:
1。我更改了您的 if 语句,使其更具可读性,我还删除了 else 部分,因为如果未设置某些内容,您将重定向。
2。在每个 header()
调用之后也放置一个 exit();
。确保脚本执行已停止。
3。此外,我将您的数据库内容包装到一个 try and catch
块中以捕获 PDOExceptions
4。我还更改了 execute()
调用的分配,因为您想检查是否每次执行都成功,而不仅仅是最后一次
<?php
require_once("db_const.php");
function checkPostIndex(array $indexes = [""]) {
if(empty($indexes)) return FALSE;
return array_reduce($indexes, function($result, $v){
return $result && !empty($_POST[$v]);
}, TRUE);
}
$indexes = ["subject_name", "subject_code", "department_name", "department_short_name", "teacher_name", "date", "time", "student", "stroll", "status"];
if($_SERVER["REQUEST_METHOD"] !== "POST" || $_POST['submit'] !== "save" || checkPostIndex($indexes)) {
header("Location: ../student_attendance.php?page=take-attendance");
exit();
}
$subject_name = $_POST['subject_name'];
$subject_code = $_POST['subject_code'];
$department_name = $_POST['department_name'];
$department_short_name = $_POST['department_short_name'];
$teacher_name = $_POST['teacher_name'];
$date = $_POST['date'];
$time = $_POST['time'];
$student = $_POST['student'];
$student_roll = $_POST['stroll'];
$status = $_POST['status'];
$date = DateTime::createFromFormat("j-M-Y", $date)->format("Y-m-d");
$timestamp = date("Y-m-d H:i:s");
foreach($student as $k => $v) {
$tmpOne = (!empty($student_roll[$k])?$student_roll[$k]:"");
$tmpTwo = (!empty($status[$k])?$status[$k]:"");
$st[] = [$subject_name, $subject_code, $department_name, $department_short_name, $teacher_name, $date, $time, $timestamp, $v, $tmpOne, $tmpTwo];
}
try {
$db = new PDO("mysql:host=localhost;dbname=auto_attendance", "root", "");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insert = $db->prepare('INSERT INTO student_attendance
(subject_name , subject_code, department_name, department_short_name, teacher_name, date, time, timestamp, student_name, student_roll, att_status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
foreach($st as $values) {
$result[] = $insert->execute($values);
}
} catch(PDOException $e) {
echo $e->getMessage();
}
?>
<script>alert('Record <?php echo (!in_array("FALSE", $result, true)?"successfuly":"couldnt be") ?> Saved.');window.location.href='../student_attendance.php?page=take-attendance';</script>
旁注:
在文件顶部添加 error reporting 以获得有用的错误消息:
<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
?>
(仅在测试时打开它,切勿在生产中打开!)
问题在于传递给 $_POST['status'] 的值;如果您追踪传递给此变量的内容,您会发现问题出在这里!