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

Форум PHP

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

 

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

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

тема: обновление пеочередно нескольких строк в связаной таблице
 
 автор: buykz   (24.03.2010 в 13:14)   письмо автору
 
 

есть 2 табл.:
1. staff с полями sid, fio и т.д.
2. exp с полями expid, expsid, from, to, post, place, text

имеется вывод резюме в ввиде таблицы в одной из ячеек которой выводится опыт работы, к примеру это несколько строк:
<? $exp = mysql_query ("SELECT * FROM exp WHERE expsid='$cat'",$db);
$ex = mysql_fetch_array ($exp);
do {
printf("<a onClick = window.open('s_expedit.php?expid=%s','','top=200,left=300,width=600,height=300') href=''>ред </a>%s%s &nbsp;<strong>%s</strong> - %s.%s<br>", $ex["expid"], $ex["from"],$ex["to"],$ex["post"],$ex["place"],$ex["text"]);}
while ($ex = mysql_fetch_array($exp));
?>
форма типа:
<?
$expedit = mysql_query("SELECT * FROM exp WHERE expsid='$sid'");
$expe = mysql_fetch_array($expedit);

print <<<HERE
<div style=" text-align:left; padding:10px; line-height:22px;";>
<form name="form1" method="post" action="s_expeditaction.php" class="form_new">
<label><input name="from" type="text" value="$expe[from]" size="5"></label>
<label><input name="to" type="text" value="$expe[to]" size="5"></label><br>
<label><input name="post" type="text" value="$expe[post]" size="60"></label><br>
<label><input name="place" type="text" value="$expe[place]" size="60"></label><br>
<label><textarea name="text" id="text" style="width:500px; height:150px">$expe[text]</textarea></label>

<p><label><input type="submit" name="Submit" id="Submit" value="Сохранить изменения"></label></p>
<label><input name="expsid" type="hidden" value="$expe[expsid]" size="5"></label>
</form></div>
HERE;
?>

и файл обработки:
<? if (isset($from) && isset($to) && isset($post) && isset($place) && isset($text))
{
$result = mysql_query ("UPDATE exp SET from='$from', to='$to', post='$post', place='$place', text='$text' WHERE expsid='$expsid'");
if ($result == 'true') {echo "Сохранено";}
else {echo "Не сохранено!";}
}
else
{echo "<p>не вся инфо вбита</p>";}
?> <br>

никак не могу понять как можно редактировать каждую строку табл. exp

  Ответить  
 
 автор: Trianon   (24.03.2010 в 20:47)   письмо автору
 
   для: buykz   (24.03.2010 в 13:14)
 

а как код в форуме показывать, Вы можете понять?

  Ответить  
 
 автор: buykz   (25.03.2010 в 12:14)   письмо автору
 
   для: Trianon   (24.03.2010 в 20:47)
 

трояну

я новичок, но то что написал понимаю полностью, возможно какому-то новичку тоже поможет

может не правильно сформулировал. мне нужно сделать чтобы по ссылке в резюме отрывалось маленькое окошко с данными строки другой таблицы в данном случае exp

  Ответить  
 
 автор: Loki   (25.03.2010 в 13:46)   письмо автору
 
   для: buykz   (25.03.2010 в 12:14)
 

>трояну
так его!:)))

  Ответить  
 
 автор: Slo_Nik   (25.03.2010 в 13:51)   письмо автору
 
   для: buykz   (25.03.2010 в 12:14)
 

>может не правильно сформулировал....

имелось ввиду оформление кода в сообщении. используйте теги оформления
используя code , получите в сообщении код с подсветкой, тогда будет удобней читать...

  Ответить  
 
 автор: .....   (25.03.2010 в 13:14)
 
   для: buykz   (24.03.2010 в 13:14)
 

from и to зарезервированные слова. Такие названия полей таблицы в запросе можно использовать только в обратных кривых кавычках

  Ответить  
 
 автор: Slo_Nik   (25.03.2010 в 13:58)   письмо автору
 
   для: buykz   (24.03.2010 в 13:14)
 

>никак не могу понять как можно редактировать каждую строку табл. exp

что именно Вы имели ввиду? У Вас не обновляются записи?

исправте эту строку

<?php 
 
if (isset($from) && isset($to) && isset($post) && isset($place) && isset($text))
?>

на

<?php 
 
if (isset($_POST['from']) && isset($_POST['to']) && isset($_POST['post']) && isset($_POST['place']) && isset($_POST['text']))
?>

если Вы хотите использовать переменные из формы так как Вы это делаете, то для начала надо сделать так

<?php
$from 
$_POST['from'];
// и так все переменные
?>


по поводу do{...} while().
а если у Вас в таблице не будет записей? будет выдано предупреждение
замените просто на while

оператор <<< применяется для вывода объёмного текста, советуют избегать его использования, так как допустить ошибку легко, а обнаружить нет.

  Ответить  
 
 автор: buykz   (27.03.2010 в 10:43)   письмо автору
 
   для: Slo_Nik   (25.03.2010 в 13:58)
 

извиняюсь за скорость понимания, но я тока в этом году узнал что HTML это не хоккейная команда, а тут еще такие страшные слова как CSS, PHP, MySQL, а еще жава, еще и стараюсь понять что делаю
дошел вот да такого, выводится форма каждой строки таблицы:
<? $expedit mysql_query("SELECT * FROM exp WHERE expsid='$sid' && expid='$expid'"); ?>

ставлю <??> чтобы красивее было, это часть содержимого

но вот если тоже самое сделать с файлом UPDATE:
<? $result mysql_query ("UPDATE exp SET place='$place', post='$post', to_='$to_', from_='$from_', text='$text' WHERE expsid='$expsid' && expid='$expid'");?>

не работает, а если убрать && expid='$expid', то обовляются все записи таблицы с expsid='$expsid'

кстати изменил зарезервированные названия типа from на from_, помоему не одно и тоже
GET и POSTы все были просто не включил в код
подскажите на что лучше поменять <<< и если можно пример
а можно на примере как правильнее убрать do{...} while() на просто while

  Ответить  
 
 автор: Trianon   (27.03.2010 в 12:18)   письмо автору
 
   для: buykz   (27.03.2010 в 10:43)
 

> ставлю <??> чтобы красивее было, это часть содержимого

Правильно делаете, серый текст смотреть тяжело.
Но достаточно ставить открывающую скобу <? . Закрывать не нужно.
Открывающую скобу стоит ставить на отдельную строку, так будет понятнее, что она только для наглядности.

>а можно на примере как правильнее убрать do{...} while() на просто while
Несколько не так.
блок
выражение_очередного_шага;
do  
  оператор
while(выражение_очередного_шага);
почти наверняка следует заменять на блок

while(выражение_очередного_шага)
  оператор

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 12:30)   письмо автору
 
   для: buykz   (27.03.2010 в 10:43)
 

>дошел вот да такого, выводится форма каждой строки таблицы:
><? $expedit = mysql_query("SELECT * FROM exp WHERE expsid='$sid' && expid='$expid'"); ?>
В sql надо применять ключевое слово AND, а не &&. если Вы измените в своём sql запросе

<?php
 $result 
mysql_query ("UPDATE exp SET place='$place', post='$post', to_='$to_', from_='$from_', text='$text' WHERE expsid='$expsid' && expid='$expid'");
?>

&& на AND, то всё должно работать.
>ставлю <??> чтобы красивее было, это часть содержимого

используйте лучше длинные теги <?php ?>, это может и не так красиво, но зато код php будет всегда обработан. дело в том, что использование коротких тегов <? ?> может быть отключено в конфигурации самого php. за это отвечает директива short_open_tag в конфигурационном файле php.ini. если всётаки хотите использовать короткие теги, то создайте файл .htaccess, впишите туда строку php_value short_open_tag on и положите его в корневую директорию сайта, тогда можно будет использовать короткие теги не смотря на то как они определены в php.ini. через файл .htaccess можно изменять настройки php, но только в том случае, если использование этого файла разрешено на хостинге.

>GET и POSTы все были просто не включил в код

лучше давать код в сообщении такой, какой он у Вас есть, так легче будет Вам помочь, не надо будет гадать почему в Вас что то не работает.

>подскажите на что лучше поменять <<< и если можно пример

а как Вы выводите что то в окно браузера? используете конструкцию echo?
вот так и форму выводите

<?php
echo "<form action='' method=''>
           <input type='' name=''>
           </form>"
;
?>

при этом не забывайте о чередовании " и '

>а можно на примере как правильнее убрать do{...} while() на просто while

да просто не

<?php 
do{
// тут форматируется вывод данных
}
while(
/* тут условие */);
?>

а пишите

<?php
while(/* условие выполнение цикла */){
 
// тут форматируете вывод
}
// например
$query "SELECT * FROM `table`";// сам запрос
$t mysql_query($query);// получаем дескриптор результатирующей таблицы
 
if(mysql_num_rows($t) > 0){// если есть хотя бы одна запись в таблице
  
while($tt mysql_fetch_array($t)){// получаем массив записей таблицы
   
print_r($tt);// выводим содержимое массива в браузер
 
}
}
?>

вот вроде и всё пока. писал всё своими словами, за более точной информацией обращайтесь к мануалу :)

  Ответить  
 
 автор: buykz   (27.03.2010 в 13:49)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 12:30)
 

спасибо, за подробную расшифровку, то что надо
однако вопрос не решен еще, сменил в UPDATE файле с && на AND, но обновления к сожалению не происходит, хотя и результат положительный говорит 'сохранено'

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 14:07)   письмо автору
 
   для: buykz   (27.03.2010 в 13:49)
 

в обработчике, в начале файла напишите

<?php 
error reporting
(E_ALL); // уровень ошибок
echo "<pre>";
print_r($_POST);
echo 
"</pre>";
?>

так Вы увидите, что попадает в массив POST из формы
выведите сам запрос в окно браузера, увидите, что попадает в запрос

<?php 
$query 
"UPDATE exp SET place='$place', post='$post', to_='$to_', from_='$from_', text='$text' WHERE expsid='$expsid
      AND expid='
$expid'";
echo 
$query;
?>

  Ответить  
 
 автор: buykz   (27.03.2010 в 15:22)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 14:07)
 

перечисляет все переменные массива, кроме expid, а на него ругается типа
Notice: Undefined variable: expid in Z:\home\localhost\www\buy\s_expeditaction.php on line 35
а Денвер начинает предлагать свои услуги типа ослабте контроль, это так понимаю к нам не относится

на данный момент: осуществляется вывод на страницу резюме, где главная таблица staff, в ячейки опыт (exp) выводится несколько строк таблицы exp, причем на каждой строке ссылка на открытие формы для редактирования, добился вывода формы необходимой строки таблицы exp...
осталось реализовать UPDATE данной строки exp

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 15:32)   письмо автору
 
   для: buykz   (27.03.2010 в 15:22)
 

>Notice: Undefined variable: expid in Z:\home\localhost\www\buy\s_expeditaction.php on line 35
>а Денвер начинает предлагать свои услуги типа ослабте контроль, это так понимаю к нам не >относится
Вам вывело предупрежнение, что неопределённая переменная на строке 35, значит её надо пределить до 35 строки.
Denwer предлагает ослабить путём добавления в строку выставляющей уровень ошибок ~E_NOTICE
то есть

<?php 
eror_reporting
(E_ALL  & ~E_NOTICE);
?>

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

я так понимаю, что на 35 строке у Вас сам запрос? если да, то поэтому и не идёт обновление записи в таблице БД

  Ответить  
 
 автор: buykz   (27.03.2010 в 15:59)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 15:32)
 

да все правильно, но не понятно почему же он все таки не идет, запрос, что здесь может быть не правильного: WHERE expsid='$expsid' AND expid='$expid', выбрать все записи для соединенного столбца expsid, которому соответствуют expid, это и был главный вопрос.
если не дописывать AND expid='$expid', то обновляются все записи, имеющие соответствующие значений expsid, а добовляя не реагирует никак

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 16:18)   письмо автору
 
   для: buykz   (27.03.2010 в 15:59)
 

вот потому, что у Вас не инициализированная переменная expid, потому и не идёт обновление.
найдите причину почему у Вас переменная пустая приходит из формы и тогда всё получится.

  Ответить  
 
 автор: buykz   (27.03.2010 в 16:46)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 16:18)
 

Огромное спасибо Slo_Nik!
Где я могу поставить Вам жирный плюс?
Баланс сошелся, бухгалтера выпустили!

Правда не совсем понятно, как. Похоже еще одно правило, но это я уже буду по ходу вникать, вообщем добавил в форму:
    <label><input name='expid' type='text' value='$expe[expid]' size='5'></label> 

т.е. значения id

по ходу, разбрался с do{...} while() на while, && и AND, избавился от опасной <<<, полезная штука eror_reporting, коллеги новички пользуйтесь
.htaccess и php.ini это завтра вечером числа 10-го

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 18:01)   письмо автору
 
   для: buykz   (27.03.2010 в 16:46)
 


<label><input name='expid' type='text' value='$expe[expid]' size='5'></label>

если так, то type установите в hidden, зачем показывать id? ведь это служебная информация
пользователя не будет виден id, но при посылке формы информация будет передаваться.

  Ответить  
 
 автор: Trianon   (27.03.2010 в 21:54)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 12:30)
 

> if(mysql_num_rows($t) > 0){// если есть хотя бы одна запись в таблице

Эта проверка - здесь - лишняя.

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 21:57)   письмо автору
 
   для: Trianon   (27.03.2010 в 21:54)
 

Вы имеете ввиду, что если выводить дамп массива?

  Ответить  
 
 автор: Trianon   (27.03.2010 в 22:46)   письмо автору
 
   для: Slo_Nik   (27.03.2010 в 21:57)
 

я имею в виду, что mysql_fetch на первом обращении к пустому набору остановит цикл так или иначе

  Ответить  
 
 автор: Slo_Nik   (27.03.2010 в 23:36)   письмо автору
 
   для: Trianon   (27.03.2010 в 22:46)
 

спасибо, буду знать.

  Ответить  
 
 автор: oliss   (27.03.2010 в 12:39)   письмо автору
 
   для: Slo_Nik   (25.03.2010 в 13:58)
 

<?php 
 
if (isset($_POST['from']) && isset($_POST['to']) && isset($_POST['post']) && isset($_POST['place']) && isset($_POST['text']));


 if (isset(
$_POST['from'] , $_POST['to'], $_POST['post'], $_POST['place'], $_POST['text'] )) ;

  Ответить  
Rambler's Top100
вверх

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