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

Форум MySQL

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

 

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

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

тема: внесение изменений в базу
 
 автор: lilu   (09.04.2007 в 16:49)   письмо автору
 
 

Помощь нужна...
Содержимое базы выводится на экран в виде таблицы , каждое поле в виде текстового поля для ввода данных со опред-ым значением из базы, для того, чтобы сразу можно было внести изменения в любые места таблицы и при нажатии на кнопку все они принялись бы в базе.
Вот код кот. выводит значения из базы и представляет каждое поле в виде текстового поля для ввода данных., но как запомнить все изменения и сохранить в таблицу.....:(((


<?
 $rez 
mysql_query("SELECT * FROM table",$db);
if(
$rez)
{
echo 
"<table border=1 bgcolor='#F1F1F1'>\n";
while(
$myrow=mysql_fetch_array($rez))
     {  
echo 
"<tr>
<td><input type =\"text\" name=\"new_phone\" value =\"
$myrow[2]\" size=\"10\"></td>
<td><input type =\"text\" name=\"new_name\" value =\"
$myrow[3]\" size=\"10\"></td>
<td><input type =\"text\" name=\"new_job\" value =\"
$myrow[4]\" size=\"10\"></td>
<td><input type =\"text\" name=\"new_adres\" value =\"
$myrow[5]\" size=\"10\"></td></tr>";

     }

echo 
"</table>";
}
?>
<input name='change' valign="right" type='submit' value='внести    изменения'>

   
 
 автор: mehelson   (09.04.2007 в 17:59)   письмо автору
 
   для: lilu   (09.04.2007 в 16:49)
 

Ну а потом элементы массива $_РОSТ использовать в запросе на изменение
"UРDАТЕ таblе SЕТ fiеld_1=".$_РОSТ['nеw_рhоnе'].", fiеld_2=".$_РОSТ['nеw_nаmе'].", ... , fiеld_n=".$_РОSТ['nеw_']."

   
 
 автор: lilu   (09.04.2007 в 18:15)   письмо автору
 
   для: mehelson   (09.04.2007 в 17:59)
 

Вы имеете ввиду так:

<? 
 $rez 
mysql_query("SELECT * FROM table",$db); 
if(
$rez

echo 
"<table border=1 bgcolor='#F1F1F1'>\n"
while(
$myrow=mysql_fetch_array($rez)) 
     {   
echo 
"<tr> 
<td><input type =\"text\" name=\"new_phone\" value =\"
$myrow[2]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_name\" value =\"
$myrow[3]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_job\" value =\"
$myrow[4]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_adres\" value =\"
$myrow[5]\" size=\"10\"></td></tr>"

     } 

echo 
"</table>"
}
?> 
<input name='change' valign="right" type='submit' value='внести    изменения'> 
<?
if ($change) { mysql_query("UРDАТЕ таblе SЕТ fiеld_1=".$_РОSТ['nеw_рhоnе'].", fiеld_2=".$_РОSТ['nеw_nаmе'].", ... , fiеld_n=".$_РОSТ['nеw_'].",$db);}
?>


Вся беда в том, что за пределами while переменные пустые, а внутри цикла - запоминаются только последние значения....

   
 
 автор: Trianon   (09.04.2007 в 18:18)   письмо автору
 
   для: lilu   (09.04.2007 в 16:49)
 

А первичный ключ у рассматриваемой таблицы есть?

   
 
 автор: lilu   (09.04.2007 в 18:37)   письмо автору
 
   для: Trianon   (09.04.2007 в 18:18)
 

есть конечно - id (auto_increment)

   
 
 автор: Trianon   (09.04.2007 в 20:21)   письмо автору
 
   для: lilu   (09.04.2007 в 18:37)
 

Тогда напрашивается построение формы, подобное следующему:


<? 
 $rez 
mysql_query("SELECT * FROM table",$db); 
if(
$rez

echo 
"<table border=1 bgcolor='#F1F1F1'>\n"
while(
$myrow=mysql_fetch_array($rez)) 
     {   
$id $myrow['id'];
echo 
"<tr> 
<td><input type =\"text\" name=\"new_phone[
$id]\" value =\"$myrow[2]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_name[
$id]\" value =\"$myrow[3]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_job[
$id]\" value =\"$myrow[4]\" size=\"10\"></td> 
<td><input type =\"text\" name=\"new_adres[
$id]\" value =\"$myrow[5]\" size=\"10\"></td></tr>"

     } 

echo 
"</table>"
}
?> 

Только я всё же ограничил бы редактируемую область .... ну хотя бы страницей...
Запороть всю таблицу одним махом - жалко будет.

   
 
 автор: lilu   (10.04.2007 в 12:19)   письмо автору
 
   для: Trianon   (09.04.2007 в 20:21)
 

Жалко конечно :)
Я вот видела такое и думаю так действительно удобнее, чтобы напротив каждой записи в выводимой таблице выводилась в послей колонке картинка или кнопка или ссылка, при нажатии на кот. будут приняты изменения именно для этой записи....Вопрос как это делается:(( Видимо для onClick обработку писать надо...


<?  
 $rez 
mysql_query("SELECT * FROM table",$db);  
if(
$rez)  
{  
echo 
"<table border=1 bgcolor='#F1F1F1'>\n";  
while(
$myrow=mysql_fetch_array($rez))  
     {   
$id $myrow['id']; 
echo 
"<tr>  
<td><input type =\"text\" name=\"new_phone[
$id]\" value =\"$myrow[2]\" size=\"10\"></td>  
<td><input type =\"text\" name=\"new_name[
$id]\" value =\"$myrow[3]\" size=\"10\"></td>  
<td><input type =\"text\" name=\"new_job[
$id]\" value =\"$myrow[4]\" size=\"10\"></td>  
<td><input type =\"text\" name=\"new_adres[
$id]\" value =\"$myrow[5]\" size=\"10\"></td>

<td><a href=#><img src="
/images/red.gif" border="0"></td></tr>
 }  

echo "
</table>";  
}?>  

   
 
 автор: Trianon   (10.04.2007 в 12:39)   письмо автору
 
   для: lilu   (10.04.2007 в 12:19)
 

>...на кот. будут приняты изменения именно для этой записи....Вопрос как это делается:((

Для этого варианта формируется таблица, состоящая из независимых форм. Массивные имена в этом случае не нужны, а нужны теги <form ...>...<input type=submit name=Изменить /> </form> внутри каждой строки таблицы.

Есть еще вариант - создавать в общей форме чекбоксы, чтобы пользователь мог метить ими записи, в которые вносит изменения. Как в phpMyAdmin. Вот тут действительно полезны JS-eventhandler'ы.

   
 
 автор: lilu   (10.04.2007 в 12:54)   письмо автору
 
   для: Trianon   (10.04.2007 в 12:39)
 

Я вообще про то что в каждой строке есть ссылка или кнопка, например, изменить, допустим она неактивная, как только были внесены изменения в строке - ссылка становится активной и для принятия изменений надо нажать на неё.
Если для того чтобы это сделать нужны независимые формы - объясните на примере пож, что-то не совсем понятно....

   
 
 автор: Trianon   (10.04.2007 в 13:15)   письмо автору
 
   для: lilu   (10.04.2007 в 12:54)
 


<?   
 $rez 
mysql_query("SELECT * FROM table",$db);   
if(
$rez)   
{   
echo 
"<table border=1 bgcolor='#F1F1F1'>\n";   
while(
$myrow=mysql_fetch_array($rez))   
     {   
$id $myrow['id'];  
echo 
"<tr> <form>  <input type=hidden name=id value=$id />
<td><input type =\"text\" name=\"new_phone\" value =\"
$myrow[2]\" size=\"10\"></td>   
<td><input type =\"text\" name=\"new_name\" value =\"
$myrow[3]\" size=\"10\"></td>   
<td><input type =\"text\" name=\"new_job\" value =\"
$myrow[4]\" size=\"10\"></td>   
<td><input type =\"text\" name=\"new_adres\" value =\"
$myrow[5]\" size=\"10\"></td> 
<td><input type =submit name=upd value =\"Изменить\" /></td> 
</form>  </tr>\r\n"
;
 }   

echo 
"</table>";   
}
?>   


Если есть желание вносить изменения без перезагрузки страницы - это совсем другой коленкор. Это прямиком в JS - AJAX организовывать.

   
 
 автор: lilu   (10.04.2007 в 13:38)   письмо автору
 
   для: Trianon   (10.04.2007 в 13:15)
 

Вы знаете с чекбоксами мне идея понравилась , до того как увидела ваш пример, во что сама написала, посмотрите

<?    
$rez 
mysql_query("SELECT * FROM table",$db);    
if(
$rez)    
{    
echo 
"<table border=1 bgcolor='#F1F1F1'>\n";    
echo 
"<tr><td>тел</td><td>наимен.</td><td>работа</td><td>адрес</td>
<td><input name='change' type='submit' value='изменить'></td></tr>"
;

while(
$myrow=mysql_fetch_array($rez))    
     {   
$id $myrow['id'];   
echo 
"<tr> 
<td><input type =\"text\" name=\"new_phone[
$id]\" value =\"$myrow[2]\" size=\"10\"></td>    
<td><input type =\"text\" name=\"new_name[
$id]\" value =\"$myrow[3]\" size=\"10\"></td>    
<td><input type =\"text\" name=\"new_job[
$id]\" value =\"$myrow[4]\" size=\"10\"></td>    
<td><input type =\"text\" name=\"new_adres[
$id]\" value =\"$myrow[5]\" size=\"10\"></td>  
<td><input type=\"checkbox\" name=\"chk1[
$id]\"></td> 
</tr>\r\n"

 }    

echo 
"</table>";    

 if(
$change)
{  
$chk1 $_POST['chk1'];
 if(
$chk1)
      {
        foreach(
$chk1 as $num => $value)
        {
          if(
$value == "on")
          {
$rez2=mysql_query("UPDATE smi  SET name_smi=".$_POST['new_name_smi[$id]'].", 
tel_kont="
.$_POST['new_phone_smi[$id]'].", e-mail=".$_POST['new_mail_smi[$id]'].", grafik=".$_POST['new_gr_smi[$id]'].", ed_tarif=".$_POST['new_ed_tarif[$id]'].", tarif=".$_POST['new_tar_smi[$id]'].
WHERE id_smi = '
$num' ",$db);
 if(
$rez2) {  echo "изменения приняты<br>";}

          }
//if($value == "on")
        
}// foreach($chk as $num => $value
      
}// if($chk)
}

}
?> 


написать то написала - но не работает :(((

   
 
 автор: Trianon   (10.04.2007 в 13:48)   письмо автору
 
   для: lilu   (10.04.2007 в 13:38)
 

Я нашел два момента.
1. что такое if($change) ?
2. ох...

2а) при выводе значений полей, их нужно обрабатывать htmlspecialchars() - у них текстовая природа.
2б) . при вводе полей нужно учитывать magic_quotes и при необходимости вычищать слэши.
2в) при построении запроса к бд - при помещении в запрос литеральных констант, содержимое констант нужно экранировать mysql_escape_string()

   
 
 автор: lilu   (10.04.2007 в 15:02)   письмо автору
 
   для: Trianon   (10.04.2007 в 13:48)
 

$change - это кнопка ,при нажатии на кот. должны внестись изменения в строки отмеченные галочками.
а вот то, что вы написали под вторым пунктом .....:(

   
 
 автор: Trianon   (10.04.2007 в 15:55)   письмо автору
 
   для: lilu   (10.04.2007 в 15:02)
 

$change - это не кнопка, а переменная.
Вы нигде её не определяете.
Если имеется в виду что $change = @$_POST['change']; то надо так и писать.

так... если уж мы перешли к деталям, то я не вижу ни этой кнопки, ни самой формы вокруг таблицы.
Кстати, в форме нужно не забыть поставить method=post . Я - в своем примере - забыл. :)

Ну а 2.... Это надо один раз усвоить. Так чтобы стало понятно, откуда ноги растут. И тогда вы научитесь эти вещи ставить на автомате, и они не будут отвлекать Вас от логики алгоритма.

   
 
 автор: lilu   (10.04.2007 в 16:17)   письмо автору
 
   для: Trianon   (10.04.2007 в 15:55)
 

Вы меня простите я не спец, но $change - это кнопка она описана выше просто (в шапке выводимой таблицы), а таблица у меня в форме просто этого я не написала (я думаю это само собой понятно)

<form action="<?php echo $_SERVER['REQUEST_URI']?>" method="post">

<?     
$rez 
mysql_query("SELECT * FROM table",$db);     
if(
$rez)     
{     
echo 
"<table border=1 bgcolor='#F1F1F1'>\n";     
echo 
"<tr><td>тел</td><td>наимен.</td><td>работа</td><td>адрес</td> 
<td><input name='CHANGE' type='SUBMIT' value='изменить'></td></tr>"


while(
$myrow=mysql_fetch_array($rez))     
     {   
$id $myrow['id'];    
echo 
"<tr>  
<td><input type =\"text\" name=\"new_phone[
$id]\" value =\"$myrow[2]\" size=\"10\"></td>     
<td><input type =\"text\" name=\"new_name[
$id]\" value =\"$myrow[3]\" size=\"10\"></td>     
<td><input type =\"text\" name=\"new_job[
$id]\" value =\"$myrow[4]\" size=\"10\"></td>     
<td><input type =\"text\" name=\"new_adres[
$id]\" value =\"$myrow[5]\" size=\"10\"></td>   
<td><input type=\"checkbox\" name=\"chk1[
$id]\"></td>  
</tr>\r\n"
;  
 }     

echo 
"</table>";     

 if(
$change
{  
$chk1 $_POST['chk1']; 
 if(
$chk1
      { 
        foreach(
$chk1 as $num => $value
        { 
          if(
$value == "on"
          { 
$rez2=mysql_query("UPDATE smi  SET name_smi=".$_POST['new_name_smi[$id]'].",  
tel_kont="
.$_POST['new_phone_smi[$id]'].", e-mail=".$_POST['new_mail_smi[$id]'].", grafik=".$_POST['new_gr_smi[$id]'].", ed_tarif=".$_POST['new_ed_tarif[$id]'].", tarif=".$_POST['new_tar_smi[$id]']."  
WHERE id_smi = '
$num' ",$db); 
 if(
$rez2) {  echo "изменения приняты<br>";} 

          }
//if($value == "on") 
        
}// foreach($chk as $num => $value 
      
}// if($chk) 


}
?>  


</form>


Я когда echo $_POST['new_name_smi[$id]']; ничего вообще....
Второй момент на логику не влияет, но эти проверки напишу обязательно....

   
 
 автор: Trianon   (10.04.2007 в 16:20)   письмо автору
 
   для: lilu   (10.04.2007 в 16:17)
 

>а таблица у меня в форме просто этого я не написала (я думаю это само собой понятно)

Собственно, я тоже это предполагал. Но тогда всё должно работать.

   
 
 автор: lilu   (10.04.2007 в 16:24)   письмо автору
 
   для: Trianon   (10.04.2007 в 16:20)
 

Должно
только вот даже если в цикле echo $_POST['new_name_smi[$id]']; -- в ответ - ничего...
Я уже не говорю про update

   
 
 автор: Loki   (10.04.2007 в 16:45)   письмо автору
 
   для: lilu   (10.04.2007 в 16:24)
 

Я бы страшно удивился если бы это заработало... даже не знаю с чего тут начинать править...

   
 
 автор: Trianon   (10.04.2007 в 17:27)   письмо автору
 
   для: lilu   (10.04.2007 в 16:24)
 

>Должно
>только вот даже если в цикле echo $_POST['new_name_smi[$id]']; -- в ответ - ничего...
>Я уже не говорю про update
echo '<pre>';print_r($_POST); что показывает?

   
 
 автор: lilu   (10.04.2007 в 17:35)   письмо автору
 
   для: Trianon   (10.04.2007 в 17:27)
 

Array
(
[change] => изменить
[new_name_smi] => Array
(
[0] => Иванов88888888888
[1] => Петров
и т.д.
)
[new_phone_smi] => Array
(
[0] => 22-85-34
[1] => 44-18-15
[2] => 22-46-93
.....)
и так все переменные.....

[chk1] => Array
(
[1] => on
)
)

Иванов88888888888 - это изменённое значение..., т.е. понимает где и на что поменять но не запонимает

   
 
 автор: Trianon   (10.04.2007 в 17:52)   письмо автору
 
   для: lilu   (10.04.2007 в 17:35)
 

Вот видите?
Вот этот цикл
foreach($chk1 as $num => $value)
{
if($value == "on")
{
$rez2=mysql_query("UPDATE smi SET name_smi=".$_POST['new_name_smi[$id]'].",
tel_kont=".$_POST['new_phone_smi[$id]'].", e-mail=".$_POST['new_mail_smi[$id]'].", grafik=".$_POST['new_gr_smi[$id]'].", ed_tarif=".$_POST['new_ed_tarif[$id]'].", tarif=".$_POST['new_tar_smi[$id]']."
WHERE id_smi = '$num' ",$db);
if($rez2) { echo "изменения приняты<br>";}

}//if($value == "on")
}// foreach($chk as $num => $value

нужно построить по-другому.
1. if($value == 'on') не требуется. Дело в том, что неотмеченные чекбоксы в параметры скрипта просто не передаются - там будут лишь отмеченные, соответственно, в $value кроме on ничего и не будет.
2. А вот $num, который на самом деле является нашим id - нам может помочь.
3. К массивам в POST адресуются не так $_POST['new_name_smi[$id]'], а так $_POST['new_name_smi'][$id]

Соответственно:
<?
foreach($chk1 as $id => $value)  
{  
// чтобы не путаться - вынем значения из параметров.
    
$name $_POST['new_name_smi'][$id];
    
$phone $_POST['new_phone_smi'][$id];
    
$mail $_POST['new_name_smi'][$id];
    
$grafik $_POST['new_gr_smi'][$id];
    
$ed $_POST['new_ed_tarif'][$id];
    
$tar $_POST['new_tar_smi'][$id];
    
// теперь можно написать запрос. 
    
$rez2=mysql_query("UPDATE smi  
    SET 
        name_smi='
$name' ,   
        tel_kont='
$phone',
        `e-mail`=
$mail
        grafik='
$grafik',
        ed_tarif='
$ed',
        tarif='
$tar'
    WHERE id_smi = '
$id'   ",$db);  
     if(
$rez2)   echo "изменения для строки  $id приняты<br>";  
}      

   
 
 автор: lilu   (10.04.2007 в 18:31)   письмо автору
 
   для: Trianon   (10.04.2007 в 17:52)
 

Всё заработало -- спасибо вам!!!! И хватило же терпения....:)))

   
 
 автор: Trianon   (10.04.2007 в 18:43)   письмо автору
 
   для: lilu   (10.04.2007 в 18:31)
 

Теперь приступайте к п 2.

   
Rambler's Top100
вверх

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