За последние 24 часа нас посетили 26650 программистов и 1511 роботов. Сейчас ищут 954 программиста ...

Обработчик циклической формы =)

Тема в разделе "PHP для новичков", создана пользователем Freakmeister, 26 июл 2010.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Есть форма для обновления статистики, которая выводится циклом из бд: http://red-squadron.ru/index.php?ind=stats&op=update
    Идея тут в том, чтобы вставлять в бд новые записи сразу по всем доступным в бд никам.
    Код такой:

    HTML:
    1. //статичная часть таблицы
    2. $output ="
    3. <tr>
    4. <td>
    5. <form id='form1' name='form1' method='post' action='$mlink&op=reg_data'>
    6.   <table width='100%' border='1' cellspacing='0'>
    7.     <tr>
    8.       <td align='center' bgcolor='#DDDDDD'><b>Имя</b></td>
    9.       <td align='center' bgcolor='#DDDDDD'><b>R</b></td>
    10.       <td align='center' bgcolor='#DDDDDD'><b>Время игры</b></td>
    11.       <td align='center' bgcolor='#DDDDDD'><b>Побед и арестов:</b></td>
    12.     </tr>";
    13.  
    14. //содержимое, выводящееся циклом
    15. $DB->query( "SELECT name, ide FROM mkp_stats GROUP BY name ORDER BY name");
    16.         while( $row = $DB->fetch_row($query) ) {
    17.         $name=$row['name'];
    18.         $ide=$row['ide'];
    19. $output .="
    20.     <tr>
    21.       <td>$name<input name='name$ide' type='hidden' id='name$ide' value='$name'/>
    22.       <input name='ide$ide' type='hidden' id='ide$ide' value='$ide'/></td>
    23.       <td align='center'><input name='r$ide' type='text' id='r$ide' size='4' maxlength='4' /></td>
    24.       <td align='center'><input name='days$ide' type='text' id='days$ide' size='3' maxlength='3' />
    25.         д,
    26.         <input name='hours$ide' type='text' id='hours$ide' size='3' maxlength='3' />
    27.         ч,
    28.         <input name='min$ide' type='text' id='min$ide' size='3' maxlength='3' />
    29.         м</td>
    30.       <td align='center'>
    31.         <input name='kills$ide' type='text' id='kills$ide' maxlength='255' />
    32.       </td>
    33.     </tr>";
    34. }
    35.  
    36. //статичная часть таблицы
    37. $output .="
    38.   </table>
    39.     <tr>
    40.       <td colspan='4' align='center'>
    41.         <input type='submit' name='submit' id='submit' value='Отправить' />
    42.       </td>
    43.     </tr>
    44. </form>
    45. </td>
    46. </tr>
    47. ";
    К именам всех инпутов в форме цепляется $ide - уникальный для каждого ника номер, поэтому name инпутов пронумерованы отдельно для каждого ника, и не совпадают. Нужен обработчик для всей этой прелести.) В нормальном виде он выглядит так (некоторые поля опущу для простоты):

    PHP:
    1. <?php
    2. if ($mkportals->input['op'] == "reg_data") {
    3. $ide = $mkportals->input['ide'];
    4. $name = $mkportals->input['name'];
    5. $r = $mkportals->input['r'];
    6. $kills = $mkportals->input['kills'];
    7.  
    8. $DB->query( "INSERT INTO mkp_stats (ide, name, r, kills) VALUES ('$ide', '$name', '$r', '$kills')");
    9. }
    Но, вместо input['name'] например, теперь здесь должно быть что-то вроде input['name&number'] и этот обработчик нужно как-то зациклить по количеству уникальных ide в бд. В общем, то что это реализуемо, я понял, но из за нехватки фантазии не получается реализовать самому.) Надеюсь на вашу помощь.
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Эм... кажется у меня вот-вот случится озарение, но пока ещё не совсем.)) Значит, если я запихну все значения в массивы, то смогу посчитать количество символов в массиве ide и по этому числу зациклить обработчик? Поправьте что не так:

    PHP:
    1. if ($mkportals->input['op'] == "reg_data") {
    2.  
    3.    $ide = $mkportals->input['ide'][];
    4.    $n = count($ide);
    5.    until ($n=0) {
    6.       $ide = $mkportals->input['ide'][$n];
    7.       $name = $mkportals->input['name'][$n];
    8.       $r = $mkportals->input['r'][$n];
    9.       $kills = $mkportals->input['kills'][$n];
    10.       $DB->query( "INSERT INTO mkp_stats (ide, name, r, kills) VALUES ('$ide', '$name', '$r', '$kills')");
    11.       $n=$n-1;
    12.    }
    13. }
    Хотя, кажется, я ещё больше запутался...
     
  4. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    так пхп не поймет.
    делать запросы в цикле нехорошо
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    сделай
    PHP:
    1. <?php
    2. header("Content-type: text/plain");
    3. print_r($_POST);
    будет понятно как его обходить
     
  6. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Всё, проблема решена.) Сделал так: инпутам дал имена name[], тоесть они автоматически пронумеровались с нуля. А обработчик такой:

    PHP:
    1. if ($mkportals->input['op'] == "reg_data") {        
    2. $ide = $mkportals->input['ide'];
    3. $name = $mkportals->input['name'];
    4. $r = $mkportals->input['r'];
    5. $kills = $mkportals->input['kills'];
    6.  
    7. $n = count($ide);
    8. while( $n > 0 ) {
    9. $n=$n-1;
    10. $DB->query( "INSERT INTO mkp_stats (ide, name, r, kills) VALUES ('$ide[$n]', '$name[$n]', '$r[$n]', '$kills[$n]')");
    11. }
    Вот что значит взяться на свежую голову.)