2014-12-13 3 views
0

У меня есть форма:Как сохранить порядок добавленных входов в php?

<form id="myForm" method="post" action="" enctype="multipart/form-data"> 
    <button type="button" onClick="addFile()">Add file</button> 
    <button type="button" onClick="addText()">Add text</button> 
    <input type="submit" value="submit"> 
</form> 

добавить входы в форму с помощью JavaScript:

var form; 
window.onload=function(){ 
    form=document.getElementById("myForm"); 
    } 
function addFile(){ 
    var input=document.createElement("input"); 
    input.type="file"; 
    input.name="files[]"; 
    form.appendChild(input); 
    } 
function addText(){ 
    var input=document.createElement("input"); 
    input.type="text"; 
    input.name="texts[]"; 
    form.appendChild(input); 
    } 

Я хотел бы сохранить порядок, в котором были добавлены входы. поэтому в PHP я мог бы сделать что-то вроде этого:

foreach($_POST["texts"] as $text){ 
    $db -> insert("table", $text, $index); 
    } 
foreach($_POST["file_paths"] as $path){ 
    $db -> insert("table", $path, $index); 
    } 

Таким образом, в базе данных я мог бы что-то вроде этого:

0 "TEXT1"
1 "Данные/дата загрузки/image.jpg"
2 "text2"

Я попытался добавить все содержимое в массив в $ _POST, а затем массив_search(), чтобы получить индекс, но он не будет работать, когда содержимое двух входов будет одинаковым, и оно кажется неаккуратным.

Итак, как бы вы справились с такой задачей?

+0

Вы рассмотренного фактические HTTP транзакции? –

+0

нет. Не могли бы вы подробнее рассказать об этом? –

+0

Что такое '$ index'? Вы не определяете это! –

ответ

0

Добавить скрытый ввод каждый раз, когда вы добавляете вход в форму и дать ему значение переменной, которую будет увеличиваться с каждым добавлением:

var index = 0; 

function addHidden(){ 
    var input=document.createElement("input"); 
    input.type="hidden"; 
    input.value=index; 
    input.name="hidden" + (index++); 
    form.appendChild(input); 
} 

В PHP сторона:

var $index = 0; 

foreach($_POST["texts"] as $text){ 
    $db -> insert("table", $text, $_POST["hidden" + ($index++)]); 
} 
0

Привет, я не уверен, что понял вопрос. По умолчанию у них будет порядок, в который они добавлены. Не нужно получать правильный индекс в цикле.

foreach($_POST["texts"] as $index => $text){ 
    $db -> insert("table", $text, $index) 
} 

Почему вы не можете просто сделать индекс как этого

Ваши данные будут, как это по умолчанию

array(
    0 => 'some_text', 
    1 => 'some_text', 
    2 => 'some_other_text', 
    3 => 'some_text' 

Ваш цикл будет генерировать этот

$index = 0; 
$text = 'some_text'; 
//----------------- 
$index = 1; 
$text = 'some_text'; 
//----------------- 
$index = 2; 
$text = 'some_other_text'; 
//----------------- 
$index = 3; 
$text = 'some_text'; 
//----------------- 

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

UPDATE после разговора в комментариях я хотел бы сделать что-то вроде этого (не проверял этот код)

Javascript:

var index = 0; 

function addFile(){ 
    var input=document.createElement("input"); 
    input.type="file"; 
    input.name="inp_file_" + index; 
    form.appendChild(input); 
    ++index; 
} 

function addText(){ 
    var input=document.createElement("input"); 
    input.type="text"; 
    input.name="inp_text_" + index; 
    form.appendChild(input); 
    ++index; 
} 

В PHP стороне:

//merge $_POST and $_FILES ~ 
//I don't feel like sorting that out as it should be easy to do for you, also you may 
//be doing other things with the $_FILES array, but what you want is something like this 
// for the input array. 
// one last note as I saw you said you tried merging the $_FILES into the $_POST array, it's generally a bad practice to modify the $_POST array, and is better to create a new array with the data you want. 
$input = array( 
    'inp_text_0' => 'some_text', 
    'inp_text_2' => 'some_other_text', 
    'inp_file_1' => 'filepath.txt' 
); 

foreach ($input as $key => $value){ 
    if(preg_match('/^inp_(?P<type>text|file)_(?P<index>[0-9]+)$/', $key, $match)){ 
     $db -> insert("table", $value, $match['index'], $match['type']);  
    } 
} 

Для Regx (?P<name> ..) является названной группой захвата, это необязательно, но это помогает сделать пример ясным. В основном вы создаете список входов, имя которых будет соответствовать этому шаблону.

  • ^ - начало строки
  • inp_ - соответствует тексту "inp_" буквально
  • (?P<type>text|file) - назвал захват как тип "Текст" или "файл"
  • _ - соответствует тексту " _ «буквально» добавлено просто для ясности, т.е. она выглядит лучше
  • (?P<index>[0-9]+) - назвал захват в качестве индекса одного или нескольких цифр от 0 до 9
  • $ конца матча строки

Regx Демо https://regex101.com/r/nZ7iO5/1

+0

Он будет работать с текстовыми вводами, но не будет работать с файлами. Все пути файла передаются в этот скрипт, они находятся в другом массиве, и их индексы не будут в правильном порядке. –

+0

Что вы имеете в виду не в правильном порядке, они будут в том порядке, в котором они созданы. – ArtisticPhoenix

+0

если у меня есть 2 массива, один из них - $ text [], другой - $ files []. зацикливания корыто $ тексты [] вставит: 0 "text1" 1 "text2", и т.д .. зацикливание корыто $ файлов [] вставит: 0 "файлы1" 1 "files2", и т.д .. это Кстати, я мог бы иметь несколько содержимого с тем же индексом –

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