2013-10-08 3 views
1

У меня возникла проблема. У меня есть куча входов, которые имеют одно и то же имя. Это создает массивы, которые помещаются в базу данных и что все работает нормально, но у меня есть основная дилемма, пытаясь сохранить пустые строки входов от создания пустых записей в таблице базы данных.Ограничить цикл цикла от вставки пустых строк MySQL

код как таковой:

foreach($_POST['datetime'] as $dbrow=>$startdate) { 
if(isset($_POST['def'])) { 
$start = $startdate; 
$abc = $_POST['abc'][$dbrow]; 
$def = $_POST['def'][$dbrow]; 
$ghi = $_POST['ghi'][$dbrow]; 


$db_insert = "INSERT INTO tablename (start, abc, def, ghi) VALUES('$start', '$abc', '$def', '$ghi')"; 

Это нормально, и денди, но я не могу получить, если заявление на работу. Форма, использующая POST для получения информации о пользователях, имеет 5 строк входов с четырьмя столбцами (start, abc, def, ghi). Если я введу данные в форму и отправлю ее, то все данные поступают в базу данных (yay - success), если я только вводю данные в строках 1-4, тогда база данных все еще вводит 5 строк данных. Что я делаю не так?

--------------------- EDIT --------------------- Хорошо, поэтому при более глубоком взгляде, что, по-видимому, происходит, это код, который хочет представить ВСЕ строки динамически генерируемых входов, независимо от того, содержат ли они контент или нет. Поэтому я придумал следующий код:

$db_tur = count(array_filter($start_date)); 
for($db_total_used_rows=0;$db_total_used_rows<=$db_tur;$db_total_used_rows++){ 


$db_start_date = $_POST['datetime'][$db_total_used_rows]; 
$db_abc = $_POST['abc'][$db_total_used_rows]; 
$db_def = $_POST['def'][$db_total_used_rows]; 
$db_ghi = $_POST['ghi'][$db_total_used_rows]; 


} 

$db_insert = .....; 

В теории, что это делает $ db_tur подсчитывает все входы используются под start_date переменной. Затем я разбиваю его на массив count, который должен быть использован как $ db_total_used_rows. Однако, похоже, это не ограничивает общее количество строк входов, вставленных в базу данных. Поэтому я думаю, что он вернулся к чертежной доске, если у кого-то еще не было лучшего представления о том, как это сделать. Я так готов отказаться сейчас.

+0

Почему вы проверяете, установлен ли 'if (isset ($ _ POST ['def']))'? Почему не просто 'if (isset ($ startdate))'? –

+1

Почему вы не проверяете значения, входящие в & если они пусты, пропустите выполнение запроса для них. –

+0

В этом коде есть некоторые уязвимости в SQL-инъекции ... –

ответ

1

Используйте эту структуру цикла:

foreach ($_POST['datetime'] as $dbrow => $start) { 
    $abc = $_POST['abc'][$dbrow]; 
    $def = $_POST['def'][$dbrow]; 
    $ghi = $_POST['ghi'][$dbrow]; 
    if (!empty($abc) && !empty($def) && !empty($ghi) && !empty($start)) { 
     $db_insert = ...; 
     ... 
    } 
} 

Вы можете изменить && к ||, если это нормально для пользователя, чтобы оставить некоторые поля пустыми - это только пропуск строки где все поля пусты.

+0

Чтобы уточнить, предлагаете ли вы удалить часть цикла, где я добавляю количество строк для каждой переменной POSTED? То есть. удаление $ abc = $ _POST ['abc'] [$ dbrow]; –

+0

См. Обновленный ответ. – Barmar

+0

Удивительный, не могу дождаться, чтобы попробовать! –

0

За исключением флажков, все поля формы будут POST, даже если они пусты. Поэтому, если def - это текстовое поле, оно всегда будет присутствовать в вашем POST. Лучше испытание было бы

if(!empty($_POST['def'])) { 
+0

Это только проверяет, пусты ли все строки. Он не отфильтровывает отдельные пустые строки. – Barmar

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

  • Нет связанных вопросов^_^