Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] 2 razy INSERT za 1 zamachem
yakass
post 11.07.2004, 17:47:37
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 23.07.2003

Ostrzeżenie: (0%)
-----


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


--------------------
[ TO MIEJSCE CZEKA NA TWOJĄ REKLAMĘ ! ]
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Zbłąkany
post 11.07.2004, 22:13:25
Post #2


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

Ostrzeżenie: (0%)
-----


Spróbuj na czas polecenia INSERT zablokować tabele z atrybutem WRITE cool.gif


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
yakass
post 14.07.2004, 18:33:37
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 23.07.2003

Ostrzeżenie: (0%)
-----


Jeżeli się nie da tego wykonać, to proszę chociaż o adnotację, żebym po prostu się nie łudził na jakieś odpowiedzi...


--------------------
[ TO MIEJSCE CZEKA NA TWOJĄ REKLAMĘ ! ]
Go to the top of the page
+Quote Post
Bora
post 14.07.2004, 23:22:44
Post #4





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Bora 14.07.2004, 23:23:51
Go to the top of the page
+Quote Post
yakass
post 17.07.2004, 21:27:00
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 23.07.2003

Ostrzeżenie: (0%)
-----


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 MIEJSCE CZEKA NA TWOJĄ REKLAMĘ ! ]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:54