[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Формирование массивов из массива
Grey
Здравствуйте.
Есть форма
PHP
$q "SELECT id,imya,otchest,familia FROM users ";
         
$r mysql_query($q);
         
$strok mysql_num_rows($r); //узнал количество строк, на будущее
         
echo $strok
echo 
'<form method="post" name="forma" action="add_score.php">';
 echo 
'<input name="kolvo" value="'.$strok.'">';//отсылаем количество строк
$q=1;
       while(
$users mysql_fetch_assoc($r))
       {
         echo 
'<input name="data'.$q.'[id]" value="'.$users['id'].'"><input name="data'.$q.'[fam]" value="'.$users['familia'].'"><input name="data'.$q.'[name]" value="'.$users['imya'].'"><select name="data'.$q.'[otm]"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="б">б</option><option value="н">н</option></select><br>';
        
$q++;
       }
       echo 
'<input type="submit"';
       echo 
'</form>';


Таким образом на экран получаю несколько юзеров, которым можно выставить баллы, каждому. Далее шлем в обработчик
Обработчик.

PHP
$k $_POST['kolvo'];//получили количество строк, ну или массивов
$data=array(
$_REQUEST ['data1'],$_REQUEST ['data2],$_REQUEST ['data3]
);


Так получается рабочий массив, если писать вручную.
Но нужно автоматизировать это дело. что-то примерно так

PHP
$i=0;
$w=0;
$q 'data'.$w;
$data=array(
$_REQUEST [$q]
);

Таким образом, наименование массивов зависит от переменной $w, которую нужно увеличивать до значения $k, пока она не станет ей равной. таким образом можно загнать в массив $data все полученные из формы массивы.
Все что пытаюсь написать $data=array(вот здесь, математические операции, цикл for); - все выдает ошибки. Как можно решить данную задачу?



Спустя 1 час, 53 минуты, 42 секунды (21.03.2009 - 22:43) sergeiss написал(а):
Во-первых, мне лично не понятно, зачем ты используешь инпуты для показа фамилии-имени юзеров? Тот, кто выставляет баллы, может случайно поменять эти фамилии.
Тебе надо или делать инпуты readonly, или просто выводить информацию в виде текста (фамилию-имя).
Инпут для id вообще не нужен. Его в другом месте можно закодировать.

Далее. Предполагаем, что ты оставил только select для выбора оценок. Их имена лучше сформировать так, чтобы как раз они содержали id:
PHP
'<select name="ochenka'.$users['id'].'">';

Тогда ты потом сможешь легко и просто идентифицировать, кому какая оценка была выставлена.

На принимающей стороне просто перебираешь в цикле массив $_REQUEST или $_POST. Если первые символы ключа - 'ochenka', то тогда из "хвоста" ключа извлекаешь цифры. Это и будет айди юзера, к которому относится эта оценка. И, собственно, саму оценку тоже получишь, из величины.
А там уж или в массив отдельный загоняй, или сразу используй - как хошь smile.gif

Спустя 7 минут, 5 секунд (21.03.2009 - 22:50) sergeiss написал(а):
Да, сразу не написал. Чегой-то забыл, хотя и хотел.

Для передачи информации, которую не надо менять или даже показывать при редактировании, например, количество юзеров, можно передавать в инпуте с типом "hidden". Тогда и данные будут переданы, и на экране лишнего маячить не будет.

Спустя 1 час, 35 минут, 12 секунд (22.03.2009 - 00:25) Grey написал(а):
да с хидденом все понятно, все в текстовых полях -это просто текстовый вариант:) . для себя делал. нужно передать id юзера, и содержание списка селект. проблема в том, что мне далее нужно кучей записать это в базу.
вот так:
PHP
$query="INSERT INTO childrens (imya,birtsday) VALUES";

foreach(
$data as $value){

    if($i==0){

        $query.="('".$value['id']."','".$value['otm']."')";

    }else{

        $query.=",('".$value['id']."','".$value['otm']."')";

    }

    $i++;

}
mysql_query($query);

а для этого как-то сформировать массив вида
PHP
$data=array(
$_REQUEST ['data1'],$_REQUEST ['data2'],$_REQUEST ['data3'] //и так далее
);

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

Спустя 10 минут, 32 секунды (22.03.2009 - 00:36) twin написал(а):
Ты же формируешь массив в форме, зачем потом мудрить с ключами, еcли можно сразу смотреть элементы массива:
PHP
'<select name="data_otm['.$q.']">'

Спустя 17 минут, 52 секунды (22.03.2009 - 00:54) Grey написал(а):
я из формы получаю (в зависимости от числа юзеров):
PHP
$_REQUEST[data1]
$_REQUEST[data2]
$_REQUEST[data3]
$_REQUEST[data4]
$_REQUEST[data5]

и так далее.
Получается разом несколько массивов.
А далее нужен массив
PHP
$data = array (все полученные массивы);


вот примерно так(только это не работает, только отражает логику)


PHP
$w=w;
$q = 'data'.$w;
$data=array(
while (w<=$strokwink.gif
{
$_REQUEST ['$q']
 $w++
}
);


где $strok - количесто строк, полученных в прошлом скрипте, в форме.
И с темой запарился - точнее будет "Ормирование массива из массивов"

Спустя 8 часов, 57 минут, 51 секунда (22.03.2009 - 09:52) Ka4_0k написал(а):
Читаю всю тему,я так понял тебе нужен двумерный массив? А потом ты хочешь его в базу занести? Хм...
PHP
while($i<=_кол-во массивов)
{
 while($j <=кол-во значений в массиве)
{
$mas[$i, $j] = $_REQUEST[$j];/*тоесть здесь ты присваиваешь массиву $mas[1, j] j значение массива $_REQUEST[j]. Например $mas[1,2] = $_REQUEST[2]*/
$j++}; 
$i
++
};

P.S. Если не так понял, поправьте.

Спустя 1 час, 18 минут, 49 секунд (22.03.2009 - 11:10) twin написал(а):
Ну с двухмерным массивом вот так проще:
PHP
echo '<input name="data['.$q.'][id]" value="'.$users['id'].'">
<input name="data['
.$q.'][fam]" value="'.$users['familia'].'">
<input name="data['
.$q.'][name]" value="'.$users['imya'].'">
<select name="data['
.$q.'][otm]">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="б">б</option>
<option value="н">н</option>
</select><br>'
;

foreach(
$_POST['data'] as $fileds => $val)
    if($val['id'])
    $values[] ="(".$val['id']."','".$val['otm']."')";
mysql_query($query.implode(", ",$values))
Только с кирилицей в value поосторожнее, не всем браузерам понятно.

Спустя 1 день, 2 часа, 19 минут, 36 секунд (23.03.2009 - 13:30) Grey написал(а):
Снова здравствуйте. Разобрался наконец-то. И возник еще вопрос
Вид теперь такой
Форма:
PHP
require "../config.php";
$id_street= $_GET['id_street'];
         $q = "SELECT id,imya,otchest,familia FROM users WHERE id_street='$id_street'";
         $r = mysql_query($q);
         $strok = mysql_num_rows($r); //получили количество юзеров
         $date = date("d.m.Y");
 echo '<form method="post" name="forma" action="o6pa6ot4er.php">';
 echo '<input type="hidden" name="strok" value="'.$strok.'">';
$q=1;
       while($users = mysql_fetch_assoc($r))
       {
         echo '<input type="hidden" name="data'.$q.'[id]" value="'.$users['id'].'"><input type="hidden" name="data'.$q.'[date]" value="'.$date.'">'.$users["familia"].'&nbsp;&nbsp;'.$users["imya"];
                echo '<select name="data'.$q.'[otm]"><option value="">&nbsp;</option>';
                $query = "SELECT * FROM otmetki";
                $row = mysql_query($query);
                while($ball = mysql_fetch_array($row)) //получаем список возможных баллов в выпадающий список
                {
                   echo '<option value="'.$ball['id'].'">'.$ball['naim'].'</option>';
                }
                   echo '</select><br>';
        $q++; //увеличиваем на 1
       }
       echo '<input type="submit"';
       echo '</form>';


В итоге получаем: ид юзера, текущее время, фамилию, имя и ид. балла.
передаем id юзера, текущее время и id балла в обработчик:
PHP
require "../config.php";
$strok = $_POST['strok']; //получили колличество строк
$i=0;
$q=1;
while ($q <= $strok) {   //пока не будет равно количеству принятых массивов, выполнять
$data[]= $_REQUEST ['data'.$q]; //получили двухмерный массив data
$q++;
 }
//пишем в базу.
$query="INSERT INTO otm (id_user,date_otm,id_otm) VALUES";
foreach(
$data as $value){

    if($i==0){

       $query.="('".$value['id']."','".$value['date']."','".$value['otm']."')";

    }else{

        $query.=",('".$value['id']."','".$value['date']."','".$value['otm']."')";

    }
         $i++;
}
mysql_query($query);

Все работает, но встала другая проблема:
Выводится весь список людей с определенной улицы(в форме). Допустим, баллы выставляются не всем. Но в форме они все. Как избежать вставки в базу пустых значений? ведь отправляются ВСЕ юзеры из формы в один массив.??

Спустя 39 минут, 58 секунд (23.03.2009 - 14:10) twin написал(а):
Вилно плохо разобрался. То есть вообще не разбирался. То что я написал именно так и работает.

Спустя 21 минута, 58 секунд (23.03.2009 - 14:32) Kuliev написал(а):
Grey
Ну так ты же сам в запросе написал чтобы тебе мускул выбрал все поля по id_street вот он тебе и вывел!
PHP
<?
$q "SELECT id,imya,otchest,familia FROM users WHERE id_street='$id_street'";



Спустя 36 минут, 5 секунд (23.03.2009 - 15:08) Grey написал(а):
Kuliev,
Да, но некоторым из них (не все) нужно проставить баллы. баллы эти заносятся в третью таблицу. Пока что встают пустые значения тем юзерам, которые были выведены на страницу, но им не был выставлен балл.

twin,
твой способ я пробовал. То есть форма как в твоем пример, где параметр name полей такого вида
Код
data['.$q.'][otm]


В обработчике такой код:
PHP
$query="INSERT INTO otm (id_user,id_otm) VALUES";

 foreach($_POST['data'] as $fileds => $val)
{

    if($val['id']) 
{
    $values[] ="(".$val['id']."','".$val['otm']."')";
}
}
mysql_query($query.implode(", ",$values))


если имя поля делаем data['.$q.'][otm], то выдается ошибка

Warning: Invalid argument supplied for foreach() in X:\home\tobgrades\www\users\add_score.php on line 13

Warning: implode() [function.implode]: Bad arguments. in X:\home\tobgrades\www\users\add_score.php on line 16
Если поля делаю с параметром name = data[otm], т.е без $q - то ошибки нет, но и в базу ничего не пишется
Что делать с этим самым $q?
Можно поподробнее прокомментировать твой код?

Спустя 19 часов, 13 минут, 5 секунд (24.03.2009 - 10:21) twin написал(а):
Цитата
Что делать с этим самым $q?
Можно поподробнее прокомментировать твой код?
Просто подставить вместо своего кода и всё.
PHP
$q = "SELECT id,imya,otchest,familia FROM users ";
         $r = mysql_query($q);
         $strok = mysql_num_rows($r); //узнал количество строк, на будущее
         echo $strok; 
echo 
'<form method="post" name="forma" action="add_score.php">';
 echo '<input name="kolvo" value="'.$strok.'">';//отсылаем количество строк
$q=1;
       while($users = mysql_fetch_assoc($r))
       {
echo '<input name="data['.$q.'][id]" value="'.$users['id'].'">
<input name="data['
.$q.'][fam]" value="'.$users['familia'].'">
<input name="data['
.$q.'][name]" value="'.$users['imya'].'">
<select name="data['
.$q.'][otm]">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="b">б</option>
<option value="n">н</option>
</select><br>'
;
        $q++;
       }
       echo '<input type="submit" name="ok"';
       echo '</form>';
if(isset(
$_POST['ok']))
{
$query="INSERT INTO otm (id_user,id_otm) VALUES";
foreach(
$_POST['data'] as $fileds => $val)
    if($val['otm'] !== "n")
    $values[] ="(".$val['id']."','".$val['otm']."')";

mysql_query($query.implode(", ",$values));
}
Если теперь выбрать "н" то эта строка не запишется

Спустя 2 часа, 15 секунд (24.03.2009 - 12:21) Grey написал(а):
Спасибо!
Теперь все работает хорошо и правильно, добавил только один апостпроф после скобки
PHP
$values[] ="('".$val['id']."','".$val['otm']."')";


Посмотрел как все работает по подумал: скорость инета у нас чаще всего низкая, а взрослые тети не отличаются.. в общем ничем не примечательные тети. Предполагаю такую ситуацию: тетка жмет кнопку "Отправить". При низкой скорости, страничка с кнопкой и формами еще какое-то время будет на экране. Тетке ничего не мешает несколько раз подряд ткнуть в нетерпении по ней (что, скорее всего и будет).
В данном скрипте можно реализовать проверку на наличие данных. То есть полностью данные (юзер, дата, ид улицы, балл) совпасть не могут. Куда дуть? То есть нужно будет перебирая массив, сверять каждый элемент, отдельным запросом? или есть способ проще?

Да, вот еще - может есть на яве что-то, что заблочит всю страницу после нажатия кнопки? видел такое где-то, отправляешь запрос, страницы немного темнеет и на экране гифка изображает прогресс? Пойду искать. может просто кто-то где взять такой код.

Спустя 1 час, 45 минут, 28 секунд (24.03.2009 - 14:07) twin написал(а):
Цитата
Тетке ничего не мешает несколько раз подряд ткнуть в нетерпении по ней
Помешает. Если отправка не завершена, то повторной отправки не будет. Хоть сто раз нажми. А если нужна система защиты от накрутки - то тогда другой вопрос. Тут много путей реализации, от проверки существования записи до анализа действий юзера. Кто во что горазд.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.