|
|
|
| Здравствуйте.
Есть 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), причём если пользователь убрал галочку, то убрать из запись из списка, и наоборот вставить если добавил?
Желательно это сделать одним запросом. | |
|
|
|
|
|
|
|
для: Filatov_Aleksey
(03.02.2011 в 21:50)
| | Хм... обычно такие штуки делают в два запроса - сначала удаляют все записи из сводной таблицы, а потом их вставляют по-новой в зависимости от выбора в checkbox. | |
|
|
|
|
|
|
|
для: cheops
(03.02.2011 в 22:27)
| | Только так?
Update это не реально сделать? | |
|
|
|
|
|
|
|
для: Filatov_Aleksey
(03.02.2011 в 22:41)
| | UPDATE обновляет существующие записи. А если будет выбрана новая специальность, для которой нет записи - её в любом случае вставлять нужно будет. Если специальность будет убрана, то её как-то нужно удалить, UPDATE этого тоже не умеет. | |
|
|
|
|
|
|
|
для: Filatov_Aleksey
(03.02.2011 в 22:41)
| | UPDATE не умеет удалять записи.
Если Вы готовы в связующей таблице держать столько записей, сколько получается произведением числа doctors на число speciality - можно обойтись UPDATE'ом. Но тогда фактом привязки будет не наличие строки в таблице связки, а состояние еще одного поля в ней. | |
|
|
|
|
|
|
|
для: 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>";}
|
Только такой как я понимаю вариант возможен. | |
|
|
|
|
|
|
|
для: 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.");
}
|
| |
|
|
|