Консультация № 45716
09.06.2006, 10:21
0.00 руб.
0 3 3
Добрый день!
Для редактирования таблицы "Работники цеха" базы данных, на главной странице сделал форму, где вводится номер цеха, который передается в PHP-программу.
Программа выбирает все записи данного цеха из таблицы базы и записывает в таблицу с формой и отображает на экране.
На экране могу редактировать любое поле, но при отправке на сервер
для внесения изменений в базу данных, отправляется всегда последняя
запись.
Фрагмент на PHP прилагаю.
Подскажите, как правильно сделать.
Спасибо.

Приложение:
mysql_select_db(‘compik‘); $query = "select * from rab where ceh_id = ‘$cehid‘"; $result = mysql_query($query); $num_results = mysql_num_rows($result); echo "<p>Найдено записей : ".$num_results."</p>";echo "<table width=200 border=1>";echo "<form method=get action=ceh_edit.php>";for ($i=0; $i <$num_results; $i++){$row = mysql_fetch_array($result); echo "<tr>"; echo "<td> <input type=text name=N1 value=‘$row[ceh_id]‘> </td>"; echo "<td> <input size=20 type=text name=N2 value=‘$row[rab_name]‘> </td>"; echo "<td> <input type=checkbox name=X1>edit </td>"; echo "</tr>";}echo "<tr>"; echo "<td colspan=2 align=center>"; echo "<input type=submit value=‘start‘"; echo "</td>";echo "</tr>"; echo "</form>";echo "</table>";?>

Обсуждение

Неизвестный
09.06.2006, 11:06
общий
это ответ
Здравствуйте, Eliz!
Надо в тегах input ставить имена так: N1[] и N2[] и X1[]. Тогда, при вносе в базу данных надо пройдись по всем массивам:
for($i=0;$i<count($_REQUEST[‘N1‘]);$i++){
//вставить в БД $_REQUEST[‘N1‘][$i], $_REQUEST[‘N2‘][$i], $_REQUEST[‘X1‘][$i]
}

Приложение:
echo "<tr>"; echo "<td> <input type=text name=N1[] value=‘$row[ceh_id]‘> </td>"; echo "<td> <input size=20 type=text name=N2[] value=‘$row[rab_name]‘> </td>"; echo "<td> <input type=checkbox name=X1[]>edit </td>"; echo "</tr>";
Неизвестный
09.06.2006, 11:11
общий
это ответ
Здравствуйте, Eliz!

ВСе дело в этом:
echo "<td> <input type=text name=N1 value=‘$row[ceh_id]‘>
</td>";
echo "<td> <input size=20 type=text name=N2 value=‘$row[rab_name]‘>

У тебя все поля называются одинаково (для каждой записи) - естественно что в POST приходит последняя.
Для того чтобы такого не было во-первых кури массивы а во вторых сделай где то так
echo "<td> <input type=text name=N1[] value=‘$row[ceh_id]‘>
</td>";
echo "<td> <input size=20 type=text name=N2[] value=‘$row[rab_name]‘>

(и где там у тебя еще поля свои для каждой записи)

При сабмите тебе в ПОСТе придет следующее
$_POST[‘N1‘] - массив
$_POST[‘N2‘] - тоже массив

И уже прохождением по этим массивам ты получишь свои данные измененные или нет.

Так же для однозначности советую давать индексы т.е.
.... name=N1[$i] ......
... name=N2[$i] ......
Неизвестный
09.06.2006, 13:56
общий
это ответ
Здравствуйте, Eliz!
А что если посмотреть, какая получается результате форма? Получается так:
<input type=text name=N1 value=‘иванов‘>
<input size=20 type=text name=N2 value=‘Иван‘>
<input type=checkbox name=X1>
<input type=text name=N1 value=‘Петров‘>
<input size=20 type=text name=N2 value=‘Петр‘>
<input type=checkbox name=X1>
...
Переменные-то называютс одинаково! Как же ты хочешь чтобы PHP их отличал?

Сделать надо так:
mysql_select_db(‘compik‘);
$query = "select * from rab where ceh_id = ‘$cehid‘";
$result = mysql_query($query);

$num_results = mysql_num_rows($result);

echo "<p>Найдено записей : ".$num_results."</p>";

echo "<table width=200 border=1>";
echo "<form method=get action=ceh_edit.php>";

for ($i=0; $i <$num_results; $i++)
{
$row = mysql_fetch_array($result);

echo "<tr>";

echo "<td> <input type=text name="N1[]" value=‘$row[ceh_id]‘>
</td>";

echo "<td> <input size=20 type=text name="N2[]" value=‘$row[rab_name]‘>
</td>";

echo "<td> <input type=checkbox name="X1[]" value=‘$row[rab_id]‘>edit
</td>";

echo "</tr>";
}
Так при сабмите на сервер отправятся 3 массива:
N1, N2, X1. Только вот в массиве X1 будут только те значения которые были отмечены.
Я бы на твоем месте вообще не делал никаких галочек, а просто вывел бы hidden-поле для каждой записи, тоже указав [], чтобы был массив(<input type="hidden" name="ids[]" value="$ID">). А потом прошелся бы по этому массиву, и, используя в виде ключа значение, которое является ID для каждой записи. И все, все что надо - обновлено :)

Хочешь - можешь подумать, как это делать с галочками. Там тебе надо будет тоже делать hidden-поле, и действовать аналогично, но замену проводить только там где была выбрана галочка.

Полезная функция для этого - in_array(), про нее - на php.net почитай
Форма ответа