Построчная обработка на PHP (с последующим занесением в MySQL)

Модератор: Модераторы разделов

Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Построчная обработка на PHP

Сообщение Dimon93rus »

Здравствуйте. В общем такая проблема: из таблицы выводятся значения (например список предметов),для того чтобы выбрать нужные, добавить к ним дополнительные опции (например количество часов и т.д. ) и отправить эти данные в другую таблицу. Как я понимаю, у каждого элемента (типа <input> ) должны меняться имена в каждой последующей строчке, я сделал путем добавления id предмета к префиксу (см. ниже: name='lek".$id_sub."' ). Вопрос собственно такой: как потом обработать каждую строчку (т.е. каждая строка должна быть чем-то вроде контейнера) и добавить выбранные данные в другую таблицу. За ранее спасибо.
Вот пример кода, который выводит строки с данными:

Код:

if ((isset($act)) and ($act == 4)) { $result = mysql_query("SELECT * FROM subjects",$db) or die (mysql_error()); $myrow = mysql_fetch_array($result); echo "Выберите нужные предметы из списка"; echo "<form name='form' method='post' action='$PHP_SELF?id=$id'> <table border=1> <tr> <td><input type='checkbox' onclick='toggleCheckAll(this.checked);'></td> <td>Предмет</td> <td>Кафедра</td> <td>Лекц.часы</td> <td>Практ.часы</td> <td>Лаб.часы</td> <td>Аттестация</td> <td>Зачет</td> <td>Экзамен</td> </tr>"; do { $res = mysql_query("SELECT * FROM kafed WHERE id=".$myrow["id_kaf"],$db) or die (mysql_error()); $kaf = mysql_fetch_array($res); $id_sub = $myrow["id_sub"]; echo "<tr> <td><input type='checkbox' name='".$id_sub."' value='".$id_sub."'></td> <td>$myrow["name_sub"]</td> <td>$kaf["kaf_name"]</td> <td><input type='text' size='12' name='lek".$id_sub."'></td> <td><input type='text' size='12' name='prakt".$id_sub."'></td> <td><input type='text' size='12' name='lab".$id_sub."'></td> <td><input type='checkbox' name='attest".$id_sub."' value='1'></td> <td><input type='checkbox' name='zach".$id_sub."' value='1'></td> <td><input type='checkbox' name='ekz".$id_sub."' value='1'></td></tr>"; } while ($myrow = mysql_fetch_array($result)); echo "</table><br>"; echo "<input type='Submit' name='add' value='Добавить'></form>"; }

Вот картинка для наглядности :)
Изображение
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

Re: Построчная обработка на PHP

Сообщение S7a1k3r »

Dimon93rus писал(а):
25.05.2008 19:46
Здравствуйте. В общем такая проблема: из таблицы выводятся значения (например список предметов),для того чтобы выбрать нужные, добавить к ним дополнительные опции (например количество часов и т.д. ) и отправить эти данные в другую таблицу. Как я понимаю, у каждого элемента (типа <input> ) должны меняться имена в каждой последующей строчке, я сделал путем добавления id предмета к префиксу (см. ниже: name='lek".$id_sub."' ). Вопрос собственно такой: как потом обработать каждую строчку (т.е. каждая строка должна быть чем-то вроде контейнера) и добавить выбранные данные в другую таблицу. За ранее спасибо.
<>

А в чем проблема?
данные так и придут к вам в массиве $_POST[<имя переменной>].
сделайте обработку вроде

Код: Выделить всё

//ассоциативный массив, содержащий всю информацию, пришедшую из формы
$alldata = array(
'subject' => array(),
'lekt_time' => array(),
//<и так далее по количеству столбцов>
);

$i = 0;
while(isset($_POST[$i])){//значения чекбоксов
$alldata['subject'][$i] = htmlspecialchars($_POST[$i]);
$alldata['lekt_time'][$i] = htmlspecialchars($_POST['lek'.$i]);//стоит поступать с осторожностью. поскольку скрипт может быть вызван извне с неполным набором переменных.
//и так далее
$i++;
}

или обработать форму javascript, сделав так, чтобы данные передавались в каком-нить внутреннем формате, придуманном вами.
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Построчная обработка на PHP

Сообщение Dimon93rus »

Хорошо, спасибо, попробую.......
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Построчная обработка на PHP

Сообщение Voice »

Главная идея следующая:

Код: Выделить всё

<?php
//$_REQUEST['names'] -- Тут будет массив имен.

foreach($_REQUEST['names'] as $id => $name) {
    ...
}
?>

....
for(...) {
    <input ... id="names[<?=$id?>]" />
}
...


Можно сделать для каждой строки скрытый инпут с ID, а все поля в соответствующие масивы организовать, и потом просто цикл по ID организовать.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Построчная обработка на PHP

Сообщение Dimon93rus »

Дико извиняюсь, но не могли бы вы по подробнее рассказать про этот момент:
Voice писал(а):
26.05.2008 11:29
а все поля в соответствующие масивы организовать, и потом просто цикл по ID организовать.

И почему именно по id, а не по name ?
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Построчная обработка на PHP

Сообщение Dimon93rus »

Всё, я разобрался. Вот привожу код, и хотел бы услышать замечания:
Вывод таблицы:

Код:

if ((isset($act)) and ($act == 4)) { $result = mysql_query("SELECT * FROM subjects",$db) or die (mysql_error()); $myrow = mysql_fetch_array($result); echo "Выберите нужные предметы из списка"; echo "<form name='form' method='post' action='$PHP_SELF'><table border=1> <tr> <td><input type='checkbox' onclick='toggleCheckAll(this.checked);'></td> <td>Предмет</td> <td>Кафедра</td> <td>Лекц.часы</td> <td>Практ.часы</td> <td>Лаб.часы</td> <td>Аттестация</td> <td>Зачет</td> <td>Экзамен</td> </tr>"; do { $res = mysql_query("SELECT * FROM kafed WHERE id=".$myrow["id_kaf"],$db) or die (mysql_error()); $kaf = mysql_fetch_array($res); $id_s = $myrow["id_sub"]; printf("<tr> <td><input type='checkbox' name=\"subject[id][]\" value='%s'></td> <td>%s</td> <td>%s</td> <td><input type='text' size='12' name=\"subject[lek][$id_s]\"></td> <td><input type='text' size='12' name=\"subject[prakt][$id_s]\"></td> <td><input type='text' size='12' name=\"subject[lab][$id_s]\"></td> <td><input type='checkbox' name=\"subject[attest][$id_s]\" value='1'></td> <td><input type='checkbox' name=\"subject[zach][$id_s]\" value='1'></td> <td><input type='checkbox' name=\"subject[ekz][$id_s]\" value='1'></td> </tr>",$myrow["id_sub"],$myrow["name_sub"],$kaf["kaf_name"],$myrow["id_sub"],$myrow["id_sub"],$myrow["id_sub"],$myrow["id_sub"],$myrow["id_sub"]); } while ($myrow = mysql_fetch_array($result)); echo "</table><br>"; echo "<input type='Submit' name='add' value='Добавить'></form>"; }


Обработка выбранных данных:

Код:

if (isset($_REQUEST['add'])) { $subject = $_REQUEST['subject']; foreach(($subject['id']) as $i => $id_sub) { $subject['lek'][$id_sub] == '' ? $lek = 0: $lek = $subject['lek'][$id_sub]; $subject['prakt'][$id_sub] == '' ? $prakt = 0 : $prakt = $subject['prakt'][$id_sub]; $subject['lab'][$id_sub] == '' ? $lab = 0 : $lab = $subject['lab'][$id_sub]; $subject['zach'][$id_sub] == '' ? $zch = 0 : $zch = $subject['zach'][$id_sub]; $subject['ekz'][$id_sub] == '' ? $ekz = 0 : $ekz = $subject['ekz'][$id_sub]; $subject['attest'][$id_sub] == '' ? $attest = 0 : $attest = $subject['attest'][$id_sub]; $sql = "INSERT INTO sub_for_groups (id_gr, id_sub, h_lek, h_prakt, h_lab, h_zch, h_ekz, h_attest) VALUES ($id, $id_sub,$lek,$prakt,$lab,$zch,$ekz,$attest)"; $db = mysql_connect($host, $user); mysql_select_db($database,$db); mysql_query("SET NAMES utf8"); //echo $sql."<br>"; mysql_query($sql,$db) or die (mysql_error()); echo "Информация введена!"; } }
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Построчная обработка на PHP

Сообщение Voice »

Dimon93rus писал(а):
26.05.2008 11:36
Дико извиняюсь, но не могли бы вы по подробнее рассказать про этот момент:
Voice писал(а):
26.05.2008 11:29
а все поля в соответствующие масивы организовать, и потом просто цикл по ID организовать.

И почему именно по id, а не по name ?

Да, можно по нейму. Затупил я.
Например у нас есть таблица:

Код: Выделить всё

...
<tr><td>
Name: <input name="names[1]" />
E-mail: <input name="emails[1]" />
</td></tr>
<tr><td>
Name: <input name="names[2]" />
E-mail: <input name="emails[2]" />
</td></tr>
...


Обработать можно так:

Код: Выделить всё

<?
foreach($_REQUEST['names'] as $id => $name) {
    echo "ID: {$id}\n"
    echo "Name: {$name}\n";
    echo "E-mail: " . $_REQUEST['emails'][$id] . "\n";
}
?>
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали: