Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] Przydzielanie ID do do innej tabeli
matius71
post 22.03.2018, 02:11:45
Post #1





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


Witam,

wpisuje w formularzu dane. Wysyłam je i w bazie wszystko ładnie się wpisuje, nadaje się ID itd. Słowem wszystko gra. Pomyślałem żeby przy okazji wypełniania formularza zapytać użytkownika o inne dane które będą wpisywane do innej tabeli. I teraz mam takie tabele:

1. Samochod
ID | Marka | Model | Nr. rejestracyjny | i inne

Wypełniam formularz, pojawia się nowy wpis i wskakuje ID. Tyle mam teraz i działa. Teraz zaczynają się schody (dla mnie)

Pomyślałem że dodam tabele Oleje w której jest lista dostępnych nazw i tabele łączącą ID samochodu z ID oleju (zakładam że samochód może jeździć na paru olejach)

2 Olej i tam
ID | nazwa a| nazwa b | nazwa c| itd

Teraz zrobiłem tabele:

3.Samochod Olej
ID | ID samochodu | ID Oleju

Teraz problem. Gdy zakładam profil samochodu czyli tabela pierwsza (to mam) i w tym samym momencie chce wpisać w tabele nr 3 ID samochodu którego w sumie jeszcze nie znam bo nie wysłałem formularza to jak to sprytnie zrobić żeby to samo ID samochodu trafiło do ID tabeli 3? biggrin.gif Bo z ID oleju z tabeli nr2 nie ma problemu bo ona istnieje i wystarczy odczytać ID. Myślałem już żeby najpierw tworzyć profil samochodu a dopiero później w jakimś innym formularzu pytać o rodzaj oleju bo wtedy bym znał już i wiedział jak odczytać ID samochodu.

A tu jest to co mam jeśli chodzi o przesyłanie do bazy do tabeli nr1

  1. if (!isset($error)) {
  2. try {
  3.  
  4. //insert into database with a prepared statement
  5. $stmt = $db->prepare('INSERT INTO samochod (Marka,Model,rejestracyjny,a,b,c,d) VALUES (:Marka,:Model,:rejestracyjny,:a,:b,:c,biggrin.gif)');
  6. $stmt->execute(array(
  7. ':Marka' => $Marka,
  8. ':Model' => $Model,
  9. ':rejestracyjny' => $rejestracyjny,
  10. ':a' => $a,
  11. ':b' => $b,
  12. ':c' => $c,
  13. 'biggrin.gif' => $d
  14.  
  15. ));
  16. $id = $db->lastInsertId('samochodID');
  17.  
  18. //redirect to index page
  19. header('Location: ....../........');
  20.  
  21. //else catch the exception and show the error.
  22. }
  23. catch (PDOException $e) {
  24. $error[] = $e->getMessage();
  25. }
  26.  
  27. }


Ten post edytował matius71 22.03.2018, 13:15:46
Go to the top of the page
+Quote Post
trueblue
post 22.03.2018, 07:53:11
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


W linii 6 dodajesz nowy samochód, w linii 16 pobierasz jego ID (w przypadku MySQL nie jest potrzebna nazwa sekwencji przekazywana do tej funkcji).
Skoro masz ID samochodu, to możesz wstawić dane do tabeli 3.


--------------------
Go to the top of the page
+Quote Post
matius71
post 22.03.2018, 13:33:15
Post #3





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


Czyli w linii 17 muszę wstawić:

  1. $stmt = $db->prepare('INSERT INTO samochod_olej (samochodID,olejID) VALUES (:samochodID,:olejID)');
  2. $stmt->execute(array(
  3.  
  4. i tam dalej co potrzeba.....
  5.  


Coś takiego?

Bo mi chodzi głównie o to że puki nie zostaną wstawione dane nowego samochodu to nie istnieje jeszcze ID tego samochodu które muszę wstawić do tabeli nr 3
Go to the top of the page
+Quote Post
trueblue
post 22.03.2018, 13:40:43
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Tak.


--------------------
Go to the top of the page
+Quote Post
matius71
post 22.03.2018, 20:14:23
Post #5





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


Leci "Pomógł" bo wszystko pięknie śmiga!

Właściwie mam jeszcze jeden problem i tyczy się właściwie tej samej bazy.

Pobieram wartości z bazy i wklepuje je w chekcbox o tak:

  1. <label class="control-label">Fuel Type:</label>
  2. <div type=checkbox tabindex=8>
  3. <?php
  4. $stmt = $db->query('SELECT fuelID, fuelType FROM list_fuel');
  5.  
  6. while($x = $stmt->fetch(PDO::FETCH_ASSOC))
  7. {
  8. echo "
  9. <label><input type=checkbox name=fuelID[] value=\"".$x['fuelID']."\">".$x['fuelType']."</input></label>";
  10. }
  11. ?>
  12. </div>


Mogę je sobie pięknie wyświetlić które wybrałem:

  1. <?php
  2. if (isset($_POST['fuelID']))
  3. {
  4. echo 'zaznaczone checkbox\'y z wartosciami: ' . implode($_POST['fuelID'], ', ');
  5. }?>


Wszysko działa tylko nie potrafie ich wysłać do bazy danych tak żeby każdy FuelID był w oddzielnym wierszu i miał to samo samochodID. Nie byłoby problemu gdybym miał wyświetlane na sztywno ilość boxów do zaznaczenia. Jakie trzeba zapytanie zrobić żeby dodawało się tyle wierszy w bazie co wybranych opcji?
Go to the top of the page
+Quote Post
trueblue
post 22.03.2018, 20:21:55
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


$_POST['fuelId'] jest tablicą, przecież taką utworzyłeś w HTML i też wyświetlasz jej całą zawartość jako string.
Skoro tablica to for, albo foreach.

A tak przy okazji <input> to tag samozamykający się, więc: <input> lub <input/>.
<div> raczej nie ma typu checkbox.


--------------------
Go to the top of the page
+Quote Post
matius71
post 23.03.2018, 18:30:20
Post #7





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


Faktycznie trochę bzdur tu jest które są wynikiem poprzednich zmagań i po prostu nie wykasowałem tego i zapomniałem biggrin.gif Już usunięte!

Dobra, wracając do problemu mam teraz coś takiego co całkiem ładnie śmiga z pętlą for:
  1. if (isset($_POST["fuelID"] )) {
  2. for ($i=0;$i<count($_POST["fuelID"]);$i++) {
  3. $fuelID = $_POST["fuelID"][$i];
  4.  
  5. echo $fuelID ;
  6. }
  7. }


O ile echo jest w pętli to wyświetla się dobrze bo jest w pętli a jak jest już gdzieś indziej w kodzie to już się wyświetla jedna wartość.

Jak powinienem zapisywać to w bazie? Czy w linii 4 powinienem po prostu dodać zapytanie do bazy z insertem? Oczywiście linia 5 jest tylko po to żebym mógł zobaczyć czy dział i jej nie będzie ;P
Go to the top of the page
+Quote Post
trueblue
post 23.03.2018, 19:07:05
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Tak, w pętli każdy INSERT z osobna. W przypadku PDO pomocne będzie użycie bindParam, dzięki temu przygotowujesz raz zapytanie (prepare), a w pętli tylko wykonujesz (execute).
Albo poza pętlą, wtedy musisz przygotować sobie dane w pętli: https://stackoverflow.com/questions/2645621...n-php-pdo-mysql


--------------------
Go to the top of the page
+Quote Post
matius71
post 25.03.2018, 18:30:48
Post #9





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


Ajjjjjj.. coś mnie to przerasta, może jakieś podpowiedzi bo nie widze tego
Go to the top of the page
+Quote Post
trueblue
post 25.03.2018, 18:48:51
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Czego nie widzisz?
Robisz zwykły INSERT, ale w pętli.

Jeśli chcesz zrobić jeden INSERT wielu rekordów naraz (poza pętlą), to wtedy musi mieć np. taką postać:
  1. INSERT INTO samochod_olej (samochodID,olejID) VALUES (1,1), (1,2), (1,3);



--------------------
Go to the top of the page
+Quote Post
matius71
post 26.03.2018, 12:19:32
Post #11





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 22.08.2009

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


No dobra ale jeśli poza pętlą chcę i nie wiem ile będzie checkboxów bo teraz sa 3 a w przyszłości może będzie więcej to jak to zapisać żeby w zapytaniu się to zmieniało automatycznie?
Go to the top of the page
+Quote Post
trueblue
post 26.03.2018, 12:39:17
Post #12





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


W linku, który podałem są przykłady.


--------------------
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: 19.04.2024 - 19:31