Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] 2 razy INSERT za 1 zamachem
Forum PHP.pl > Forum > PHP
yakass
Mam pewien problem. Mój skrypt forum został tak napisany, że informacje o poście są w jednej tabeli a treść w drugiej, obie tabele mają wspólną kolumnę ID. Wygląda to mniej więcej tak:

Kod
forum_toc (tabel z informacjami o poście)
id | var1 | var2 | var3... itd
------------------------
   |      |      |

forum_text (tabela z treścią posta)
id | tresc |
------------
   |       |


Problem pojawia się w zapisie nowego postu, nowe ID pobierane jest poprzez wywołanie do bazy danych, pobraniu najwyższego ID z forum_toc i zwiększenie go o 1. Następnie nowe dane są umieszczane w tabeli poprzez wywołane 2 razy funkcje INSERT (po jednej dla kazdej tabeli). Tabele nie mają ani indexu, ani auto_increment (żeby nie było ewentualnych problemów z ID).

Jeżeli teraz jednocześnie 2 uzytkowników wpisuje coś na forum to nieraz zdarza się tak, że jeden użytkownik nadpisuje forum_text drugiemu użytkownikowi (wpisy w forum_toc są poprawne, a na forum_text jest wpisane 2 razy to samo...). Moje forum jest dosyć często odwiedzane i co jakiś czas wyskakują właśnie takie kwiatki.

JAK ZROBIĆ, ŻEBY W JEDNYM WYWOŁANIU WPISAĆ DANE W OBYDWIE TABELE (wtedy pozbyłbym się tego problemu)? Ale w sumie problem pewnie też tkwi w pobieranym wcześniej ID... miedzy pobraniem tedo MAX ID a wpisaniem do bazy dancyh wykonywany jest jeszcze jakiś kod...

LUB JAK POŁĄCZYĆ TE 2 TABELE W JEDNĄ.

Niestety nie jest to takie łatwe, ponieważ skrypt cały czas działa i w tabelach jest po około 20 000 rekordów (forum_toc zajmuje 1 MB, forum_text zajmuje 15 MB). Napisałem ten poniższy kod, ale w ciągu 30 sekund przekopiowało tylko 301 postów sad.gif (w domu testowałem to na Windows XP, AMD Athlon 2000+, Apache 2.0.47, php 4.3.4, MySQL 3.23.53-max-nt). Nie wiem jak będzie na serwerze, ale pewnie podobie, a ja musiałbym to połączyć bez timeouta (oczywiście moją stronę na czas połączenie był odłączył od MySQLa)...

  1. <?php
  2. $result = mysql_query(&#092;"SELECT * FROM `forum_text` WHERE 1\");
  3. while(list($id, $dane) = mysql_fetch_row($result)){
  4. $update = mysql_query(&#092;"UPDATE forum_toc SET post_tresc='$dane' WHERE id='$id'\");
  5. }
  6. ?>

Opis do forum_toc kolumnę post_tresc i na podstawie ID miały być kopiowane wpisy z jednej tabeli do drugiej... niestety jak już pisałem, to ma za małą wydajność...

Czy ktoś wie, jak połączyć 2 tabele z taką ilością danych w jedną tabelę.
-------------------------------------


UZYWAJ BBCodeu
Seth
Zbłąkany
Spróbuj na czas polecenia INSERT zablokować tabele z atrybutem WRITE cool.gif
yakass
Jeżeli się nie da tego wykonać, to proszę chociaż o adnotację, żebym po prostu się nie łudził na jakieś odpowiedzi...
Bora
dziwie sie że jeszzce nikt nie odpowiedział, w takim wypadku postaram sie sam pomóc

Kod
forum_toc (tabel z informacjami o poście)
id | var1 | var2 | var3... itd
------------------------
  |      |      |

forum_text (tabela z treścią posta)
id | tresc |
------------
  |       |

Tabela forum_toc powinna być primary auto_increment.
  1. <?php
  2.  
  3. $query = mysql_query(&#092;"INSERT INTO forum_toc (.....\");
  4. $id = mysql_insert_id();
  5. $query = mysql_query(&#092;"INSERT INTO forum_text (id,....) VALUES ('\".$id.\"', '.......\");
  6. ?>
yakass
Cytat(Bora @ 2004-07-15 00:22:44)
dziwie sie że jeszzce nikt nie odpowiedział, w takim wypadku postaram sie sam pomóc

Kod
forum_toc (tabel z informacjami o poście)
id | var1 | var2 | var3... itd
------------------------
 |      |      |

forum_text (tabela z treścią posta)
id | tresc |
------------
 |       |

Tabela forum_toc powinna być primary auto_increment.
  1. <?php
  2.  
  3. $query = mysql_query(&#092;"INSERT INTO forum_toc (.....\");
  4. $id = mysql_insert_id();
  5. $query = mysql_query(&#092;"INSERT INTO forum_text (id,....) VALUES ('\".$id.\"', '.......\");
  6. ?>

Proste i genialne biggrin.gif, wielkie dzięki za pomoc. W końcu się pozbyłem tego problemu...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.