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

Форум PHP

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

 

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

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

тема: и снова о данных из формы
 
 автор: Stasycat   (09.07.2008 в 17:25)   письмо автору
 
 

Так и не дождалась ответа. Спрашиваю ещё раз.
Как при нажатии на кнопку SAVE отправить новое значение и тут же его вывести.
Колдую вот с такой таблицей (все строки - поля, которые можно изменять):
______________________________________________
... | материал | кол-во | сохранить |
__|________________|_____________|______________|
... | лопата | 2 | SAVE |
__|________________|_____________|______________|
... | ведро | 5 | SAVE |
__|________________|_____________|______________|
... | цемент меш. 15кг | 1 | SAVE |
__|________________|_____________|______________|

Нужно чтобы при изменении любого текстового поля и нажатии на SAVE обновлялась страница и обновлялись данные в таблице, т.е. НАПИСАТЬ-НАЖАТЬ SAVE-УВИДЕТЬ ВЫВОД ТАБЛИЦЫ С ИЗМЕНЁННЫМ ЗНАЧЕНИЕМ.

Вот что у меня:
//_________________________ИЗМЕНЕНИЕ СТРОКИ_____________________________
$save = $_GET['save'];
if ($save==1)
    {
    $id = $_GET['id_up'];
    $d = $_GET['data'];
    $k = $_GET['kl'];
    $o = $_GET['ob'];
    $s = $_GET['sn'];
    $p = $_GET['po'];
    $m= $_GET['new_mat'];
$kol= $_GET['new_kol'];

    $query = "DELETE FROM vnutr_zayavki WHERE id_vnutr_zayavki='$id'";
    $result = mysql_query($query) or die("Запрос ошибочный");
    $query_plus = "INSERT INTO vnutr_zayavki VALUES ('$id', '$n_zayavki', '$d', '$k', '$o','$s','$p','$m','$kol','$v','безнал','','','$v','','','$password')";
    $result_plus = mysql_query($query_plus) or die("Запрос ошибочный");    
    }

...
//________________ВЫВОД ТАБЛИЦЫ__________________
...
print "<form action='vnutr_zayavki_open.php' method='get'><tr><td>
<input type='text' name='new_mat' maxlength='50' size='40' alt='материал' value='$material'></td><td>
<input type='text' name='new_kol' maxlength='15' size='3' alt='кол-во' value='$kol_vo'></td><td>";
...
print "<a href=http://www.root5.ru/vnutr/vnutr_zayavki_open.php?n_zayavki=$n_zayavki&password=$password&id_up=$id_zayavki&mat=$new_mat&kol=$new_kol&save=1><img src='../images/save.jpg' onClick='submit()'></a></td>
...


P.s.: Удаляю и вставляю строчку, т.к. просто UPDATE у меня не работает.

   
 
 автор: GeorgeIV   (09.07.2008 в 18:41)   письмо автору
 
   для: Stasycat   (09.07.2008 в 17:25)
 

В начале скрипта проверяешь, был ли POST с формы (для чего кстати GET используешь?), если был, делаешь UPDATE (INSERT, DELETE). Затем читаешь базу и выводишь данные в таблицу формы. У тебя всегда будут актуальные данные на форме.
И форму переделай в человеческий вид.

   
 
 автор: Stasycat   (10.07.2008 в 09:12)   письмо автору
 
   для: GeorgeIV   (09.07.2008 в 18:41)
 

>В начале скрипта проверяешь, был ли POST с формы

Как это проверить с определённой формы? У меня их в каждой строчке, а строчек 10-15.

>(для чего кстати GET используешь?)

Делала через POST,но он вообще у меня ничего не передаёт. Заменила на GET стал что-то видеть.

>Затем читаешь базу и выводишь данные в таблицу формы. У тебя всегда будут актуальные данные на форме.

Не поняла вопроса. Я вывожу каждую запись из базы в строку-форму, чтобы при изменении какого-либо поля в этой строке обновлялась в базе ИМЕННО эта строка.

>И форму переделай в человеческий вид.

А что в ней не так?

   
 
 автор: Valick   (10.07.2008 в 09:48)   письмо автору
 
   для: Stasycat   (10.07.2008 в 09:12)
 

Как это проверить с определённой формы?У меня их в каждой строчке, а строчек 10-15
Я бы сделал одну форму и методом ПОСТ передавал массив. Просто именуете Кнопку отправки, и проверяете на соответствие в обработчике. Либо ещё лучший вариант одна кнопка отправки, используете чекбоксы и ставите галочки для тех строк которые необходимо обновить(за одну отправку можно обновить данных сколько нужно).


<form action='vnutr_zayavki_open.php' method='POST'>
затем цикл
<table>
<tr>
 <td><input type=checkbox name=check[] value=".$key."> </td>
 <td><input type='text' name='new[mat][]' maxlength='50' size='40' alt='материал' value='$material'></td>

<td> <input type='text' name='new[kol][]' maxlength='15' size='3' alt='кол-во' value='$kol_vo'></td>
....
</tr>
конец цикла
<tr>
<td> кнопка </td>
</table>

   
 
 автор: GeorgeIV   (10.07.2008 в 09:59)   письмо автору
 
   для: Valick   (10.07.2008 в 09:48)
 

Table только вынеси из цикла :-)

   
 
 автор: Valick   (10.07.2008 в 10:05)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 09:59)
 

Угу, спасибо) И с индексами массивов чёт запутался


<form action='vnutr_zayavki_open.php' method='POST'>
<table>
затем цикл
<tr>
начало строки
 <td><input type=checkbox name=check[] value="<?php echo $key;?>"> </td>
 <td><input type='text' name='new[<?php echo $key;?>][mat]' maxlength='50' size='40' alt='материал' value='<?php echo $material;?>'></td>
<td> <input type='text' name='new[<?php echo $key;?>][kol]' maxlength='15' size='3' alt='кол-во' value='<?php echo $kol_vo;?>'></td>
....
конец строки
</tr>
конец цикла
<tr>
<td><input type="submit" name="save" value="Сохранить" ></td>
</table>

   
 
 автор: GeorgeIV   (10.07.2008 в 10:09)   письмо автору
 
   для: Valick   (10.07.2008 в 10:05)
 

new_mat
new_kol
....
Зачем массив в данном случае?

   
 
 автор: Valick   (10.07.2008 в 10:17)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:09)
 

Зачем массив в данном случае?
Пока незнаю)) Но думаю отказаться от массива проще, чем его потом применить (если будет выгода при обработке информации)

   
 
 автор: GeorgeIV   (10.07.2008 в 10:22)   письмо автору
 
   для: Valick   (10.07.2008 в 10:17)
 

вообще то да. массив нужен. тут не одна строка редактируется, а все:-(

   
 
 автор: Valick   (10.07.2008 в 10:57)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:22)
 

Ну да, в исключительной надобности на 100% я неуверен, Лопатить кучу данных в массиве удобнее)


<form action='vnutr_zayavki_open.php' method='POST'> 
<table> 
<?php foreach($new as $key => $value)
?>
<tr> 
начало строки 
 <td><input type=checkbox name=check[$key] value="<?php echo $key;?>"> </td> 
 <td><input type="text" name="new[<?php echo $key;?>]['mat']" maxlength="50" size="40" 
alt="материал" value="<?php echo $new[$key]['mat'];?>"></td> 
<td> <input type="text" name="new[<?php echo $key;?>]['kol']" maxlength="15" size="3" 
alt="кол-во" value="<?php echo $new[$key]['kol'];?>"></td> 
.... 
конец строки 
</tr> 
<?php ?>
<tr> 
<td><input type="submit" name="save" value="Сохранить" ></td> 
</table>

Пока неполучается.... точно надо с массивами разобраться

   
 
 автор: Петр   (10.07.2008 в 10:15)   письмо автору
 
   для: Valick   (10.07.2008 в 09:48)
 

сделай так: (не тестировал, могут быть ошибки)
<?php
// Подключение к БД;
...
// Запись данных;
if ($_POST['save'] and $_POST['name']) {
    foreach (
$_POST['name'] as $item=>$value) {
        
// Поиск данных в БД;
        
$sql "SELECT * FROM .. WHERE `name`='".$value['name']."' AND `count`='".$value['count']."' AND ..";
        ...
        if (
если такой записи нетт.еона была измененато обновляем ее в БД) {
            
$sql "UPDATE .. VALUE `name`='".$value['name']."', `count`='".$value['count']."' WHERE `id`='".$value['id']."' LIMIT 1";
            ...
        }
    }
}
// Чтение данных;
$sql "SELECT * FROM .. WHERE ..";
...
// Количество записей;
$count count(массив записей);
// Вывод данных;
for($i=0$i<$count$i++) {
    
// Строка с данными;
    
echo '<input type="text" name="name['.$i.']" value="" /><input type="text" name="count['.$i.']" value="" /><br />';
}
?>
кнопка для обновления
<input type="submit" name="save" value="Сохранить" />

   
 
 автор: GeorgeIV   (10.07.2008 в 09:57)   письмо автору
 
   для: Stasycat   (10.07.2008 в 09:12)
 

Не путай строку ввода с целой формой, судя по коду форма у тебя одна.
А далее тебе уже подсказали

   
 
 автор: Valick   (10.07.2008 в 11:48)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 09:57)
 

Вот разобрался... предлогаю такой вариант:

<?php 
// Структура массива
$new=array(0=>array("mat"=>"лопата","kol"=>"56"),
                       
1=>array("mat"=>"ведро","kol"=>"20"));
?>

<form action='vnutr_zayavki_open.php' method='POST'>  
<table border="0" cellpadding="0" cellspacing="0">  
<?php foreach($new as $num => $mass
 {
?>
<tr>   
 <td>
  <input type="checkbox" name="check[<?php echo $num;?>]" value="<?php echo $mass;?>"></td>

 <?php foreach($mass as $key=> $value)
    {
?> 
  
 <td>
  <input type="text" name="new[<?php echo $num;?>][<?php echo $key;?>]" maxlength="50" size="40"  
    value="<?php echo ($new[$num][$key]);?>">
 </td>  

  
<?php }} ?>

</tr>
<tr>  
<td><input type="submit" name="save" value="Сохранить" ></td>
</tr>  
</table>

Скрипт универсальный, попробуйте изменить массив на:

$new=array(0=>array("mat"=>"лопата","kol"=>"56"),
                       1=>array("mat"=>"ведро","kol"=>"20","prim"=>"5 бракованных"));

и посмотрите результат.

Обработка массива (файл vnutr_zayavki_open.php)

<?php 
if(isset($_POST['new'])) {print_r ($_POST['new']); echo "<br>";}
if(isset(
$_POST['check'])) {print_r ($_POST['check']); echo "<br>";}

if(isset(
$_POST['new']) & isset($_POST['check']))
    {
     
$res=array_intersect($_POST['new'],$_POST['check']);
     
print_r ($res);
    }
?>


теперь результирующим массивом $res можно апдейтить базу сколько влезет, приблизительно точно так же как и выводим в браузер, т.е. двумя циклами foreach

Упс... пока рано... с пересечением массивов невышло))) думаю дальше

   
 
 автор: Valick   (10.07.2008 в 12:39)   письмо автору
 
   для: Valick   (10.07.2008 в 11:48)
 

Пересечение нафик ненужно... делаем так:

   
 
 автор: Stasycat   (10.07.2008 в 13:14)   письмо автору
 
   для: Valick   (10.07.2008 в 11:48)
 

С массивами в php не работали раньше.
Пытаюсь в цикле (там где проверка $row['n_vnutr_zayavki']==$n_zayavki) сохранить отдально каждую сроку:
$stroka[$id_zayavki][0] = $data;
    $stroka[$id_zayavki][1] = $id_klienta;
    $stroka[$id_zayavki][2] = $id_obekta;
    $stroka[$id_zayavki][3] = $material;
    $stroka[$id_zayavki][4] = $kol_vo;
    $stroka[$id_zayavki][5] = $tsena;


А он данные не сохраняет туда. Он мне выводит на страницу только слова Array[1], Array[2] и т.д. А где же значения из БД?

   
 
 автор: GeorgeIV   (10.07.2008 в 13:22)   письмо автору
 
   для: Stasycat   (10.07.2008 в 13:14)
 

а как выводишь?

   
 
 автор: Valick   (10.07.2008 в 13:38)   письмо автору
 
   для: Stasycat   (10.07.2008 в 13:14)
 

Дайте стркутуру таблицы БД

   
 
 автор: Valick   (10.07.2008 в 13:58)   письмо автору
 
   для: Valick   (10.07.2008 в 13:38)
 

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

   
 
 автор: Trianon   (10.07.2008 в 14:03)   письмо автору
 
   для: Valick   (10.07.2008 в 13:58)
 

Ну... полем первичного ключа я бы поинтересовался.
Хотя можно, конечно, запросом получить,...

   
 
 автор: Valick   (10.07.2008 в 16:46)   письмо автору
 
   для: Trianon   (10.07.2008 в 14:03)
 

Что предложите? У меня первичный ключ тоже в таблицу попадает если делать так:

while ($row=mysql_fetch_assoc($name))
{

$new[$row['id']]=$row;
}

Подскажите как его получить запросом? Чтобы избавится от $row['id'] а то получается привязываемся к конкретной таблице (на худой конец сойдёт, но хочется универсальности)
И как его грамотно исключить из конечного массива $new
по условию или какую функцию для массивов применить
(в этом месте у меня теория хромает)

   
 
 автор: Valick   (10.07.2008 в 17:04)   письмо автору
 
   для: Valick   (10.07.2008 в 16:46)
 

mysql_field_flags?

   
 
 автор: Trianon   (10.07.2008 в 17:22)   письмо автору
 
   для: Valick   (10.07.2008 в 16:46)
 

  $tablesource = mysql_result(mysql_query("SHOW CREATE TABLE `$table`"),0,1);
  preg_match('/PRIMARY[\s]+KEY[\s]*\(`([^`]+)`\)/',$tablesource, $out);
  $keyname = $out[1];
  //................
  while ($row=mysql_fetch_assoc($name))
  {
    $keyval = $row[$keyname];
    unset($row[$keyname]);
    $new[$keyval]=$row;
  }

Само собой, в продакшн этот код пускать нельзя.

   
 
 автор: Valick   (10.07.2008 в 21:25)   письмо автору
 
   для: Trianon   (10.07.2008 в 17:22)
 

Само собой, в продакшн этот код пускать нельзя
В смысле?

   
 
 автор: Trianon   (10.07.2008 в 21:30)   письмо автору
 
   для: Valick   (10.07.2008 в 21:25)
 

Я лишь привел пример, как можно добыть ключ.
В коде нет ни одной проверки - больше чем на реплику в диалоге он не тянет.

   
 
 автор: Valick   (10.07.2008 в 21:40)   письмо автору
 
   для: Trianon   (10.07.2008 в 17:22)
 

А как такой вариант?

// *******************************************************************
// Функция определения первичного ключа таблицы из результата запроса
// *******************************************************************
function name_id($result)
    {
    $num=0;
    do
     {
      if (strpos($flag=mysql_field_flags($result,$num),"primary_key")) 
       {$field=mysql_field_name($result,$num); break;}
      $num++;
     }while ($num<mysql_num_fields($result));
    return $field;
    }

   
 
 автор: Trianon   (10.07.2008 в 21:49)   письмо автору
 
   для: Valick   (10.07.2008 в 21:40)
 

тогда уж
function name_id($result)

  for($i = 0;$k = mysql_fetch_field($result, $i); ++$i)
     if($k->primary_key)
         return $k->name;
  return false;
}

   
 
 автор: Valick   (10.07.2008 в 23:16)   письмо автору
 
   для: Trianon   (10.07.2008 в 21:49)
 

Спасибо, немного непонятно для меня.
Это я так понимаю объектно-ориентированный подход?

   
 
 автор: Stasycat   (10.07.2008 в 14:11)   письмо автору
 
   для: Valick   (10.07.2008 в 13:38)
 

Вот структура таблицы.

   
 
 автор: Trianon   (10.07.2008 в 14:23)   письмо автору
 
   для: Stasycat   (10.07.2008 в 14:11)
 

мама...

   
 
 автор: Valick   (11.07.2008 в 01:14)   письмо автору
 
   для: Trianon   (10.07.2008 в 14:23)
 

Продолжение темы http://softtime.ru/forum/read.php?id_forum=1&id_theme=55425&page=1

   
Rambler's Top100
вверх

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