Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wstawianie danych do kilku tabel jednocześnie
filipe
post 12.08.2009, 14:08:36
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 22.07.2009

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


Witam wszystkich,

Mam pewien problem dotyczący PHP i MySQL'a.
Wykonuję pewną aplikację w PHP i stanąłem w pewnym momencie.
Mam powiedzmy 5 tabel, (które w skrócie przedstawiam poniżej):

KOMENTARZE
id_komentarza PK
treść_komentarza
data_dodania

UZYTKOWNIK
id_uzytkownika PK
imię
nazwisko

SPRZĘT
id_sprzętu PK
nazwa_sprzętu

KOMENTARZE_UZYTKOWNIKÓW
id_użytkownika FK
id_komentarza FK

KOMENTARZE_SPRZETU
id_sprzetu FK
id_komentarza FK


Problem polega na tym, że chcę, aby zalogowany użytkownik mógł dodawać komentarze dla konkretnych sprzętów.
Mam wydobyte id_użytkownika i id_sprzętu. Potrzebuję jeszcze zdobyć id_komentarza, które dodawane jest automatycznie jako AUTOINCREMENT.

Po wypełnieniu formularza dodającego komentarz i kliknięciu - "dodaj komentarz" powinny zostać zapisane dane do tabeli KOMENTARZE oraz do tabel pośrednich KOMENTARZE_UZYTKOWNIKOW i KOMENTARZE_SPRZETOW.
Nie ma problemu z zapisem danych do tabeli KOMENTARZE, ale za to nie wiem jak zapisać dane do pozostałych w/w dwóch tabel pośrednich.

Myślałem żeby stworzyć może jakiś trigger, ale nie wiem czy jest to dobre rozwiązanie, a poza tym żeby zapisać dane do tabel pośrednich - muszę znać id_komentarza, które w danym momencie zapisuję - i to jest największy chyba problem.

W jaki sposób mogę podczas zapisywania tabeli, wyciągnąć jej id (id_komentarza), gdy id jest AUTOINCREMENT?

Czy mógłby mi ktoś podpowiedzieć, w jaki sposób powinienem to wykonać?



Z góry dzięki za pomoc.

Go to the top of the page
+Quote Post
artega
post 12.08.2009, 17:22:44
Post #2





Grupa: Zarejestrowani
Postów: 174
Pomógł: 42
Dołączył: 22.07.2007
Skąd: /dev/random

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


Użyj funckji php mysql_insert_id po wstawieniu komentarza lub w zapytaniu dodającym relacje
  1. INSERT INTO KOMENTARZE_UZYTKOWNIKÓW SET id_użytkownika=1, id_komentarza=LAST_INSERT_ID();
Go to the top of the page
+Quote Post
filipe
post 13.08.2009, 09:08:38
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 22.07.2009

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


Cytat(artega @ 12.08.2009, 18:22:44 ) *
Użyj funckji php mysql_insert_id po wstawieniu komentarza lub w zapytaniu dodającym relacje
  1. INSERT INTO KOMENTARZE_UZYTKOWNIKÓW SET id_użytkownika=1, id_komentarza=LAST_INSERT_ID();


Dzięki,
Nie sprawdzałem jeszcze tego, ale zakładam że działa (dzisiaj sprawdzę), ale tak czy inaczej jeśli zrobię zarówno insert do tabeli komentarze jak i komentarze_uzytkowników, to nie jest rozwiązany problem transakcji - co się stanie, jeśli w tej samej sekundzie inna osoba doda komentarz?
Może być tak, że pierwsza osoba doda komentarz, a wpisze się id komentarza do tabeli komentarze_użytkowników dla innej osoby - drugiej osoby, która w tym samym momencie dodała komentarz.

I jak sobie z tym poradzić?
Użyć transakcji? Ale z kolei przy użyciu transakcji zablokuję możliwość dodania komentarza drugiej osobie w tym samym momencie, a chcę żeby wiele osób mogło dodawać komentarze jednocześnie, tylko żeby zapisywały się one we właściwych miejscach...

P.S.
Sorry, jeśli coś napisałem niezrozumiale ....

Ten post edytował filipe 13.08.2009, 09:09:14
Go to the top of the page
+Quote Post
artega
post 13.08.2009, 09:47:18
Post #4





Grupa: Zarejestrowani
Postów: 174
Pomógł: 42
Dołączył: 22.07.2007
Skąd: /dev/random

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


Cytat
Nie sprawdzałem jeszcze tego, ale zakładam że działa (dzisiaj sprawdzę), ale tak czy inaczej jeśli zrobię zarówno insert do tabeli komentarze jak i komentarze_uzytkowników, to nie jest rozwiązany problem transakcji - co się stanie, jeśli w tej samej sekundzie inna osoba doda komentarz?
Może być tak, że pierwsza osoba doda komentarz, a wpisze się id komentarza do tabeli komentarze_użytkowników dla innej osoby - drugiej osoby, która w tym samym momencie dodała komentarz.

Baza danych jest odpowiedzialna za spójność danych. W dokumentacji jest napisane
Cytat
The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.

na chłopski rozum oznacza to, że każdy klient otrzyma ID, które nie będzie kolidować z innymi połączeniami. Użyj transakcji aby uzyskać efekt atomowości.
Go to the top of the page
+Quote Post
filipe
post 13.08.2009, 11:09:48
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 22.07.2009

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


Cytat(artega @ 13.08.2009, 10:47:18 ) *
Baza danych jest odpowiedzialna za spójność danych. W dokumentacji jest napisane

na chłopski rozum oznacza to, że każdy klient otrzyma ID, które nie będzie kolidować z innymi połączeniami. Użyj transakcji aby uzyskać efekt atomowości.


Dobra dzięki za pomoc. PHP i MySQL dopiero zaczynam się uczyć od 1,5 miesiąca więc nie wiem jeszcze wielu rzeczy i stąd takie pytania.
Go to the top of the page
+Quote Post
dr_bonzo
post 13.08.2009, 11:19:01
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Z innej beczki

Cytat
Problem polega na tym, że chcę, aby zalogowany użytkownik mógł dodawać komentarze dla konkretnych sprzętów.
Mam wydobyte id_użytkownika i id_sprzętu. Potrzebuję jeszcze zdobyć id_komentarza, które dodawane jest automatycznie jako AUTOINCREMENT.

Po wypełnieniu formularza dodającego komentarz i kliknięciu - "dodaj komentarz" powinny zostać zapisane dane do tabeli KOMENTARZE oraz do tabel pośrednich KOMENTARZE_UZYTKOWNIKOW i KOMENTARZE_SPRZETOW.
Nie ma problemu z zapisem danych do tabeli KOMENTARZE, ale za to nie wiem jak zapisać dane do pozostałych w/w dwóch tabel pośrednich.

A czemu nie zapiszesz id usera i id sprzetu w samym komentarzu - twoje rozwiazanie jest zbyt skomplikowane na twoje (opisane) potrzeby, wyglada jakbys pozwalal na przypisanie autoarstwa jednego komentarza wielu userkom, i jedenego kom. do wielu sprzetow.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
filipe
post 13.08.2009, 11:29:58
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 22.07.2009

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


Cytat(dr_bonzo @ 13.08.2009, 12:19:01 ) *
Z innej beczki


A czemu nie zapiszesz id usera i id sprzetu w samym komentarzu - twoje rozwiazanie jest zbyt skomplikowane na twoje (opisane) potrzeby, wyglada jakbys pozwalal na przypisanie autoarstwa jednego komentarza wielu userkom, i jedenego kom. do wielu sprzetow.


Może coś źle zaprojektowałem, ale założenie jest takie żeby wielu użytkowników mogło dodawać wiele komentarzy do danego sprzętu oraz żeby sprzęt miał od 0 do nieskończoności komentarzy dodanych przez różnych użytkowników, przy czym jeden użytkownik może dodać wiele komentarzy, ALE - tylko jeden komentarz do danego sprzętu.
Go to the top of the page
+Quote Post
dr_bonzo
post 13.08.2009, 11:44:33
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


No to wlasnie moje rozwiazanie ci to zapewni.
W dodatku zakladasz unique index na (user_id, sprzet_id) i masz po komentarzu od usera do 1 sprzetu.

Masz sprzet, do sprzetu mozna dodawac komentarze (tabela komentarze, a sprzet_id wskaze do ktorego sprzetu sie on odnosi).
Dalej, kazdy komentarz ma autora - usera (wiec komentarze.user_id wskazuje na tego usera).

I te 2 dodatkowe tabele sa ci zupelnie nie potrzebne.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
filipe
post 18.08.2009, 10:03:34
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 22.07.2009

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


Cytat(dr_bonzo @ 13.08.2009, 12:44:33 ) *
No to wlasnie moje rozwiazanie ci to zapewni.
W dodatku zakladasz unique index na (user_id, sprzet_id) i masz po komentarzu od usera do 1 sprzetu.

Masz sprzet, do sprzetu mozna dodawac komentarze (tabela komentarze, a sprzet_id wskaze do ktorego sprzetu sie on odnosi).
Dalej, kazdy komentarz ma autora - usera (wiec komentarze.user_id wskazuje na tego usera).

I te 2 dodatkowe tabele sa ci zupelnie nie potrzebne.


W tej chwili nie mogę do tego za bardzo przysiąść, ale jutro zobaczę jak wyjdzie to, o czym mówisz.

P.S
Wiem, że to już nie jest ten temat, ale mam jeszcze jeden problem, do którego zupełnie nie wiem jak mam się zabrać.

Mianowicie jak już się domyśliłeś - mam użytkownika, który ma jakieś pola typu imię, nazwisko, itp, itd i jeszcze pole zdjęcie.
Są 2 sposoby przechowywania zdjęć w bd: jako blob albo varchar (który ma ścieżkę do pliku na dysku). Ja chcę wybrać drugie rozwiązanie ze względu na większą wydajność bazy. Potrzebuję napisać taki uploader plików, który doda mi plik w wybrane miejsce na dysku i do bazy dancyh do danej kolumny dopisze adres, gdzie plik się znajduje. Stworzyłem sobie już taki katalog na serwerze i pobrałem przez PHP ten adres z komórki ZDJĘCIE z bazy danych i przy każdym użytkowniku wyświetla mi odpowiednie zdjęcie smile.gif Problem jest taki, że ja to zdjęcie ręcznie dodaję ,a rzecz jasna - musi dodawać go użytkownik - poprzez przycisk przeglądaj w formularzu - type=\"file\". No i zupełnie nie wiem jak to zrobić sad.gif
Może posiadasz takie gotowe rozwiązanie? Byłoby super i chyba już po moich problemach smile.gif


------------------

Dobra, to LAST_INSERT_ID() działa smile.gif

Chciałbym jeszcze tylko dodać, że zamiast LAST_INSERT_ID() można jeszcze zastosować w tym przypadku takie coś:
  1. SELECT auto_increment-1 FROM information_schema.TABLES WHERE table_name='nazwa_tabeli_z_ktorej_chcemy_wyciagnac_ostatnie_id'


Z grafikami sobie także już poradziłem.

Dzięki

Ten post edytował filipe 18.08.2009, 10:05:40
Go to the top of the page
+Quote Post
dr_bonzo
post 18.08.2009, 10:12:47
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


http://php.net.pl/manual/en/features.file-upload.php


--------------------
Nie lubię jednorożców.
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: 25.05.2024 - 18:13