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

Форум MySQL

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

 

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

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

тема: Update нескольких записей
 
 автор: Filatov_Aleksey   (03.02.2011 в 21:50)   письмо автору
 
 

Здравствуйте.
Есть 3 таблицы: специалисты (doctors), специальности (Specialization), и сводная таблица (DocSpec) в которой хранится список специальностей для каждого специалиста (одна и более специальностей для одного специалиста). Возникло затруднения как сделать обновления списка специальностей для конкретного врача одним запросом. Т.е. Пользователю в форме отображаются данные конкретного специалиста (таблица doctors), и группа checkbox (галочки) с списком всех специальностей, галочкой отмечены те специальности которые имеет данный специалист. Код примерно следующий:
<?php
    $query 
="SELECT * from Specialization ORDER BY  `Specialization`.`Name_Specialization` ASC"
    
$myrow_spec=mysql_query($query$db);
while (
$result_spec=mysql_fetch_array($myrow_spec))
   {
//отмечает галочкой Если существует запись с таким то доктором и такой то специальнсотью 
 
 
$query_exist mysql_query("select EXISTS (select * from DocSpec where doc=".$id." and spec=".$result_spec['id'].") AS result",$db); 
$result_exist mysql_fetch_array($query_exist);
 if (
$result_exist['result']!=0
 { 
?>
 <label>
           <input type="checkbox" name="spec[]" checked value="<?=$result_spec['id'];?>" >
           <i><u><?=$result_spec['Name_Specialization'];?></u></i></label>
         <br>
 <?php   
 
}  else { 
    
?>
    <label>
           <input type="checkbox" name="spec[]" value="<?=$result_spec['id'];?>" >
           <?=$result_spec['Name_Specialization'];?></label>
         <br>
    <?php
    
}
   }
?>

Пользователь может снять галочки с выбранных, добавить новые и т.д.
Задача состоит в том как обновить значения в сводной таблице (DocSpec), причём если пользователь убрал галочку, то убрать из запись из списка, и наоборот вставить если добавил?
Желательно это сделать одним запросом.

  Ответить  
 
 автор: cheops   (03.02.2011 в 22:27)   письмо автору
 
   для: Filatov_Aleksey   (03.02.2011 в 21:50)
 

Хм... обычно такие штуки делают в два запроса - сначала удаляют все записи из сводной таблицы, а потом их вставляют по-новой в зависимости от выбора в checkbox.

  Ответить  
 
 автор: Filatov_Aleksey   (03.02.2011 в 22:41)   письмо автору
 
   для: cheops   (03.02.2011 в 22:27)
 

Только так?
Update это не реально сделать?

  Ответить  
 
 автор: cheops   (03.02.2011 в 22:51)   письмо автору
 
   для: Filatov_Aleksey   (03.02.2011 в 22:41)
 

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

  Ответить  
 
 автор: Trianon   (03.02.2011 в 22:53)   письмо автору
 
   для: Filatov_Aleksey   (03.02.2011 в 22:41)
 

UPDATE не умеет удалять записи.

Если Вы готовы в связующей таблице держать столько записей, сколько получается произведением числа doctors на число speciality - можно обойтись UPDATE'ом. Но тогда фактом привязки будет не наличие строки в таблице связки, а состояние еще одного поля в ней.

  Ответить  
 
 автор: Filatov_Aleksey   (03.02.2011 в 23:04)   письмо автору
 
   для: Trianon   (03.02.2011 в 22:53)
 

Нет увы мне не подходит такой вариант, всё вращается вокруг специалиста.

Я написал вот такую конструкцию:

$myrow_del_spec = mysql_query("DELETE FROM DocSpec WHERE doc = ".$id.")",$db) or die ("<br>При выполнении запроса к БД возникла ошибка: ".mysql_error().". Код ошибки: ".mysql_errno()."");
for ($i=0;$i<sizeof($spec);$i++)
    {
    $myrow_ins_spec = mysql_query("INSERT INTO DocSpec (Doc, Spec) VALUES ( '".$id."','".$spec[$i]."')",$db) or die ("<br>При выполнении запроса к БД возникла ошибка: ".mysql_error().". Код ошибки: ".mysql_errno().". ");
    }

if ($myrow='true' and $myrow_doc='true' and $myrow_del_spec='true' and $myrow_ins_spec='true')
{echo "<h3 align='center'>Внесённые изменения успешно сохранины.</h3><p style=\"margin-left:15px;\">Теперь вы можете перейти на <a href=\"http://".$_SERVER ['HTTP_HOST'].rtrim (dirname ($_SERVER ['PHP_SELF']), '/ \\ ')."\" >Главную страницу</a>.</p>";}


Только такой как я понимаю вариант возможен.

  Ответить  
 
 автор: kosta_in_net   (04.02.2011 в 19:11)   письмо автору
 
   для: Filatov_Aleksey   (03.02.2011 в 23:04)
 

циклически лучше делать не запросы, а их конструирование, типа:
for ($i=0;$i<sizeof($spec);$i++){
  if(@$values){
    $values.=",";
  }
  @$values.="( '".$id."','".$spec[$i]."')";
}

А потом уже
if(@$values){
   mysql_query("INSERT INTO DocSpec (Doc, Spec) VALUES ".$values.");
}

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

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