За последние 24 часа нас посетили 15984 программиста и 1642 робота. Сейчас ищут 947 программистов ...

Проблема с удалением на php+mysql

Тема в разделе "PHP и базы данных", создана пользователем Dimitry_LD, 1 апр 2011.

  1. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Здравствуйте!
    Выручайте, плиз! Я думал уже всё нормально будет, но тут начал тестировать и бац! Обнаружил ацццкий баг!
    Попытаюсь рассказать как можно яснее!

    Значит у меня есть главная таблица, в которой хранятся ID записей! Эта таблица идёт на просмотр! ID сравнивается с ID в других таблицах и выносятся данные, которые соответствуют(с этим всё нормально).
    Значит суть такова:
    В этой самой главной таблице вот такая связь:
    http://www.pictureshack.ru/images/140Problema1.jpg

    И когда мы выполняем УДАЛЕНИЕ, к примеру ОТДЕЛА(id_otd), то в ГЛАВНОЙ таблице на его месте возникает пустая строка(так и должно быть)!
    НО, когда я удаляю ПРЕДПРИЯТИЕ(id_predpr), то происходит следующее:
    http://www.pictureshack.ru/images/5178Problema2.jpg
    Т.е. как вы видите! вместо того, чтобы оставить ПУСТОЕ поле он тупо не выводит на просмотр ВСЁ, где был этот ID.
    Я долго парился и вот что обнаружил... Как я уже сказал ОТДЕЛ(id_otd) удаляется нормально и остаётся ПУСТАЯ строка, но в отделе содержится лишь 1 таблица!
    А в ПРЕДПРИЯТИИ ещё с 3 соединяется!
    Когда я убрал в коде ЭТО САМОЕ СОЕДИНЕНИЕ с ТЕМИ 3, то всё заработало нормально! Но мне то нужно, чтобы и те 3 участвовали(OKFS, OKATO, OKVED).
    Как быть то??

    Вот, сократил до максимума код, оставив только проблемную часть! Посмотрите пожалуйста!
    PHP:
    1.  
    2. <?php
    3. if (!$_SESSION["enter"] || $_SESSION["right"]<"40")
    4. {
    5. echo '<script language="JavaScript" type="text/javascript">
    6. <!--
    7. location="http://test1.ru/new/menu/Regonout_php/login.php"
    8. //-->
    9. </script>';
    10. }
    11. else
    12. {
    13.  
    14. echo"<html>";
    15. echo"<HEAD>";
    16. echo"<META http-equiv=content-type content=\"text/html; charset=windows-1251\">";
    17. echo"</HEAD>";
    18. echo"<body bgcolor = \"#ffffff\">";
    19.  
    20. echo"<center><h2><font color=\"082567\">Операции над статистическими формами</font></h2></center>";
    21. echo"<table align=\"center\"border=5>";
    22. echo"<tr align=\"center\">";
    23. echo"<td><font color=\"2a52be\"><font size=\"3px\"><b>Название формы</b></font></font></td>";
    24. echo"<td><font color=\"2a52be\"><font size=\"3px\"><b>Предприятие</b></font></font></td>";
    25. echo"<td><font color=\"2a52be\"><font size=\"3px\"><b>Сроки обработки</b></font></font></td>";
    26. echo"<td><font color=\"2a52be\"><font size=\"3px\"><b>Операция</b></font></font></td>";
    27.  
    28. echo"</tr>";
    29.  
    30. $link = mysql_connect("**********", "******","*****")
    31.       or die("Could not connect");
    32. mysql_select_db("stat_forms") or die("Could not select database");
    33.  
    34.  
    35. //главная таблица
    36. $ath = mysql_query("SELECT forms_glav.* FROM forms_glav LEFT JOIN forms USING(`id_form`) ORDER BY forms.`naimenov`");
    37.  if($ath)
    38.  {
    39.      while($form = mysql_fetch_array($ath))
    40.      {
    41.        
    42.          $form_id=htmlspecialchars($form['id_form']);
    43.          $form_id_pred=htmlspecialchars($form['id_predpr']);
    44.          $form_obr_s=htmlspecialchars($form['srok_poluch']);
    45.          $form_obr_po=htmlspecialchars($form['srok_otpr']);
    46.          $form_id_otd=htmlspecialchars($form['id_otd']);
    47.          $form_id_name=htmlspecialchars($form['id_name']);
    48.  
    49.  
    50. //название формы        
    51.  $ath2 = mysql_query("SELECT * FROM forms WHERE id_form=".$form_id);
    52.          if($ath2)
    53.          {
    54.              while($forms = mysql_fetch_array($ath2))
    55.              {
    56.          $forms_id=htmlspecialchars($forms['id_form']);
    57.          $forms_naim=htmlspecialchars($forms['naimenov']);
    58.              }        
    59.          
    60.          
    61.          
    62.            
    63.            
    64.        
    65. //вот то самое ПРЕДПРИЯТИЕ, с которым проблемы    
    66. $ath9 = mysql_query("SELECT * FROM predpriyat WHERE id_predpr=".$form_id_pred);
    67. if($ath9)
    68.          {
    69.              while($pred = mysql_fetch_array($ath9))
    70.              {
    71.                  $predpr=htmlspecialchars($pred['nazv']);
    72.                  $predpr_id=htmlspecialchars($pred['id_predpr']);
    73.                  $okfs=htmlspecialchars($pred['okfs']);
    74.                  $okato=htmlspecialchars($pred['okato']);
    75.                  $okved=htmlspecialchars($pred['okved']);
    76.              }
    77.  
    78.        
    79. //таблица, соединяющаяся с таблицей predpriyat!       
    80. $ath10 = mysql_query("SELECT * FROM okfs WHERE id=".$okfs);
    81. if($ath10)
    82.          {
    83.              while($okfs_num = mysql_fetch_array($ath10))
    84.              {
    85.                  $okfs_nazv=htmlspecialchars($okfs_num['num']);
    86.                  
    87.              }
    88.        
    89. //таблица, соединяющаяся с таблицей predpriyat!           
    90. $ath12 = mysql_query("SELECT * FROM okved WHERE id=".$okved);
    91. if($ath12)
    92.          {
    93.              while($okved_num = mysql_fetch_array($ath12))
    94.              {
    95.                  $okved_nazv=htmlspecialchars($okved_num['num']);
    96.                  
    97.              }
    98.            
    99.              
    100. //таблица, соединяющаяся с таблицей predpriyat!       
    101. $ath11 = mysql_query("SELECT * FROM okato WHERE id=".$okato);
    102. if($ath11)
    103.          {
    104.              while($okato_num = mysql_fetch_array($ath11))
    105.              {
    106.                  $okato_nazv=htmlspecialchars($okato_num['num']);
    107.                  
    108.              }
    109.  
    110.              echo "<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\">";  
    111.              echo "<tr><td><font color=\"black\">".$forms_naim."</font></td>
    112.               <td><font color=\"black\">".$predpr."</font>  
    113.            
    114.  
    115. //тут всплывающее окно, чтобы просматривать ОКФС, ОКАТО и ОКВЭД предприятия!
    116. <a href=\"#\" onclick=\"document.getElementById('wind_".$predpr_id."').style.display='block'; return false;\">  
    117. <img src=\"http://test1.ru/new/prosmotr/Forms/eye.png\" alt=\"Просмотр данных предприятия\" title=\"Просмотр данных предприятия\" border=\"0\" > </a>  
    118. <div id=\"wind_".$predpr_id."\" class=\"wind\"><br>
    119. <center>
    120. <table border=5>
    121. <tr><td><font color=\"082567\"><font size=\"3px\">Название:</font></font></td>
    122. <td><textarea name=comment rows=5 cols=25 readonly>$predpr</textarea></td></tr>
    123. <tr><td><font color=\"082567\"><font size=\"3px\">ОКФС:</font></font></td>
    124. <td><textarea name=comment rows=1 cols=25 readonly>$okfs_nazv</textarea></td></tr>
    125. <tr><td><font color=\"082567\"><font size=\"3px\">ОКАТО:</font></font></td>
    126. <td><textarea name=comment rows=1 cols=25 readonly>$okato_nazv</textarea></td></tr>
    127. <tr><td><font color=\"082567\"><font size=\"3px\">ОКВЭД:</font></font></td>
    128. <td><textarea name=comment rows=1 cols=25 readonly>$okved_nazv</textarea></td></tr>
    129. </table></center>
    130. <button type=\"button\" value=\"закрыть\" onclick=\"document.getElementById('wind_".$predpr_id."').style.display='none'; return false;\">  Закрыть</button>  
    131.               </div>
    132.              </td>
    133.  
    134.              <td><font color=\"black\"><font color=\"2a52be\">Получил: </font>" .$form_obr_s. "&nbsp&nbsp<font color=\"2a52be\"> Отправил: </font>" .$form_obr_po."</font></td>
    135.  
    136. <td>   <a href=editform_form.php?id=".$form_id."><input type=submit value=\"Изменить\"></a>    
    137.       <a href=delete_form.php?id=".$form_id."><input type=submit value=\"Удалить\"></a>
    138. </td>
    139.           </tr>";
    140.           }
    141.          }
    142.      }
    143.  }
    144. }
    145. }
    146. }
    147. echo "</table>";
    148. mysql_close($link);
    149. }
    150. ?>
    151.  
    Вот! :cry:
     
  2. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Покажите БД
     
  3. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Какую именно часть? Там просто в начале вопроса на скринах вся проблемная часть выложена! и таблицы, которые необходимы!
     
  4. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Структуру этих таблиц, что бы можно было увидеть как у вас получаются данные
     
  5. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Dimitry_LD
    Давай, пиши побольше восклицательных знаков, чего уж там стесняться!
     
  7. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    А? О чём вы? где? :)
     
  8. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Не, а если серьёзно на счёт проблемы..
    Пожааааалуйста
     
  9. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Dimitry_LD
    когда удаляешь предприятие, необходимо удалить/обнулить все связанные с ним записи, т.е. при удалении предприятия в своей самой верхней таблице выставляешь id_predpr НУЛЛ.
    и вопрос: какие ты будешь брать значения из зависимых таблиц OKFS, OKATO, OKVED, если ты удаляешь предприятие?
     
  10. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Наверное я не понял, но ведь там и так id_predpr стоит NULL...или я чего то не так понял? :(

    Таблицы OKFS, OKATO, OKVED хранятся отдельно и таблица predpriyat берёт данные об этих OKFS, OKATO, OKVED..
    И наверно я чего то не так делаю, но если убрать связь с этими ДОП.таблицами, то всё начинает работать нормально! Т.е. при удалении предприятия на его месте возникает пустое поле! Как же так? что такое?
     
  11. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    точно сказать не могу, но скорее всего не понял. когда ты удаляешь предприятие, в таблице forms_glav нужно найти все записи для этого предприятия, и выставить id_predpr в нулл. и то - не факт что это поможет.
     
  12. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    да...вы правы..подобное не помогло.. :(
     
  13. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    тут нужно аццкое решение - вызов специалиста на дом :)

    а как ты его убирал, если не секрет? возможно ларчик просто открывается
     
  14. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Ну..я не из Ташкента, к сожалению :)
    PHP:
    1.  
    2. //код, что был выше
    3.  
    4. $ath9 = mysql_query("SELECT * FROM predpriyat WHERE id_predpr=".$form_id_pred);
    5.  if($ath9)
    6.          {
    7.              while($pred = mysql_fetch_array($ath9))
    8.              {
    9.                  $predpr=htmlspecialchars($pred['nazv']);
    10.                  $predpr_id=htmlspecialchars($pred['id_predpr']);
    11.                  $okfs=htmlspecialchars($pred['okfs']);
    12.                  $okato=htmlspecialchars($pred['okato']);
    13.                  $okved=htmlspecialchars($pred['okved']);
    14.              }
    15.  
    16.        
    17.  //УБРАЛ это      
    18.  $ath10 = mysql_query("SELECT * FROM okfs WHERE id=".$okfs);
    19.  if($ath10)
    20.          {
    21.              while($okfs_num = mysql_fetch_array($ath10))
    22.              {
    23.                  $okfs_nazv=htmlspecialchars($okfs_num['num']);
    24.                
    25.              }
    26.        
    27.  //Это        
    28.  $ath12 = mysql_query("SELECT * FROM okved WHERE id=".$okved);
    29.  if($ath12)
    30.          {
    31.              while($okved_num = mysql_fetch_array($ath12))
    32.              {
    33.                  $okved_nazv=htmlspecialchars($okved_num['num']);
    34.                
    35.              }
    36.            
    37.            
    38.  //И это  
    39.  $ath11 = mysql_query("SELECT * FROM okato WHERE id=".$okato);
    40.  if($ath11)
    41.          {
    42.              while($okato_num = mysql_fetch_array($ath11))
    43.              {
    44.                  $okato_nazv=htmlspecialchars($okato_num['num']);
    45.                
    46.              }
    Лишь в коде!
     
  15. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Нус..код выше :)
     
  16. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Dimitry_LD
    вечером посмотрю, если силы ещё останутся :)
     
  17. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Хорошо, конечно! Но помогите с этим...это будет последний мой вопрос :)
    Ибо я уже почти закончил всё)

    p.s.
    Заранее благодарю! :)
     
  18. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    До вечера...надеюсь :)
     
  19. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Dimitry_LD
    вроде логично. как только удаляется предприятие, строка
    Код (Text):
    1. $ath9 = mysql_query("SELECT * FROM predpriyat WHERE id_predpr=".$form_id_pred);
    перестаёт работать, и соответственно весь последующий код во вложенных запросах не выполняется.

    добавь до 67 строки $ath9 = mysql_query("SELECT * FROM predpriyat WHERE id_predpr=".$form_id_pred);
    инициализацию переменных:

    Код (Text):
    1. $okfs = 0;
    2. $okved = 0;
    3. $okato = 0;
    должно помочь


    -- добавлено --
    вообще правильным было бы обходится одним запросом с использованием left join-ов, а не писать подзапросы каждый раз.
     
  20. Dimitry_LD

    Dimitry_LD Активный пользователь

    С нами с:
    13 янв 2011
    Сообщения:
    60
    Симпатии:
    0
    Адрес:
    GH
    Даа, помогло, спасиибо вам :)
    А что про Join? Интересно стало)
     
  21. centnerik

    centnerik Активный пользователь

    С нами с:
    11 мар 2011
    Сообщения:
    32
    Симпатии:
    0
    Мож быть немного не в тему, но я гдето читал, что если возникает проблема удаления в связанных таблицах, то как выриант, можно соотнести все связанные записи в какой-то другой раздел. Например создать раздел "Общее" и присвоить его ID всем связанным записям. )))))))))) Водка - зло, и надо с ним бороться