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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: каскадное обновление/удаление

Сообщения:  [1-10]    [11-20]  [21-22] 

 
 автор: Medulla   (20.06.2007 в 13:20)   письмо автору
 
   для: Trianon   (19.06.2007 в 15:16)
 

пока получилось так: 1 раз выполняю _ужасный_ запрос с вложенными подзапросами [>8 уровней]
передаю в $result все id возвращенные запросом.

$query = "update catalogue set status = '1' where id in $result"; 


потом update, delete в зависимости от условий/действий пользователя, где

Where status = '1' 


ошибка была здесь:

from catalogue where id='$id' or pid='$id' or pid2='$id' 

а уж потом

or pid in  (select id from catalogue where pid in (select 


ps * не самое лучшее усл. обозначения подзапросов из пред. кода)

большое спасибо за помощь.

   
 
 автор: Trianon   (19.06.2007 в 15:16)   письмо автору
 
   для: Medulla   (19.06.2007 в 13:58)
 

это какие-то совсем ужасные запросы...
Там не нужно звездочки ни в том, ни в другом.
Когда исполняете запрос - контролируйте сразу, удачно ли он выполнился.

$level2 = "delete from  catalogue where status 
$result2 = mysql_query($level2) or die("Error in $level2: ". mysql_error()); 
mysql_free_result($result2);


А что, идею с пошаговой пометкой реализовать не получилось?

   
 
 автор: Medulla   (19.06.2007 в 13:58)   письмо автору
 
   для: Trianon   (18.06.2007 в 19:21)
 

delete удаляет $id + все зависимые коды

$level2= "delete * from catalogue where * id='$id' or pid in 
(select id from catalogue where pid in (select id from catalogue where pid in 
(select id from catalogue where pid='$id' or pid2='$id') or pid2 in 
(select id from catalogue where pid='$id' or pid2='$id')) or pid2 in 
(select id from catalogue where pid in 
(select id from catalogue where pid='$id' or pid2='$id') or pid2 in 
(select id from catalogue where pid='$id' or pid2='$id'))) or pid2 in 
(select id from catalogue where pid in (select id from catalogue where pid in 
(select id from catalogue where pid='$id' or pid2='$id') or pid2 in 
(select id from catalogue where pid='$id' or pid2='$id')) or pid2 in 
(select id from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in 
(select id from catalogue where pid='$id' or pid2='$id')))";


update возвращает ошибку.

$level2 = "update catalogue set status = '1' where *
$result2 = mysql_query($level2);
mysql_free_result($result2) or die ("Ошибка1.");

   
 
 автор: Medulla   (19.06.2007 в 06:59)   письмо автору
 
   для: Trianon   (18.06.2007 в 19:21)
 

усложняю себе задачу) спасибо.

   
 
 автор: Trianon   (18.06.2007 в 19:21)   письмо автору
 
   для: Medulla   (18.06.2007 в 19:12)
 

Вы явно хотите другого....

<?
$sql 
="select id from catalogue where pid='$id' or pid2='$id'";   
$res mysql_query($sql);   
for(
$result = array(); $row mysql_fetch_assoc($res) ;)   
    
$result[] = $row['id']; 
// массив id-ов. array('23416','283741','9123874')

$result  = empty($result) ? "()" : ("('"implode("','"$result) ."')");
//список id-ов. строка  "('23416','283741','9123874')"

$level2"select id from catalogue where pid IN $result or pstaff  IN $result"
$result2 mysql_query($level2); 

Второй запрос может быть отклонен из-за размера....


>почему после for не нужны { }?

после for нужен оператор тела.
Ему необязательно быть большим составным оператором. В данном случае подошел простой - оператор вычисления выражения.

   
 
 автор: Medulla   (18.06.2007 в 19:12)   письмо автору
 
   для: Trianon   (18.06.2007 в 18:09)
 

где можно прочитать подробнее?

   
 
 автор: Medulla   (18.06.2007 в 19:12)   письмо автору
 
   для: Trianon   (18.06.2007 в 17:58)
 


$sql ="select id from catalogue where pid='$id' or pid2='$id'";  
$res = mysql_query($sql);  
for($result = array(); $row = mysql_fetch_assoc($res) ;)  
    $result[] = $row['id'];
$level2= "select id from catalogue where pid='$result' or pstaff ='$result'";
$result2 = mysql_query($level2);
$num_rows = mysql_num_rows($result2);
<p>На удаление помечено '."$num_rows \n".' записей. </p>';
for ($i=0; $i <$num_rows; $i++)
     {
     $row = mysql_fetch_assoc($result2);
     echo '<p><strong>'.($i+1).'. Код: ';
     echo specialchars(stripslashes($row['id']));
     echo '</strong><br />Название: ';
     echo stripslashes($row['dolg']);
     echo '</p>';
     }
mysql_free_result($result1) or die ("Ошибка1.");
mysql_close($connection);


отобразились некоррекктные данные, как и в первом случае.
почему после for не нужны { }?

   
 
 автор: Trianon   (18.06.2007 в 18:09)   письмо автору
 
   для: Trianon   (18.06.2007 в 17:58)
 

Между прочим...
по теме. При движке InnoDB возможен перенос некоторых каскадных действий на сам сервер. Там есть ограничения чужого ключа ON UPDATE CASCADE .... и ON DELETE CASCADE ....
Не то что это Вам сильно надо, раз не пользуетесь,.... но упомянуть стоит.

   
 
 автор: Trianon   (18.06.2007 в 17:58)   письмо автору
 
   для: Medulla   (18.06.2007 в 17:51)
 

Вы хотите получить массив с id-ами в php?
Это делается несколько по-другому.

$sql ="select id from catalogue where pid='$id' or pid2='$id'"; 
$res = mysql_query($sql); 
for($result = array(); $row = mysql_fetch_assoc($res) ;) 
    $result[] = $row['id'];


На больших объемах таблицы памяти может и не хватить.

   
 
 автор: Medulla   (18.06.2007 в 17:51)   письмо автору
 
   для: Trianon   (18.06.2007 в 14:37)
 

плохой пример) имела ввиду присвоение переменной.

допустим:

$level= "delete * from catalogue where pid in (select id from catalogue where pid='$id' or pid2='$id') or pid2 in (select id from catalogue where pid='$id' or pid2='$id')"; 
так работает.

присвоение+передача в запрос

$ main ="select id from catalogue where pid='$id' or pid2='$id'";
$result = mysql_query($main);
возвращает некорректную информацию.

возможно ли его использовать?

   

Сообщения:  [1-10]    [11-20]  [21-22] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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