Какие причины: «Обратите внимание: появилось неинициализированное смещение строки»?

У меня есть форма, которую заполняют пользователи. В форме есть несколько одинаковых полей, таких как «имя проекта», «дата проекта», «категория» и т. Д. В зависимости от того, сколько форм пользователь отправляет:

Моя цель:

  1. цикл по числу форм
  2. создавать отдельные инструкции вставки SQL

Однако PHP бросает мне УВЕДОМЛЕНИЕ, которое я, похоже, не понимаю:

Обратите внимание:

Примечание. Неинициализированное смещение строки: 1 … dataPasser.php в строке 90

PHP

$myQuery = array(); if ($varsCount != 0) { for ($i=0; $i <= $varsCount; $i++) { $var = "insert into projectData values ('" . $catagory[$i] . "', '" . $task[$i] . "', '" . $fullText[$i] . "', '" . $dueDate[$i] . "', null, '" . $empId[$i] ."')"; array_push($myQuery, $var); } } 

Есть ссылки на этот вопрос, который у меня есть, но они не являются точными, и у меня возникают проблемы с выводом того, откуда возникает настоящая проблема. Я был бы очень признателен за любую помощь в понимании того, что заставляет массив не инициализировать должным образом.

Эта ошибка возникла бы, если бы какая-либо из следующих переменных была фактически строками или null вместо массивов, и в этом случае обращение к ним с синтаксисом массива $var[$i] было бы похоже на попытку доступа к определенному символу в строке:

 $catagory $task $fullText $dueDate $empId : $catagory $task $fullText $dueDate $empId , $catagory $task $fullText $dueDate $empId 

Короче говоря, все в вашем запросе вставки.

Возможно, переменная $catagory имеет орфографическую ошибку?

Это означает, что один из ваших массивов на самом деле не массив.

Кстати, ваша проверка не нужна. Если $ varsCount равен 0, цикл for не будет выполняться в любом случае.

Ошибка может произойти, когда количество повторений массива больше, чем фактический размер массива. например:

  $one="909"; for($i=0;$i<10;$i++) echo ' '.$one[$i]; 

покажет ошибку. первый случай u может взять mod i .. например

 function mod($i,$length){ $m = $i % $size; if ($m > $size) mod($m,$size) return $m; } for($i=0;$i<10;$i++) { $k=mod($i,3); echo ' '.$one[$k]; } 

или, может быть, это не массив (возможно, это значение, и вы пытались получить к нему доступ, например массив):

 $k = 2; $k[0]; 

Попробуйте протестировать и инициализировать свои массивы до их использования:

 if( !isset($catagory[$i]) ) $catagory[$i] = '' ; if( !isset($task[$i]) ) $task[$i] = '' ; if( !isset($fullText[$i]) ) $fullText[$i] = '' ; if( !isset($dueDate[$i]) ) $dueDate[$i] = '' ; if( !isset($empId[$i]) ) $empId[$i] = '' ; 

Если $catagory[$i] не существует, вы создаете (неинициализированный) один … вот и все; => PHP попытается прочитать в вашей таблице адрес $i , но по этому адресу ничего нет, этот адрес не существует => PHP возвращает вам уведомление, и оно ничего не помещает вам в строку. Таким образом, вы не очень чисты, вам нужны ресурсы, которые снижают производительность вашего сервера (очень мало).

Позаботьтесь о значениях по умолчанию для таблиц MySQL

 if( !isset($dueDate[$i]) ) $dueDate[$i] = '0000-00-00 00:00:00' ; 

или

 if( !isset($dueDate[$i]) ) $dueDate[$i] = 'NULL' ; 

Проверьте содержимое своего массива с помощью

 echo '<pre>' . print_r( $arr, TRUE ) . '</pre>';