Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Динамическая форма с произвольным числом элементов
 
 автор: Vados   (29.08.2006 в 20:41)   письмо автору
 
 

Всем привет!
Не совсем понимаю, принцип работы, массивов, точнее что мне делать.
Задача такая, у меня есть динамическая форма, которая может добавляться n кол-во раз.
Понятно, что необходимо использовать массивы, вот что я делаю:

<form name="" action="" method="post">
 
<tr><td><p class=zag2>Модель HDD1:</td>
<td><input size=15 class=input type=text name=hddtype[] value='<?php echo $hddtype?>'></td>
<td><p class=zag2>Размер HDD1:</td>
<td>
<input size=4 class=input type=text name=hddsize[] value='<?php echo $hddsize?>'></td><td><p class=zag2>Дата установки:</td>
<td>
<input size=2 maxlength=2 class=input type=text name=hddday[] value='<?php echo $hdddate?>'>&nbsp;
<input size=2 maxlength=2 class=input type=text name=hddmonth[] value='<?php echo $hdddate?>'>&nbsp;
<input size=4 maxlength=4 class=input type=text name=hddyear[] value='<?php echo $hdddate?>'>&nbsp;&nbsp;
<input type="button" name="drop" value=" &minus; " onblur="" onclick="dropFile(this);"><input type="button" value=" + " onclick="addFile(this);"></td></tr>    
 
<input type="submit" value="Send">
<?php
echo "<pre>";
print_r($_POST);
echo 
"</pre>";
if()
    
?>
</form>


Сам javascript:

function dropFile(btn){
    if(document.getElementById) {
        tr = btn;
        while (tr.tagName != 'TR') tr = tr.parentNode;
        tr.parentNode.removeChild(tr);
        checkForLast();
    }
}
function addFile(btn){
    if(document.getElementById) {
        tr = btn;
        while (tr.tagName != 'TR') tr = tr.parentNode;
        var idSuffix = Math.round(Math.random()*1000);
        var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);
        thisChilds = newTr.getElementsByTagName('td');
        for (var i = 0; i < thisChilds.length; i++){
            if (thisChilds[i].className == 'header') thisChilds[i].innerHTML = '';
            if (thisChilds[i].className == 'files') thisChilds[i].innerHTML = '<input size="32" name="att" class="wideFile" type="file">';
        }
        checkForLast();
    }
}
function checkForLast(){
    btns = document.getElementsByName('drop');
    for (i = 0; i < btns.length; i++){
        btns[i].disabled = (btns.length == 1) ? true : false;
    }
}


Так вот, а как мне теперь всё это проверить, допустим заполнил пользователь форму или нет, ведь он может добавлять сколько угодно форм?
И как мне реализовать передачу всех этих значений в базу данных?
Что ха чем нужно делать и как?
Возможно есть уже готовые примеры.
Ведь их же снова, может быть не ограничего?
Мне непонятен сам механизм этой работы!
Инфо о массивах я прочитал, поиском также пользовался!
Помогите пожалуйста!
Заранее спасибо!

   
 
 автор: Vados   (29.08.2006 в 22:42)   письмо автору
 
   для: Vados   (29.08.2006 в 20:41)
 

С первой задачей я справился, то есть разобрался с выводом массивов:

<?php
foreach ($_POST['hddtype'] as $hddtype)  {
    print 
$hddtype;
}
foreach (
$_POST['hddsize'] as $hddsize)  {
    print 
$hddsize;
}
foreach (
$_POST['hddday'] as $hddday)  {
    print 
$hddday;
}
foreach (
$_POST['hddmonth'] as $hddmonth)  {
    print 
$hddmonth;
}
foreach (
$_POST['hddyear'] as $hddyear)  {
    print 
$hddyear;
}
?>


А как же мне теперь всё это полученное передать в переменные для занесения в БД?
То есть мне необходимо, чтобы соответствовало: hddtype[o] hddsize[0] hddday[0] hddmonth[0] hddyear[0] и.т.д.

Заранее спасибо!

   
 
 автор: Vados   (30.08.2006 в 10:47)   письмо автору
 
   для: Vados   (29.08.2006 в 22:42)
 

Кто-нибудь может мне помочь?

   
 
 автор: cheops   (30.08.2006 в 12:38)   письмо автору
 
   для: Vados   (29.08.2006 в 22:42)
 

Массивы $_POST['hddsize'] и т.д. являются двумерными - обращайтесь ко второму индексу
<?php
echo $_POST['hddsize'][0];
?>

   
 
 автор: Vados   (30.08.2006 в 18:32)   письмо автору
 
   для: cheops   (30.08.2006 в 12:38)
 

А как считать все эти двумерные массивы?
Я имею ввиду на заполнение, если к примеру $_POST['hddsize'][2] - заполнен передать его?

   
 
 автор: valenok   (30.08.2006 в 18:53)   письмо автору
 
   для: Vados   (30.08.2006 в 18:32)
 

if(isset( $_POST['hddsize'][2] ))

   
 
 автор: Vados   (01.09.2006 в 20:17)   письмо автору
 
   для: valenok   (30.08.2006 в 18:53)
 

Всем привет!
Столько времени уже убил, но так ничего у меня и не получилось.
Ситуация сейчас какая:
1) форма у меня немного поменялась:

<form name='' action='' method='post'>
<tr>
<td><p class=zag2>Модель HDD1:</td>
<td><input size=15 class=input type=text name=hdd[0][] value=''></td>
<td><p class=zag2>Размер HDD1:</td>
<td>
<input size=4 class=input type=text name=hdd[1][] value=''></td>
<td><p class=zag2>Дата установки:</td>
<td>
<input size=2 maxlength=2 class=input type=text name=hdd[2][] value=''>&nbsp;
<input size=2 maxlength=2 class=input type=text name=hdd[3][] value=''>&nbsp;
<input size=4 maxlength=4 class=input type=text name=hdd[4][] value=''>&nbsp;
&nbsp;<input type='button' name='drop' value=' &minus; ' onblur='' onclick='dropFile(this);'><input type='button' value=' + ' onclick='addFile(this);'></td>
</tr>
<input type='submit' value='Send'>
</form>    


То есть теперь в ней присутствуют массивы hdd[1][], hdd[2][], hdd[3][], hdd[4][], hdd[5][].
Так вот вопрос, как мне теперь эти всё параметры массива не просто перебрать, а передать в функции, для передачи значений процедуре?

Вот как я это делаю, с обычными переменными:

$storeProc = mssql_init('inventory.dbo.test_1');
mssql_bind($storeProc,"@hddtype",$_POST['hdd'][0][$i],SQLVARCHAR);
mssql_bind($storeProc,"@hddsize",$_POST['hdd'][1][$i],SQLINT4);
mssql_bind($storeProc,"@hdddate",$hdddate,SQLVARCHAR);
mssql_bind($storeProc,"@qqq",$qqq,SQLVARCHAR);
$result = mssql_execute($storeProc);


Каким циклом или как мне воспользоваться, чтобы к примеру можно было было пройти по циклу и записать в один цикл значения к примеру: hdd[1][0], hdd[2][0], hdd[3][0], hdd[4][0], hdd[5][0] и так далее?

Подскажите на реальном примере!

Буду очень благодарен.

   
 
 автор: Vados   (01.09.2006 в 21:16)   письмо автору
 
   для: Vados   (01.09.2006 в 20:17)
 

Прошу помогите, очень нужно!

   
 
 автор: Drago   (02.09.2006 в 01:43)   письмо автору
 
   для: Vados   (01.09.2006 в 21:16)
 


<?
for ($i=0;$i<count($hdd);$i++)
  {
    echo 
$hdd[$i][0];
  }
?>

Вместо echo, делаете с переменно то, что вам нужно.

   
 
 автор: Vados   (02.09.2006 в 03:18)   письмо автору
 
   для: Drago   (02.09.2006 в 01:43)
 

Спасибо!
А как быть с тем, что у меня как раз фиксированное значение массива в hdd[0][], hdd[1][],hdd[2][],hdd[3][],hdd[4][], а вот так может быть:
hdd[0][0], hdd[1][0],hdd[2][0],hdd[3][0],hdd[4][0]
hdd[0][1], hdd[1][1],hdd[2][1],hdd[3][1],hdd[4][1]
hdd[0][2], hdd[1][2],hdd[2][2],hdd[3][2],hdd[4][2] и так далее.
Вопрос, как сдклать так, чтобы у меня цикл перебирал значения таким образом:


hdd[0][0], hdd[1][0].............
[b]hdd[0][1], hdd[1][1]...........
[b]hdd[0][2], hdd[1][2]..............

и так далее....

Заранее спасибо!

   
 
 автор: Vados   (02.09.2006 в 14:49)   письмо автору
 
   для: Vados   (02.09.2006 в 03:18)
 

Ребята, прошу помогите!

   
 
 автор: Vados   (02.09.2006 в 16:16)   письмо автору
 
   для: Vados   (02.09.2006 в 14:49)
 

Ну что-то ничего с этим не получается :-))
Профи и не только помогите :-))

   
 
 автор: Евгений Петров   (02.09.2006 в 16:27)   письмо автору
 
   для: Vados   (02.09.2006 в 16:16)
 

Вопрос, как сдклать так, чтобы у меня цикл перебирал значения таким образом:
hdd[0][0], hdd[1][0]...
hdd[0][1], hdd[1][1]...
hdd[0][2], hdd[1][2]...

и так далее....

Ну эм а:
for(i = 0; i < hdd[0].length; i++)
{
    for(j = 0; j < hdd.length; j++)
    {
        alert(hdd[j][i]);
    }
}

   
 
 автор: Vados   (02.09.2006 в 16:36)   письмо автору
 
   для: Евгений Петров   (02.09.2006 в 16:27)
 

Не совсем понимаю, мысль, то есть использовать это при помощи своего javascript скрипта?
Можете детальнее объяснить...
Спасибо, Евгений!

   
 
 автор: Евгений Петров   (02.09.2006 в 16:39)   письмо автору
 
   для: Vados   (02.09.2006 в 16:36)
 

Ну Вы просили массив обойти в определенном порядке :) Я не совсем пойму в чем проблемма... Насколько я понял пользователь при помощи JS может добавить новые поля формы. И эти поля все должны потом передаться скрипту? В каком месте проблемма?

   
 
 автор: Vados   (02.09.2006 в 19:23)   письмо автору
 
   для: Евгений Петров   (02.09.2006 в 16:39)
 

Мне необходимо, обойти массив в таком порядке, верно, и так верно то, что для добавления новых полей в форме я использую скрипт, но для подсчёта кол-ва заполненных форм я и использую такой массив: hdd[0][], где [0] -первый элемент массива, а их может быть всего 5 у меня, то есть соответственно фиксированный, следующий парамет [] - оставляю его пустым, так как именно этот парамет массива считает кол-во заполненных полей пользователем, так как их может быть неограниченное кол-во.
Каким именно обрахом не поступить, чтобы подсчитать это всё в порядке:


hdd[0][0], hdd[1][0].............
hdd[0][1], hdd[1][1]...........
hdd[0][2], hdd[1][2]..............


и.т.д.

   
 
 автор: Евгений Петров   (02.09.2006 в 19:26)   письмо автору
 
   для: Vados   (02.09.2006 в 19:23)
 

посчитать надо на стороне клиента или сервера?

   
 
 автор: Vados   (02.09.2006 в 19:37)   письмо автору
 
   для: Евгений Петров   (02.09.2006 в 19:26)
 

На стороне сервера, при нажатии на кнопку к примеру "отправить", но мне всё это необходимо сделать для того, чтобы потом зная, длину, можно было передать этот массив, обращаясь конктретно нужному элементу массива в процедуру, вот пример процедуры:

$storeProc = mssql_init('inventory.dbo.test_1');
mssql_bind($storeProc,"@hddtype",$_POST['hdd'][$i][$j],SQLVARCHAR);
mssql_bind($storeProc,"@hddsize",$_POST['hdd'][$i][$j],SQLINT4);
mssql_bind($storeProc,"@hdddate",$_POST['hdd'][$i][$j],SQLVARCHAR);
...............................................................................................
mssql_bind($storeProc,"@qqq",$qqq,SQLVARCHAR);
$result = mssql_execute($storeProc); 

Когда я использую, например такой цикл:


for ($i = 0; $i <= count($_POST['hdd'][0][$j]); $i++)
 {  
     for ($j = 0; $j <= count($_POST['hdd'][$i]); $j++)
   {
   echo '  '.$_POST['hdd'][$i][$j];
   }
 }


У меня ничего не получается!
Может быть я не правильно к нему обращаюсь?
Евгений, у вас есть ICQ, можно номер?
Спасибо!

   
 
 автор: Евгений Петров   (02.09.2006 в 19:40)   письмо автору
 
   для: Vados   (02.09.2006 в 19:37)
 

В инфе написан

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования