Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: удалить сразу из нескольких таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
dima4321
Отправлено: 11 Апреля, 2011 - 08:37:58
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Всем привет )

Имею кучу контента в своей базе.

Хочу несколько десятков пунктов удалить.

Данный скрипт получает переменную GET.
PHP:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  ini_set('display_errors',1);
  4.  error_reporting(E_ALL);
  5.    
  6.    header('Location: index.php');
  7.      
  8.    include "yzel.php";
  9.  
  10.    $id = $_GET['id'];
  11.    
  12.    $sql = "DELETE FROM names WHERE id = '$id'";
  13.    
  14.    
  15.    
  16.    if(mysql_query($sql))
  17.  
  18.  {
  19.      echo "$page удалена";
  20.    
  21.  
  22.   }
  23.  
  24.  else
  25.   {
  26.      echo 'Не удалось удалить';
  27.   }
  28.  ?>






это пример с одной таблицей.


но у меня также с этим id есть таблицы history tracklist keywords и keys


т.е. есть связка.
Код:
PHP:
скопировать код в буфер обмена
  1. FROM `names`  INNER JOIN `tracklist` ON `name_id` = `names`.`id`





Код:
PHP:
скопировать код в буфер обмена
  1. FROM `names`  INNER JOIN `history` ON `name_id` = `names`.`id`





Код:
PHP:
скопировать код в буфер обмена
  1. FROM `names`  INNER JOIN `keywords` ON `name_id` = `names`.`id`





Код:
PHP:
скопировать код в буфер обмена
  1. FROM `names`  INNER JOIN `keywords` ON `name_id` = `names`.`id`
  2.  




как мне составить запрос так, чтобы все махом удалить из всех 5 таблиц.

Примечание:

таблицы history , tracklist и т.д. имеют в своем арсенале одинаковые id

т.е. напрмер id 163 в таблице names идет один раз. , а в таблице tracklist 9 раз

Заранее спасибо.
 
 Top
EuGen Администратор
Отправлено: 11 Апреля, 2011 - 09:09:15
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Если Вам нужно атомарное удаление, то ивпользуйте InnoDB и транзакции. Запрос будет построен примерно так:

BEGIN
DELETE FROM table_0 WHERE {condition}
DELETE FROM table_1 WHERE {condition}
{...}
DELETE FROM table_N WHERE {condition}
COMMIT

Подробнее здесь:
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]ction-model[dot]html


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
levchick
Отправлено: 11 Апреля, 2011 - 09:14:31
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010  


Помог: 3 раз(а)




Если используется InnoDB, достаточно указать связи между таблицами и выставить ondelete в cascade. В этом случае при удалении записи из `names`, зависимые записи из всех зависимых таблиц удалятся автоматически

(Отредактировано автором: 11 Апреля, 2011 - 09:26:35)

 
 Top
dima4321
Отправлено: 11 Апреля, 2011 - 12:00:41
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




levchick
EuGen

спасибо, но сложно ))

давайте я покажу как я это сделал очень длинно, а вы подскажите как сделать это покороче

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  ini_set('display_errors',1);
  4.  error_reporting(E_ALL);
  5.    
  6.    //header('Location: index.php');
  7.      
  8.    include "yzel.php";
  9.  
  10.    $id = $_GET['id'];
  11.    
  12.    $sql = "DELETE FROM names WHERE id = '$id'";
  13.    
  14.    if(mysql_query($sql))
  15.  
  16.  {
  17.      echo "id удален<br>";
  18.   }
  19.  else
  20.   {
  21.   echo 'Не удалось удалить<br>';
  22.   }
  23.  
  24.   $sql1 = "DELETE FROM tracklist WHERE name_id = '$id'";
  25.    
  26.    if(mysql_query($sql1))
  27.  
  28.  {
  29.      echo "альбомы удалены<br>";
  30.   }
  31.  else
  32.   {
  33.   echo 'Не удалось удалить<br>';
  34.   }
  35.  
  36.   $sql2 = "DELETE FROM history WHERE name_id = '$id'";
  37.    
  38.    if(mysql_query($sql2))
  39.  
  40.  {
  41.      echo "история удалена<br>";
  42.   }
  43.  else
  44.   {
  45.   echo 'Не удалось удалить<br>';
  46.   }
  47.  
  48.  $sql3 = "DELETE FROM keys WHERE name_id = '$id'";
  49.    
  50.    if(mysql_query($sql3))
  51.  
  52.  {
  53.      echo "ключи удалены<br>";
  54.   }
  55.  else
  56.   {
  57.   echo 'Не удалось удалить<br>';
  58.   }
  59.  
  60.  
  61.   $sql4 = "DELETE FROM keywords WHERE name_id = '$id'";
  62.    
  63.    if(mysql_query($sql4))
  64.  
  65.  {
  66.      echo "ключи исторрий удалены<br>";
  67.   }
  68.  else
  69.   {
  70.   echo 'Не удалось удалить<br>';
  71.   }
  72.  
  73.  
  74.  
  75.  
  76.    ?>
 
 Top
levchick
Отправлено: 11 Апреля, 2011 - 13:11:27
Post Id



Новичок


Покинул форум
Сообщений всего: 43
Дата рег-ции: Июль 2010  


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. //константа с именем поля, по которому удаляем
  5. define("ID_FIELD", "name_id");
  6.  
  7. //массив с именами таблиц и сущностей, хранящихся в ней
  8. $sqlArray=array(
  9.     'names'=>'id',
  10.     'tracklist'=>'альбомы',
  11.     'history'=>'история',
  12.     'keys'=>'ключи',
  13.     'keywords'=>'ключи исторрий'
  14. );
  15.  
  16. $id=1;//для примера
  17.  
  18.  
  19. foreach ($sqlArray as $tableName => $entityName)
  20. {
  21.     //подготовка запроса
  22.     $query="DELETE FROM `{$tableName}` WHERE `".ID_FIELD."` = '{$id}'";
  23.    
  24.     if (mysql_query($query))
  25.     {
  26.         echo"{$entityName}: успешное удаление<br>";
  27.     }
  28.     else
  29.     {
  30.         echo"{$entityName}: ".mysql_error()."<br>";
  31.     }
  32. }
  33.  
  34. ?>
  35.  


Можно оформить в виде функции, которая принимает в себя значение $id, или все три необходимых параметра ($id, $sqlArray, ID_FIELD).

ИМХО, работать со связями в разы проще, чем заботиться о целостности самому...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB