2015-04-08 7 views
-4

У меня есть многомерный массив для вставки в таблицу mysql. Попытка добавить время datetime вместе с другими элементами в этом массиве. , но каждый раз я получаю эту ошибку. :Вставка многодиапазонного массива в mysql с pdo

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

Похоже, что все, что вы проходите, для att_status не может быть нулевым, вам может потребоваться проверить, что передано в '$ _POST ['status']' –

+1

Покажите нам инструкцию CREATE TABLE для таблицы student_attendance – user4035

+1

'var_dump (var_dump (var_dump) $ status) 'after' $ status = $ _POST ['status']; ' – user4035

ответ

2

Ну ваш код немного беспорядка, поэтому я очистил столько, сколько я мог:

1. Я изменил ваше заявление, если так, что это немного более удобной для чтения и я удалить ELSE частично, поскольку вы перенаправляете, если что-то не задано.

2. Также поместите exit(); после каждого звонка header(). Чтобы убедиться, что выполнение скрипта остановлено.

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

(Включите его только во время тестирования, никогда в производстве!)

+0

Я не думаю, что очистка их грязного кода уступила и ответит здесь! Вопрос: «Я не понимаю, где проблема». ошибка: «Столбец« att_status »не может быть« null ». – webternals

+0

@webternals Вы абсолютно правы; Нам нужно увидеть схему таблицы, а также нам нужно знать, какая строка - строка 47 с неопределенным смещением, но я думаю, что если OP использует очищенный код, мы можем лучше определить ошибки и не искать в беспорядочном коде – Rizier123

0

Проблема с значение передается в до $ _POST [ 'статус']; Если вы отследите, что передается этой переменной, вы обнаружите, что это проблема!

+0

вот в чем дело, спасибо. –

+2

@BorhanNirob Вы даже читаете комментарии ?! Это уже было указано 30 минут назад! Как 5 раз !! – Rizier123

Смежные вопросы