Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]Dodanie kilku rekordów do bazy danymiz formularza
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
wojtek1988
Pierwsze koty za płoty. Drugi problem jaki mam to dodanie kilku wierszy do bazy damych mysql poprzez wypełnienia formularza post.
Wyświetlić 4 formularzepotrafie ale chyba źle formułuje zapytanie do bazy danych. Pomożcie mistrzowie smile.gif

Zamieszczam kod jaki mam do tej pory :






  1. <form action='' method="post">
  2. <table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
  3. <tr><h5>Obowiązkowe pola oznaczone *</h5>
  4. <th style="text-align:center">NR </th>
  5. <th style="text-align:center">Nazwa* </th>
  6. <th style="text-align:center" >Adres internetowy </th>
  7. <th style="text-align:center" size="69">Adres</th>
  8. <th style="text-align:center">Telefon </th>
  9.  
  10. <th style="text-align:center">Uwagi </th>
  11.  
  12.  
  13.  
  14. </tr>
  15. </thead>
  16. <tr>


  1. for($i = 1; $i <=4; $i++) {


  1. <th style="text-align:center"><input type="text" size="3" value='' name="form[]"></th>
  2. <th style="text-align:center"><input type="text" value='' name="form[]"></th>
  3. <th style="text-align:center"><input type="text" value='' name="form[]"></th>
  4. <th style="text-align:center"><input type="text" value='' name="form[]"></th>
  5. <th style="text-align:center"><input type="text" value='' name="form[]"></th>
  6. <th style="text-align:center"><input type="text" value='' name="form[]"></th>
  7. </tr>

  1. }


  1. </br>
  2. <input type="hidden" value='1' name="send">
  3. <input type="submit" value='Dodaj producenta'>
  4. </form>

  1. }




  1. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  2.  
  3. // ustanawiamy poł&plusmn;czenie z serwerem baz danych
  4. // wybieramy bazę danych
  5. // konstruujemy zapytanie
  6. $zapytanie = "INSERT INTO producenci VALUES ";
  7. for($i = 0; $i < 6; $i++) {
  8. $zapytanie .= "('" . $_POST['form'][$i] . "')";
  9. if($i < 6 - 1)
  10. $zapytanie .= ", ";
  11. }
  12. // cała reszta kodu
  13. echo $zapytanie;
  14.  
  15.  
  16. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  17. header("refresh: 12; url=kontakty.php");
  18. }
  19.  
  20. echo ShowForm();



Podzieliłem cały kod odpowiednimi znacznikami ale nie wiem czy jest to czytelne....? ohno-smiley.gif




A może w inny sposób należy to zrobićquestionmark.gif

posidam tabele producenci która ma kolumny id, nazwa,adres www, adres, telefon, uwagi

Przekazanie tych danych poprzez tablice post . Następnie jak sformułowac zapytanie do bazy aby dodac np 4 wiersze jednoścześnie questionmark.gif
Michasko
Każde pole Twojego formularza ma taką samą nazwę...nie do końca rozumiem jak chcesz to zrobić.
Masz tablicę wartości z POST-a, ale nijak jej nie dzielisz na poszczególnych producentów.
Powinieneś mieć 4 formularze, ale niech Twoje pola nazywają się różnie, np:
  1. <input type="text" name="numer[]" />
  2. <input type="text" name="nazwa[]" />
  3. <input type="text" name="www[]" />
  4. <input type="text" name="adres[]" />
  5. <input type="text" name="telefon[]" />
  6. <input type="text" name="uwagi[]" />
I wtedy odbierając je w PHP odbierasz po kolei kolejne indeksy tablic i rozdzielasz je przecinkami (to, co zrobiłeś powyżej...jak ma zadziałać? masz 24 pola, a wpisujesz tylko 6). Czyli np.:
  1. $zapytanie = 'INSERT INTO producenci VALUES ';
  2. for($i = 0; $i < count($_POST['numer']); $i++){
  3. // walidujesz pola o poszczególnych indeksach
  4. // jeśli pola są poprawne, to dodajesz je do zapytania:
  5. $zapytanie .= '("'.$_POST['numer'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['www'][$i].'", "ciąg dalszy Twojego zapytania - powpisuj sobie kolejne zmienne POST ")';
  6. //dokończ sobie zapytanie sam :)
  7. if($i < count($_POST['numer']) - 1)
  8. {
  9. $zapytanie .= ', ';
  10. }
  11. }
wojtek1988
Wyswietlam 4 wiersze formularza i dodałem składnie mysql($zapytanie) ale nie jest dobre . ohno-smiley.gif
Wyświetla mi komuniktat Dodanie wyników nie powiodło sie ! ohno-smiley.gif
Zobaczcie smile.gif


  1.  
  2. for($i = 1; $i <=4; $i++) { ?>
  3. <th style="text-align:center"><input type="text" size="3" value='' name="id_producent[]"></th>
  4. <th style="text-align:center"><input type="text" value='' name="nazwa[]"></th>
  5. <th style="text-align:center"><input type="text" value='' name="url[]"></th>
  6. <th style="text-align:center"><input type="text" value='' name="adres[]"></th>
  7. <th style="text-align:center"><input type="text" value='' name="telefon[]"></th>
  8. <th style="text-align:center"><input type="text" value='' name="uwagi[]"></th>
  9. </tr> <?php }
  10.  
  11. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  12.  
  13. $zapytanie = 'INSERT INTO producenci VALUES ';
  14. for($i = 0; $i < count($_POST['numer']); $i++){
  15. // walidujesz pola o poszczególnych indeksach
  16. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  17. $zapytanie .= '("'.$_POST['id_producent'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['url'][$i].'", "'.$_POST['adres'][$i].'" , "'.$_POST['telefon'][$i].'" , "'.$_POST['uwagi'][$i].'" ")';
  18. //dokończ sobie zapytanie sam :)
  19. if ( mysql_query($zapytanie) ) {
  20. echo "Dodano wyniki do tabeli ";
  21. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  22. header("refresh: 2; url=kontakty.php");
  23. }
  24. echo "Dodawanie wyników nie powiodło się!";
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32. }
  33.  
  34. echo ShowForm();
Michasko
Linia 17: masz niepotrzebny cudzysłów na końcu.
Na przyszłość dodaj mysql_error():
  1. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
wojtek1988
Zastosowałem się do twoich wskazówek ale teraz mam komunikat :
"Dodawanie wyników nie powiodło się!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"INSERT INTO producenci VALUES' at line 1" ohno-smiley.gif ohno-smiley.gif
Co teraz? smile.gif
Michasko
Widocznie nadal masz błąd w zapytaniu. Jak ono teraz wygląda?
edit:
Hej, hej, chwila chwila. A gdzie masz dodawanie przecinków pomiędzy kolejnymi rekordami do wpisania?
W tej chwili Twoje zapytanie wygląda tak:
  1. INSERT INTO producenci VALUES
  2. (1, 'asddasd', 'asdasdad', 'asdasdasd', 'asdasdads', 'asdasdad')
  3. (2, 'asddasd', 'asdasdad', 'asdasdasd', 'asdasdads', 'asdasdad')
  4. itd...

pomiędzy nawiasami musisz mieć przecinki. Czemu to usunąłeś? :|
wojtek1988
Wygląda to tak :
  1. <?php
  2. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  3.  
  4. $zapytanie = '"INSERT INTO producenci VALUES ';
  5. for($i = 0; $i < count($_POST['numer']); $i++){
  6. // walidujesz pola o poszczególnych indeksach
  7. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  8. $zapytanie .= '("'.$_POST['id_producent'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['url'][$i].'", "'.$_POST['adres'][$i].'" , "'.$_POST['telefon'][$i].'" , "'.$_POST['uwagi'][$i].'" )';
  9. //dokończ sobie zapytanie sam :)
  10. if($i != count($_POST['numer']) - 1)
  11. {
  12. $zapytanie .= ', ';
  13. }
  14. }
  15.  
  16.  
  17. if ( mysql_query($zapytanie) ) {
  18. echo "Dodano wyniki do tabeli ";
  19. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  20. header("refresh: 2; url=kontakty.php");
  21. }
  22. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30. }
  31.  
  32. echo ShowForm();


W miejscu numer wpisac id_produkt for($i = 0; $i < count($_POST['numer']); $i++){ prawda?


Gdy tak zrobie wyświetla mi bląd:
Dodawanie wyników nie powiodło się!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"INSERT INTO producenci VALUES ("9", "1111", "hgfhgbg", "hjbgjhgbjhgb" , "jhfbvf' at line 1


czyli już z czytuje dane podane w pierwszym wierszu ale ...dalej coś nie tak ohno-smiley.gif
Michasko
Cytat
W miejscu numer wpisac id_produkt for($i = 0; $i < count($_POST['numer']); $i++){ prawda?
id_producent. Prawda.
wojtek1988
POkaże cały kod.
Najpierw formularz:
  1. for($i = 1; $i <=4; $i++) { ?>
  2. <th style="text-align:center"><input type="text" size="3" value='' name="id_producent[]"></th>
  3. <th style="text-align:center"><input type="text" value='' name="nazwa[]"></th>
  4. <th style="text-align:center"><input type="text" value='' name="url[]"></th>
  5. <th style="text-align:center"><input type="text" value='' name="adres[]"></th>
  6. <th style="text-align:center"><input type="text" value='' name="telefon[]"></th>
  7. <th style="text-align:center"><input type="text" value='' name="uwagi[]"></th>
  8. </tr> <?php } ?>
  9. </table>
  10. </br>
  11. <input type="hidden" value='1' name="send">
  12. <input type="submit" value='Dodaj producenta'>



Następnie reszte:
  1. <?php
  2. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  3. if(!empty($_POST["nazwa"])){ //oraz czy uzupełniono wszystkie dane
  4. if(mysql_num_rows(mysql_query("select * from producenci where nazwa='".htmlspecialchars($_POST["nazwa"]."'"))))ShowForm("Producent o podanej nazwie już jest w bazie!!!");
  5. elseif(mysql_num_rows(mysql_query("select * from producenci where id_producent='".htmlspecialchars($_POST["id_producent"]."'"))))ShowForm ("Podany numer jest już zajęty!!");
  6. else {
  7. $zapytanie = '"INSERT INTO producenci VALUES ';
  8. for($i = 0; $i < count($_POST['id_producent']); $i++){
  9. // walidujesz pola o poszczególnych indeksach
  10. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  11. $zapytanie .= '("'.$_POST['id_producent'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['url'][$i].'", "'.$_POST['adres'][$i].'" , "'.$_POST['telefon'][$i].'" , "'.$_POST['uwagi'][$i].'" )';
  12. //dokończ sobie zapytanie sam :)
  13. if($i != count($_POST['id_producent']) - 1)
  14. {
  15. $zapytanie .= ', ';
  16. }
  17. }
  18.  
  19.  
  20. if ( mysql_query($zapytanie) ) {
  21. echo "Dodano wyniki do tabeli ";
  22. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  23. header("refresh: 2; url=kontakty.php");
  24. }
  25. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  26.  
  27.  
  28. }
  29.  
  30.  
  31. }
  32. else ShowForm("<b>Nie uzupełniono nazwy producenta!!!</b> </br>");
  33. }
  34. echo ShowForm();
  35.  
  36. ?>


Przy próbie dodania producentów wyskakuje mi komunikat:

Dodawanie wyników nie powiodło się!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"INSERT INTO producenci VALUES ("8", "nazwa1", "", "" , "" , "" ), ("", "nazwa2"' at line 1
Michasko
Linia 7 - po co tam ten cudzysłów...?
teez
Mogę wiedzieć czemu tak strasznie komplikujecie sprawę? Po co Wam te []? Po co w for? Nie lepiej użyć mysql_query z LIMIT 4 oraz while?

  1. <form action='plik.php' method="post">
  2. Imie :<input type="text" name="imie">
  3. <input type="submit" value='Dodaj producenta'>
  4. </form>



plik.php

  1.  
  2. <?
  3. $imie = $_POST['imie'];
  4. if(empty($_POST['imie'])){
  5. echo 'puste pole, uzupelnij';
  6. exit; }
  7. else {
  8. $zapytanie = "INSERT into baza ( `imie` ) values ($imie)";
  9. mysql_query($zapytanie);
  10. }
  11. ?>
  12.  
  13.  


Odczyt

  1. <?
  2. $zapytanie = "SELECT * FROM baza LIMIT 4";
  3. $rs = mysql_query($zapytanie);
  4. while($row = mysql_fetch_row){
  5. echo 'Imie producenta: '.$row.'';
  6. echo '</br>';
  7.  
  8. }
  9. ?>
wojtek1988
Dla mnie Michasko jest mistrzem exclamation.gif!!!

Ale z chęcia posłucham innej rady teeza smile.gif
teez
Michasko lepiej zna sytuację, sam dopiero zaczynam powazniej się w to bawić, ale skoro ty również zaczynasz to po co masz zawracać sobie głowę od początku takim czymś, skoro można prościej z identycznym efektem. Jeszcze przyjdzie czas na resztę. wink.gif
Michasko
@teez, źle przeczytałeś chyba. On chce dodać 4 rekordy na raz, a nie odczytać. LIMIT na nic się tutaj nie zda wink.gif
teez
No to źle najwidoczniej odczytałem, zwracam honor. businesssmiley.png
wojtek1988
Dodanie 4 rekordów działa ale nie waliduje nie podania nazwy, któa jest obowiązkowa itp ..Zły układ mam chyba..
Michasko
Zwróć uwagę, że kilka pól u Ciebie ma atrybut name równy "nazwa[]". Oznacza to, że po przesłaniu do PHP Twoja zmienna $_POST['nazwa'] (zobacz 3. linijke ostatniego kodu) będzie tablicą, zatem pisząc:
  1. if(!empty($_POST['nazwa']))
sprawdzasz, czy tablica jest pusta, a nie czy poszczególne pola formularza są puste.
Walidację powinieneś przeprowadzać w pętli, w której "sklejasz" zapytanie. Np. w ten sposób:
  1. // początek pętli for
  2. if(!empty($_POST['nazwa'][$i]))
  3. {
  4. // sklejasz zapytanie
  5. }
  6. else
  7. {
  8. echo "Błąd! Nazwa nie może być pusta!";
  9. break;
  10. }
  11. //koniec pętli for
wojtek1988
A w moim przypadku jak sformułować kod aby nie podanie nazwy wywałało komunikat ze nie uzupełniona jest nazwa i id_produkt nie moze byc powtarzany?

Napisałem tak ale nie działa:
  1. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  2. if(!empty($_POST['nazwa'][$i])) //oraz czy uzupełniono wszystkie dane
  3. {
  4. $zapytanie = 'INSERT INTO producenci VALUES ';
  5. for($i = 0; $i < count($_POST['id_producent']); $i++){
  6. // walidujesz pola o poszczególnych indeksach
  7. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  8. $zapytanie .= '("'.$_POST['id_producent'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['url'][$i].'", "'.$_POST['adres'][$i].'" , "'.$_POST['telefon'][$i].'" , "'.$_POST['uwagi'][$i].'" )';
  9. //dokończ sobie zapytanie sam :)
  10. if($i != count($_POST['id_producent']) - 1)
  11. {
  12. $zapytanie .= ', ';
  13. }
  14. }
  15.  
  16.  
  17. if ( mysql_query($zapytanie) ) {
  18. echo "Dodano wyniki do tabeli ";
  19. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  20. header("refresh: 2; url=kontakty.php");
  21. }
  22. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  23.  
  24. }
  25. else
  26. {
  27.  
  28. echo"<b>Nie uzupełniono nazwy producenta!!!</b> </br>";
  29.  
  30.  
  31. }
  32. }
  33. echo ShowForm();
Michasko
Chłopie, czytaj uważnie:) Walidację masz przeprowadzać W PĘTLI. Nie przed nią.
  1. if(isset($_POST['send']) && $_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  2. $zapytanie = 'INSERT INTO producenci VALUES ';
  3. for($i = 0; $i < count($_POST['id_producent']); $i++){
  4. if(!empty($_POST['nazwa'][$i])) {
  5. echo "Pole \"nazwa\" nie może być puste!";
  6. }
  7. else
  8. {
  9. $zapytanie .= '("'.$_POST['id_producent'][$i].'", "'.$_POST['nazwa'][$i].'", "'.$_POST['url'][$i].'", "'.$_POST['adres'][$i].'" , "'.$_POST['telefon'][$i].'" , "'.$_POST['uwagi'][$i].'" )';
  10. if($i != count($_POST['id_producent']) - 1)
  11. {
  12. $zapytanie .= ', ';
  13. }
  14. }
  15. }
  16.  
  17.  
  18. if ( mysql_query($zapytanie) ) {
  19. echo "Dodano wyniki do tabeli ";
  20. echo "Producent został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  21. header("refresh: 2; url=kontakty.php");
  22. }
  23. else
  24. {
  25. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  26. }
  27. }
  28. echo ShowForm();
Jeśli chodzi o ID - jeśli chcesz je koniecznie nadawać ręcznie (jak to robisz teraz), to musisz je najpierw wyciągnąć z bazy, a potem w każdym obrocie pętli sprawdzać, czy nie podałeś jakiegoś, które się powtarza - mało wydajne.
Najlepiej byłoby, gdyby pole `id_producenta` w Twojej bazie danych miało właściwość AUTO_INCREMENT. Wtedy nie musisz podawać ID ręcznie, a zostanie ono przypisane automatycznie przez system bazy danych.
wojtek1988
@Michasko w 4 linijce usunąłem znak ! ponieważ odwronie działało smile.gif WIelkie dzięki mam nadzieję, zę jutro też bęzdiesz na forum smile.gif

Na dziś już koniec ale jutro będe dalej walczył.Bedziesz jutro?
Michasko
O, faktycznie, literówka się wkradła :)
Będę zaglądał mniej więcej do 16-17. Wieczorem już mnie nie będzie.
-wojtek1988-
ja bede juz koło 10 to sie odezwe z ciekawym pytaniem.potem dasz mi numer konta i spłace dług tongue.gif.. Ja twoj uczeń biggrin.gif
wojtek1988
Dzięki @Michasko juz wiem jak dodać kilka wierszy do bazy poprzez formularz i teraz zastanawiam się czy byłoby możliwe wykonanie wielokrotnego zapytania dodania wierszy a po nim zapytanie do bazy danych dodające jeden wiersz do innej tabeli pobierając z wielokrotnego formularza wybrane rekordy . Opsize to na przykłądzie.
Posiadam tabele produkty oraz PZ(dokument przyjecia produktów). W jednym dokumencie chciałbym przechowywac nazwe, ilosc i cene netto wszystkich dodanych produktów.
Dodanie kilku produktów wykonam ale po nim zapytanie dodające jeden wiersz z kilkoma nazwami, i,ościami oraz cenami netto wyżej dodanych produktów.
Co na ten temat myślą mistrzowie?? closedeyes.gif closedeyes.gif
Michasko
Czekaj czekaj, bo teraz znikąd pojawia nam się 'dokument'. Jaki dokument?

Jeśli chodzi o kilka produktów w jednym wierszu...nie ma sensu. Wygeneruj sobie ID np. danego zamówienia (czy tam przyjęcia) i dodaj tyle wierszy, ile masz produktów, ale każdy z takim samym ID "zamówienia". Potem wyciągając dane z bazy będziesz sobie wyświetlał wszystkie produkty dla zamówienia X.

Ewentualnie w tym wierszu "zamówienia" zrób sobie pole "produkty", a tam porozdzielasz je np. średnikami. Jednak jest to pójście bardzo okrężną i trudniejszą drogą wink.gif
wojtek1988
Pierwszy wariant jest fajny. W tabeli PZ usunę klucz główny i autoinkrementację z ID bo teraz mam. Zapytanie sql będzie wyglądac analgoicznie dodając produkty i dokumenty tylko, że id ,bądz numer PZ powinien być ten sam przy dodanym towarze co nie? smile.gif

Obecnie mam powiązany jeden towar z jednym dokumentem a wyświetlam dokumenty tak:
dokumenty pz
Michasko
Tak. Powiedzmy, ze ja chce od Ciebie zamowic 2 telewizory i 1 mikser. Wtedy do bazy dodajesz 2 rekordy:
Kod
ID_zamowienia | ID_produktu | ilosc
      3       |      7      |   2
      3       |      4      |   1
zakładając, że telewizor ma ID = 7, mikser = 4 smile.gif Oczywiście możesz dodać dowolną ilość kolumn - grunt, to aby każde zamówienie miało swoje własne ID.

Generalnie powiem Ci jak ja by to rozwiązał. Trzy tabele, które na pewno byłyby mi potrzebne - zamówienia, produkty i zamowienia_produkty. Oczywiscie dobrze jest też mieć osobne tabele z danymi klientów, magazynów itd. Ale te potrzebne do obsługi zamówień:
zamowienia:
Kod
ID_zamowienia | koszt | wszystkie | dalsze | kolumny | z danymi | zamowienia
produkty:
Kod
ID_produktu | cena | ilosc_na_stanie | dalsze kolumny...
zamowienia_produkty:
Kod
ID_zamowienia | ID_produktu | zamowiona_ilosc

I teraz tylko sprytnie to polaczyc smile.gif
wojtek1988
ale jak miałoby wyglądać zapytanie, które wyświetlałoby nazwy towarów oraz ich ilości o tym samy numerze id dokumentu?
Warunek where id_produkt ale dokłądniej jak?
tabela zamówienia to u mnie pz i ma kolumny


id_pz | data | nr_dok | id_magazyn | nazwa | sztuk| k_cena_netto | dostawca | przyjal | uwagi
i obecnie jeden id oraz nr_dok posiada jedna nazwe i po jednym rekordzie z reszty kolumn.

Klucz główny ma teraz id_pz ale jakby miało byc takiesamo w kilku rekordach - towarach to należy usunąc primary key prawda?

Nie mam pojęcia jak wyglądałoby takie zapytanie do bazy sad.gif
Michasko
Hola hola, nie masz usuwać primary_key. Nie rozumiesz mnie smile.gif musisz mieć:
- 1 tabelę z wszystkimi zamówieniami
- 1 tabelę z wszystkimi produktami
- 1 tabelę, która połączy zamówione produkty z konkretnym zamówieniem

Spójrz na strukturę, którą przedstawiłem Ci w poprzednim poście smile.gif

I nie "WHERE id_produkt", tylko "WHERE id_pz", bo szukasz wszystkich zamówionych produktów o takim samym ID zamówienia smile.gif Czyli na przykładzie bazy, którą Ci pokazałem:
  1. SELECT * FROM zamowienia_produkty WHERE id_zamowienia = x
jeśli chcesz dokładniejszej pomocy - przedstaw też strukturę tabeli produktów i tabeli, którą chcesz połączyć dany dokument z zamówionymi produktami smile.gif
wojtek1988
tabela produkty wygląda następująco


id_produkt | data | id_magazyn | nazwa | symbol | producent | typ | jednostka | k_cena_netto |k_stawka_vat | k_cena_brutto | marza | cena_netto | stawka_vat | cena_brutto | sztuk | rezerwacja | skladowanie | opis | kody_kreskowe | minimum | waga |gwarancja | data_waznosci | seria | dangerous | uwagi

id_produkt - autoinkrment i primary key
id_magazyn - foreign key

tabela pz(dokument przyjecia)
id_pz | data | nr_dok | id_magazyn | nazwa | sztuk| k_cena_netto | dostawca | przyjal | uwagi
id_pz - autoinkrement i primary key
nr_dok - unikalny index

tAbela wiąząca dokumenty z towaramijak powinna wyglądać?
Michasko
Kod
id_pz | id_produkt | zamowiona_ilosc | cena_za_sztuke
id_pz - klucz główny i jednocześnie klucz obcy tabeli 'pz'
id_produkt - klucz obcy tabeli 'produkty'
ilosc - wiadomo smile.gif
cena_za_sztuke - ułatwisz sobie tym tworzenie np. rachunków.

W razie gdybyś nie wiedział co to klucz obcy - CLICK. W skrócie - klucz obcy jest to pole, które jest kluczem głównym w innej tabeli. W ten sposób "wiążemy" ze sobą różne tabele. System bazy danych dzięki temu wie, że dane z tych dwóch (lub więcej) tabel są ze sobą powiązane i np. uniemożliwi Ci przypadkowe usunięcie jakiejś danej, albo będzie je aktualizował kaskadowo (jeśli zmienią się w głównej tabeli - zmienią się we wszystkich, aby zachować spójność).
wojtek1988
Tabele mam już zrobione. Teraz należy utworzyć dokument , który wyświetli tyle formularzy dodania towarów ile użytkownik sobie zażyczy. po wypełnieniu danych dokumnety i produktów naciskając przycisk potwierdz tworzą się rekodry nowych towarów w tabeli produkty, jeden dokument pz w tabeli pz oraz tyle wierszy ile produktów w tabeliz amówienia tak?

Wyświetlene dokumentów byłoby następujące.
Wyświetlić wszystkie wiersze z tabeli pz czyli nr_dok, kontrahentów oraz całkowity koszt
a szczegółowy opis dokumentu pobierałby dane z tabeli zamówienia tak? wtedy wszystkie wiersze o takim samym id_pz smile.gif
@Michasko szefie jak myslisz?
Michasko
Jeśli chodzi o wyświetlanie - tak.
Jeśli chodzi o dodawanie - nie wiem. Nie wiem co ma robić Twoja aplikacja, nie wiem czemu dodajesz równocześnie "towary" do tabeli "produkty" i "produkty" do tabeli "zamowienia", ani w ogóle na jakiej zasadzie to działa. Jeśli mógłbyś opisać cały proces od początku do końca, byłoby prościej.
wojtek1988
Już tłumaczę, jest to aplikacja magazynowa. Moduł, który jest ostatni to dokumenty a dokładnie PZ. Obsługa polega na przyjęciu towarów na podstawie dokumentu PZ. Obecnie gdy tworzony jest dokument uzytkownik z listy wyboru kontrahentów wybiera dostawcę, odbiorcą jest przedsiębiorstwo magazynu alewymagane jst podanie imienia i nazwiska reprezentanta przedsiębiorstwa, nr dokumentu to składowa RR-MM/nr . Data pobierana jest funkcja date(). Poniżej są pola opisujące id_towaru(nie obowiązkowe do wypełnienia ponieważ działa funkcja autoinkrement), nazwa , ilosc, cena netto, podatek vat z listy wyboru i potem automatycznie poprzez ajax wypełniane są wartosć VAtu, wartośc brutto. Ponizęj przycisk potwierdz ktory wykonuje 2 zapytania do bazy danych.
Pierwsze dodaje produkt do tabeli produkty( przyjmuje produkt)
  1. mysql_query("insert into produkty values('".htmlspecialchars($_POST["id_produkt"])."', '".htmlspecialchars($_POST["data"])."', '".htmlspecialchars($_POST["id_magazyn"])."','".htmlspecialchars($_POST["nazwa"])."','".htmlspecialchars($_POST["symbol"])."','".htmlspecialchars($_POST["producent"])."','".htmlspecialchars($_POST["typ"])."','".htmlspecialchars($_POST["jednostka"])."','".htmlspecialchars($_POST["k_cena_netto"])."','".htmlspecialchars($_POST["k_stawka_vat"])."','".htmlspecialchars($_POST["k_cena_brutto"])."','".htmlspecialchars($_POST["marza"])."','".htmlspecialchars($_POST["cena_netto"])."' , '".htmlspecialchars($_POST["stawka_vat"])."' , '".htmlspecialchars($_POST["cena_brutto"])."' , '".htmlspecialchars($_POST["sztuk"])."' , '".htmlspecialchars($_POST["rezerwacja"])."' , '".htmlspecialchars($_POST["skladowanie"])."' , '".htmlspecialchars($_POST["opis"])."' , '".htmlspecialchars($_POST["kody_kreskowe"])."' , '".htmlspecialchars($_POST["minimum"])."' , '".htmlspecialchars($_POST["waga"])."' , '".htmlspecialchars($_POST["gwarancja"])."' , '".htmlspecialchars($_POST["data_waznosci"])."' , '".htmlspecialchars($_POST["seria"])."' , '".htmlspecialchars($_POST["dangerous"])."' , '".htmlspecialchars($_POST["uwagi"])."' )"); // zapisywanie rekordu do bazy

Drugie zapytanie dodaje wiersz w tabeli PZ zawierający nazwe , ilosc, cene netto oraz strony transakcji


Wyświetlanie działa nasepująco. Użytkownik wchodzi do modułu dokumnetów potem staje przed wyborem typu dokumentów czyli PZ albo WZ
Wybiera PZ i widzi tabelę zawierającą wiersze każdy z nich wyświetla wszystkie informacje o pojedycznym dokumencie przyjęcia produktu.

A lepiej gdyby była możliwość klikniecia na dany id dokumentu i wyswietlenie lisy towarów powiązanych z nim oraz stony transkacji i koszta smile.gif


Zrobimy to ?tongue.gif
Michasko
No dobrze, ale załóżmy, że w magazynie masz 10 telewizorów i ktoś przywozi kolejne 10 dokładnie takich samych. Sumujesz to, czy masz 2 osobne rekordy, w kazdym po 10 telewizorów (chodzi mi o tabelę 'produkty').

Ale generalnie koncepcja dodawania jest OK.
wojtek1988
W tabeli produkty nie wiąże kontrahenta z towarem. Gdybym przyjął towar który juz mam w tabeli to obecnie mogę zrobic to zwiększając ilość ale gdybym miał to zrobić poprzez dokument pz to mysle ze praca nie warta świeczki ?

Zaczynamy programowac?:0

A jak oddzielić nazwy i ilości w tabeli zamowienia_produkty jeśli mam tylko jedną kolumne id_produkt | zamowiona_ilosc | cena_za_sztuke




Pomijając pytanie powyżej przemyślałem podpowiedzi @Michaska i doszedłęmdo następujacych wniosków:

Będę miał 1 tabele przechowujaća i opisujaca tylko produkty o nazwie produkty,
Id_produkt | id_magazyn | nazwa | ilosć i dalej .....

tabelę pz zawierającą informacje o dokumencie pz czyli:
id_pz | magazyn przyjecia | kto przyjął | kto dostawcą | uwagi

trzecia tabela zamowienia_pz będzie zawierać opis towarów i powiąże je z dokumentem pz poprzez pz_id
id_pz | id_towar | ilość przyjęta | cena za sztukę|

Tworząc dokument użytkownik powinien wybrac ile pozycji towarów chce miec na dokumencie, po tej czynności powinien wypełnić formularz i zatwierdzić jednym przyciskiem , który wywoła zapytnia do bazy danych , a mianowicie :

1. Dodanie towarów do tabeli produkty ( to umiem zrobić)
2.Utworzyć wiersze o jednakowym id_pz i id_produktu, ilości oraz cenie -tego nie umiem
3. Utworzyć wiersz do tabeli pz opisujacy dany dokument - to umiem







Teraz jak wyświetlić dokumenty?
Obecnie wyświetlam je w tabeli , każdy wiersz to inny dokument i tutaj nie ma problemu bo dane wyciągam z tabeli pz,
ale gdy chciałbym zobaczyc szczegóły dokumentu to co teraz? Chciałbym aby przy każdym z wierszy był napis szczegoły ( option=szczegoły po id_pz)

  1. if ( $_GET['option']=="show") {
  2. mysql_query("select * FROM `pz` WHERE `id_pz` = $_GET[row]");
  3. return false;
  4.  
  5. }

ale jak połączyć wyświetlanie wszystkiego z tabeli pz z towarami , ilościami i cena za sztuke z tabeli zamowienia_pz questionmark.gif?
Michasko
1. Dodaj najpierw rekord do tabeli 'pz' i zapamiętaj sobie 'id_pz' z jakim je dodałeś.
2. Dodaj produkty do tabeli 'produkty' i zapamiętaj wszystkie ID i ilości, jakie je dodawałeś.
3. Dodaj rekordy do tabeli 'zamowienia_pz', każdy o innym ID produktu (te, które zapamiętałeś), ale wszystkie ze stałym ID_pz.

Czego konkretnie nie umiesz? Bo nie rozumiem. Przecież wyświetlanie masz dobre, tylko teraz zamiast tabeli 'pz' będziesz wyświetlał z tabeli 'zamowienia_pz'.

Przykład:
  1. //dodawanie pz
  2. $lastID = 0;
  3. $query = 'INSERT INTO pz VALUES ("tutaj", "twoje", "wartosci");';
  4. $res = mysql_query($query);
  5. if($res) // jesli dodawanie się powiodło
  6. $lastID = mysql_insert_id();
  7. else
  8. {
  9. //komunikat o błędzie;
  10. }
  11.  
  12. //dodawanie produktów
  13. $iloscDodanychProduktow = count($_POST['Produkt']); // zakladam, ze formularz zawiera pola o nazwach Produkt[] oraz pola o nazwach Ilosc[] (tablice wartosci)
  14. $iloscPoszczegolnychProduktow = $_POST['Ilosc'];
  15.  
  16. // tutaj zapytanie dodające produkty (kilka na raz - w ilości równej $ilosc); - to umiesz zrobić, więc zrobisz sam
  17. //jak skonczysz dodawanie do tabeli 'produkty', to kontynuujesz w ten sposób:
  18.  
  19. $dodaneProdukty = mysql_result(mysql_query('SELECT GROUP_CONCAT(produkt_id) FROM produkty ORDER BY produkt_id DESC LIMIT '.$iloscDodanychProduktow), 0);
  20. $cenyZaSztuke= mysql_result(mysql_query('SELECT GROUP_CONCAT(cena_za_sztuke) FROM produkty ORDER BY produkt_id DESC LIMIT '.$iloscDodanychProduktow), 0);
  21.  
  22. //teraz zmienne $dodaneProdukty i $cenyZaSztuke zawierac beda ciągi ID i cen dodanych produktów, oddzielonych przecinkami, np. "14, 6, 3"
  23. $dodaneProdukty = explode(",", $dodaneProdukty); // teraz masz tablice ID, ale są one odwrócone (malejąco, a w $iloscPoszczegolnychProduktow masz je rosnąco - wiec trzeba odwrócić)
  24. $cenyZaSztuke = explode(",", $cenyZaSztuke); // podobnie z cenami
  25.  
  26. $dodaneProdukty = array_reverse($dodaneProdukty);
  27. $cenyZaSztuke = array_reverse($cenyZaSztuke);
  28.  
  29. //dodanie rekordów do tabeli zamowienia_pz
  30. $zamQuery = 'INSERT INTO zamowienia_pz VALUES ';
  31.  
  32. for($j = 0; $j < count($dodaneProdukty); $j++)
  33. {
  34. $zamQuery .= '('.$lastID.', '.$dodaneProdukty[$j].', '.$iloscPoszczegolnychProduktow[$j].', "'.$cenyZaSztuke[$j].'")';
  35. if($j < count($dodaneProdukty) - 1)
  36. {
  37. $zamQuery .= ', ';
  38. }
  39. }
  40.  
  41. if(mysql_query($zamQuery))
  42. {
  43. //komunikat powodzenia;
  44. }
  45. else
  46. {
  47. //komunikat niepowodzenia
  48. }


Oczywiście wszystko pisane na szybko i z palca, więc mogą byc jakieś błędy, ale generalnie powinno być ok. Poza tym mogą wystąpić problemy, jeśli w tym samym czasie kilka osób doda jakieś zamówienia - mogą się pomieszać. Aby temu zapobiec musiałbyś użyć transakcji.

I miej na uwadze, że od nowych wersji PHP funkcje typu mysql_query już nie będą obsługiwane, więc radziłbym już teraz poczytać o bibliotece PDO.
wojtek1988
Już wdrażam twój kod
atrybut id_pz w kolumnie zamowienia_pz nie moze byc primary bo bedzie sie powtarzał , prawda?
Michasko
Prawda. Twoim kluczem głównym może być produkt_id, o ile w tabeli produkty za każdym razem będziesz generował nowy wiersz (a nie sumował ilość sztuk na magazynie). Może też być całkiem nowa kolumna. Nie jestem pewien, czy tabela może nie mieć klucza głównego (sprawdź to) - jeśli może nie mieć, to go po prostu nie rób.
wojtek1988
Dodaje mi jedynie "produkty" w reszcie zapytań do tabeli "pz" oraz "zamowienie_pz" wyświetla else " niepowodzenie"
@Michasko mógłbyś poprawić, spojrzeć smile.gif

  1. insertuje 1 rekord ale nie wszystkie elementy na raz
  2. <div id="wrapper" class="panel">
  3. ORYGINAŁ / KOPIA
  4. <section id="opcje" class="ramka2">
  5. <?php
  6.  
  7. require_once('include/database.php');
  8.  
  9.  
  10.  
  11.  
  12. include ("include/wyswietl_dane_firmy.php");
  13.  
  14. ?>
  15.  
  16.  
  17.  
  18. </section>
  19. <script>
  20. <!--
  21. function doit(){
  22. if (!window.print){
  23. alert("Musisz mieć NS4.x lub IE5,\naby użyć przycisku drukowania!")
  24. return
  25. }
  26. window.print()
  27. }
  28. //-->
  29. </script>
  30. <section id="opcje" class="ramka3">
  31. <div id="button">
  32. <a href="java script:doit()" ><img src="gfx/print.gif" border="0"></a>
  33. </div>
  34.  
  35. </section> <?php
  36.  
  37. $wynik = mysql_query('SELECT * FROM produkty')
  38. or die('Błąd zapytania');
  39.  
  40. echo "<form action='dodaj_towar_pz.php' method=post>";
  41.  
  42. function ShowForm($komunikat=""){ //funkcja wyświetlająca formularz dodania towaru
  43. echo "$komunikat<br>";
  44.  
  45. echo "<table boder=\"1\"><tr style=\"cursor: pointer\">";
  46. for($i = 1; $i <=4; $i++) {
  47. echo"<tr>";
  48. echo "<td>Nr produktu </td>";
  49. ECHO "<td>Nazwa </td>";
  50. ?>
  51. <td>Magazyn: </td>
  52. <td>Jednostka: </td>
  53. <td>Ilość </td>
  54.  
  55.  
  56. <td>Cena netto</td>
  57. <td>Wartość netto</td>
  58.  
  59.  
  60. <td>Stawka VAT</td>
  61. <td> Kwota VAT </td>
  62. <td> Wartość brutto </td>
  63. </tr><tr>
  64. <td><input type="text" size="3" name="id_produkt[]"></td>
  65. <td><input type="text" name="nazwa[]"></td>
  66. <td><select name="id_magazyn[]">
  67. <?
  68.  
  69. $res = mysql_query ("SELECT * FROM magazyny ");
  70. while($row = mysql_fetch_array($res))
  71. {
  72.  
  73. $id_magazyn= $row["id_magazyn"];
  74. $nazwa= $row["nazwa"];
  75. ?>
  76. <option value="<? echo "$id_magazyn"; ?>"><? echo " $nazwa ";
  77. ?></option>
  78. <?
  79. }
  80. ?>
  81. </select></td><input type="hidden" name="data" value="<?php echo date("Y-m-d");?>">
  82.  
  83. <td>
  84. <select name="jednostka[]">
  85. <?
  86.  
  87. $res = mysql_query ("SELECT * FROM jednostki ");
  88. while($row = mysql_fetch_array($res))
  89. {
  90.  
  91. $nazwa= $row["nazwa"];
  92.  
  93. ?>
  94. <option value="<? echo "$nazwa"; ?>"><? echo " $nazwa ";
  95. ?></option>
  96. <?
  97. }
  98. ?>
  99. </select></td>
  100.  
  101. <td><input type='text' size='5' id='sztuk[]' name='sztuk[]' value='' onkeyup='podlicz();'></td>
  102.  
  103. <td><input size="5" MAXLENGTH="12" id="k_cena_netto[]" name="k_cena_netto[]" type="text" value="" onkeyup="podlicz();"></td>
  104. <td><span id="wynikk[]"></span></td>
  105. <td><select id="podatek[]" name="k_stawka_vat[]" onchange="podlicz();">
  106. <option VALUE="23">23 %</option>
  107. <option VALUE="7">7 %</option>
  108. <option VALUE="33">33 %</option>
  109. </select></td>
  110. <td><span id="wynik[]" ></span></td>
  111.  
  112. <td>
  113. <span id="wynikkk[]" name="kwota_brutto[]"></span></td>
  114. <?php
  115.  
  116. echo "</tr>";
  117. }
  118. echo "<input type=hidden value='1' name=zapisz>";
  119. echo "<input type=submit value='Potwierdź'>";
  120.  
  121.  
  122.  
  123. echo "</table>";
  124. echo "</form>";
  125.  
  126. }
  127.  
  128. if(isset($_POST['zapisz']) && $_POST["zapisz"]==1){
  129. //dodawanie pz
  130. $lastID = 0;
  131. $query = 'INSERT INTO pz VALUES ("id_pz", "nr_dok", "id_magazyn" , "dostawca" , "przyjal" , "uwagi");';
  132. $res = mysql_query($query);
  133. if($res) // jesli dodawanie się powiodło
  134. $lastID = mysql_insert_id();
  135. else
  136. {
  137. echo"błąd";
  138. //komunikat o błędzie;
  139. }
  140.  
  141. //dodawanie produktów
  142. $iloscDodanychProduktow = count($_POST['nazwa']); // zakladam, ze formularz zawiera pola o nazwach Produkt[] oraz pola o nazwach Ilosc[] (tablice wartosci)
  143. $iloscPoszczegolnychProduktow = $_POST['sztuk'];
  144.  
  145. // tutaj zapytanie dodaj&plusmn;ce produkty (kilka na raz - w ilo&para;ci równej $ilosc); - to umiesz zrobić, więc zrobisz sam
  146.  
  147. $zapytanie = 'INSERT INTO produkty VALUES ';
  148. for($i = 0; $i < count($_POST['nazwa']); $i++){
  149. if(empty($_POST['nazwa'][$i])) {//oraz czy uzupełniono wszystkie dane
  150. echo "Pole \"nazwa\" nie może być puste!";
  151.  
  152. }
  153.  
  154.  
  155.  
  156. else{
  157. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  158. $zapytanie .= '("'.$_POST['id_produkt'][$i].'", "'.$_POST['data'][$i].'", "'.$_POST['id_magazyn'][$i].'", "'.$_POST['nazwa'][$i].'" , "'.$_POST['symbol'][$i].'" , "'.$_POST['producent'][$i].'" , "'.$_POST['typ'][$i].'" , "'.$_POST['jednostka'][$i].'" , "'.$_POST['k_cena_netto'][$i].'" , "'.$_POST['k_stawka_vat'][$i].'" , "'.$_POST['k_cena_brutto'][$i].'" , "'.$_POST['marza'][$i].'" , "'.$_POST['cena_netto'][$i].'" , "'.$_POST['stawka_vat'][$i].'" , "'.$_POST['cena_brutto'][$i].'" , "'.$_POST['sztuk'][$i].'" , "'.$_POST['rezerwacja'][$i].'" , "'.$_POST['skladowanie'][$i].'" , "'.$_POST['opis'][$i].'" , "'.$_POST['kody_kreskowe'][$i].'" , "'.$_POST['minimum'][$i].'" , "'.$_POST['waga'][$i].'", "'.$_POST['gwarancja'][$i].'", "'.$_POST['data_waznosci'][$i].'", "'.$_POST['seria'][$i].'", "'.$_POST['dangerous'][$i].'", "'.$_POST['uwagi'][$i].'" )';
  159. if($i != count($_POST['id_produkt']) - 1)
  160. {
  161. $zapytanie .= ', ';
  162. }
  163. }
  164. }
  165.  
  166. if ( mysql_query($zapytanie) ) {
  167. echo "Dodano produkt do tabeli ";
  168. echo "Produkt został poprawnie dodany!<br />Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.";
  169.  
  170.  
  171. //jak skonczysz dodawanie do tabeli 'produkty', to kontynuujesz w ten sposób:
  172.  
  173. $dodaneProdukty = mysql_result(mysql_query('SELECT GROUP_CONCAT(id_produkt) FROM produkty ORDER BY id_produkt DESC LIMIT '.$iloscDodanychProduktow), 0);
  174. $cenyZaSztuke= mysql_result(mysql_query('SELECT GROUP_CONCAT(cena_za_sztuke) FROM produkty ORDER BY id_produkt DESC LIMIT '.$iloscDodanychProduktow), 0);
  175.  
  176. //teraz zmienne $dodaneProdukty i $cenyZaSztuke zawierac beda ci&plusmn;gi ID i cen dodanych produktów, oddzielonych przecinkami, np. "14, 6, 3"
  177. $dodaneProdukty = explode(",", $dodaneProdukty); // teraz masz tablice ID, ale s&plusmn; one odwrócone (malej&plusmn;co, a w $iloscPoszczegolnychProduktow masz je rosn&plusmn;co - wiec trzeba odwrócić)
  178. $cenyZaSztuke = explode(",", $cenyZaSztuke); // podobnie z cenami
  179.  
  180. $dodaneProdukty = array_reverse($dodaneProdukty);
  181. $cenyZaSztuke = array_reverse($cenyZaSztuke);
  182.  
  183. //dodanie rekordów do tabeli zamowienia_pz
  184. $zamQuery = 'INSERT INTO zamowienia_pz VALUES ';
  185.  
  186. for($j = 0; $j < count($dodaneProdukty); $j++)
  187. {
  188. $zamQuery .= '('.$lastID.', '.$dodaneProdukty[$j].', '.$iloscPoszczegolnychProduktow[$j].', "'.$cenyZaSztuke[$j].'")';
  189. if($j < count($dodaneProdukty) - 1)
  190. {
  191. $zamQuery .= ', ';
  192. }
  193. }
  194.  
  195. if(mysql_query($zamQuery))
  196. {
  197. echo"powodzenie dodania zamowienia_pz";
  198. //komunikat powodzenia;
  199. }
  200. else
  201. {
  202. //komunikat niepowodzenia
  203. echo"nie dodano zamowienia_pz";
  204.  
  205. }
  206.  
  207.  
  208. }
  209. else
  210. {
  211. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  212.  
  213.  
  214.  
  215. }
  216. }
  217. echo ShowForm();
  218.  
  219. ?>
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226. </br>
  227. <br/>
  228.  
  229.  
  230. <table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
  231. <thead>
  232. <tr>
  233. <th style="text-align:center">Dostawca:</th> <th><select name="dostawca">
  234. <?
  235.  
  236. $res = mysql_query ("SELECT * FROM kontrahenci ");
  237. while($row = mysql_fetch_array($res))
  238. {
  239. $firma= $row["nazwa"];
  240. $imie= $row["imie"];
  241. $nazwisko= $row["nazwisko"];
  242. $id_kontrahent= $row["id_kontrahent"];
  243. $ulica= $row["ulica"];
  244. $numer_budynku= $row["numer_budynku"];
  245. $kod_pocztowy= $row["kod_pocztowy"];
  246. $miejscowosc= $row["miejscowosc"];
  247. $nip= $row["nip"];
  248.  
  249. ?>
  250. <option value="<? echo "$firma $imie $nazwisko"; ?>"><? echo " [ $firma ] - $imie $nazwisko ul. $ulica $numer_budynku , $kod_pocztowy $miejscowosc NIP $nip";
  251. ?></option>
  252. <?
  253. }
  254. ?>
  255. </select> </th><th></th><th></th></tr><tr><th style="text-align:center">Przyjął:<input size="15" MAXLENGTH="30" name="przyjal" type="text" value="imię nazwisko"><div id="button"></th>
  256. <th><a href="dodanie_kontrahenta.php"><b>Dodaj kontrahenta </b></a></div></th> <th></th><th></th></tr>
  257. <tr><th style="text-align:center">Data:<input type="" name="data" value="<?php echo date("Y-m-d");?>"></th>
  258. <th style="text-align:center" >Godzina: <?php echo date("H:i:s");?> </th><th></th><th></th></tr>
  259. <tr><th style="text-align:center">Numer dokumentu:</th> <th><input type="text" size="10" name="nr_dok" value="<?php echo date("Y-m"); echo "/";?>"></th><th></th><th></th></tr>
  260.  
  261. <tr><th style="text-align:center">Uwagi: </th><th></th><th></th><th></th></tr><tr><th><textarea cols="20" rows="4" class="form" name="uwagi" ></textarea></th><th></th><th></th><th></th></tr>
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. <tr><th style="text-align:center">Elementy:</th> </tr>
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281. </thead>
  282.  
  283. <tfoot>
  284.  
  285.  
  286. </tfoot>
  287.  
  288. </table>
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298. <br><br><br>
  299. <div><span class="prawa">Podpis osoby upoważnionej<br>do odebrania dokumentu pz </span><span class="lewa">Podpis osoby upoważnionej<br>do wystawienia dokumentu pz</span></div>
  300.  
  301.  
  302.  
  303. </div>
  304.  
  305.  
  306.  
Michasko
Jakie masz typy kolumn? w ID pewnie masz typ INT, a starasz sie wstawić "pz_id"...
Poza tym dodaj tam "mysql_error()" po kazdym zapytaniu i sie dowiemy o co chodzi.
wojtek1988
Kominikaty mam takie:



NIe dodano dokumentu pz!
Column count doesn't match value count at row 1Dodano produkt do tabeli Produkt został poprawnie dodany!
Za chwilę nastąpi przekierowanie kontaktów. Proszę czekać.
Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/porzadko/domains/porzadkowa.sry.pl/public_html/include/tresc_dodaj_pz.php on line 193
Nie dodano zamowienia pz!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ""), (0, 143, , ""), (0, 29, , ""), (0, 18, , ""), (0, 211, , ""), (0, 207, , "' at line 1
Michasko
Chłopie, przeczytaj te komunikaty. Wpiszesz w google ich początek i masz rozwiązanie. Myśl troche...
W zamowienie_pz dodawane są 4 wartości, a tabela ma więcej (lub mniej) kolumn. Nie myślisz chyba, że ja Ci to zrobie w całości?
wojtek1988
Tabela zamówienia_pz ma 4 kolumny.są to:
id_pz | id_produkt | zamowiona_ilosc | cena_za_sztuke
Dlaczego wywala ten błąd ?
Michasko
Oh, wybacz, przy dokumencie pz masz złą ilość kolumn.
A przy zamowieniu_pz masz złą składnię (cudzysłów, przecinek, cokolwiek).
wojtek1988
Teraz mam :
Cannot add or update a child row: a foreign key constraint fails (`porzadko_news`.`pz`, CONSTRAINT `pz_ibfk_2` FOREIGN KEY (`id_magazyn`) REFERENCES `magazyny` (`id_magazyn`) ON DELETE NO ACTION)Dodano produkt do tabeli Produkt został poprawnie dodany!
Michasko
Teraz masz tutaj jakieś tabele, których ja na oczy nie widziałem. Ma problem z kluczem obcym.
wojtek1988
Znowu @Michasko mi pomógł, poprawiłem drobne literówki i jest blisko końca smile.gif
Działa dodanie kilku produktów do tabeli produkty,
działa dodanie doekumentu do pz
Jedyna rzecz, która jest nie tak to dodanie wierszy w postaci id_pz, id_produkt, sztuk, cena_za_sztuke . Dzieję się tak , ze id_pz jest dobrze pobierany ale w kolumnie id_produkt pobierane mam wszystkie id_produtków z tabeli produkty questionmark.gif? Do niech przypisany jest jeden id_pz i tak ma być, cena oraz ilość z formularza rónież nie działa. hmm...

Kod:
  1.  
  2.  
  3. <div id="wrapper" class="panel">
  4. ORYGINAŁ / KOPIA
  5. <section id="opcje" class="ramka2">
  6. <?php
  7.  
  8. require_once('include/database.php');
  9.  
  10.  
  11.  
  12.  
  13. include ("include/wyswietl_dane_firmy.php");
  14.  
  15. ?>
  16.  
  17.  
  18.  
  19. </section>
  20.  
  21. <script>
  22.  
  23. function podlicz(){
  24. sztuk = document.getElementById("sztuk").value; //pobiera warto&para;ci z input-a o id="kwota"
  25. k_cena_netto = document.getElementById("k_cena_netto").value;
  26. podatek = document.getElementById("podatek").value;
  27.  
  28. wynikk = sztuk*k_cena_netto; //ooblicza wynik
  29. document.getElementById('wynikk').innerHTML=wynikk; //pobiera warto&para;ć z select-a o id="podatek"
  30.  
  31. wynik = sztuk*k_cena_netto*(podatek/100); //ooblicza wynik
  32. document.getElementById('wynik').innerHTML=wynik; //zapisuje wynik w span-ie o id="wynik"
  33.  
  34. wynikkk = sztuk*k_cena_netto*(1+podatek/100); //ooblicza wynik
  35. document.getElementById('wynikkk').innerHTML=wynikkk;
  36. }
  37. </script>
  38. <script>
  39. <!--
  40. function doit(){
  41. if (!window.print){
  42. alert("Musisz mieć NS4.x lub IE5,\naby użyć przycisku drukowania!")
  43. return
  44. }
  45. window.print()
  46. }
  47. //-->
  48. </script>
  49. <section id="opcje" class="ramka3">
  50. <div id="button">
  51. <a href="java script:doit()" ><img src="gfx/print.gif" border="0"></a>
  52. </div>
  53.  
  54. </section> <?php
  55.  
  56. $wynik = mysql_query('SELECT * FROM produkty')
  57. or die('Błąd zapytania');
  58.  
  59.  
  60. if(isset($_POST['zapisz']) && $_POST["zapisz"]==1){
  61. //dodawanie pz
  62. $lastID = 0;
  63.  
  64. $res = mysql_query("insert into `pz` values('".htmlspecialchars($_POST["id_pz"])."', '".htmlspecialchars($_POST["data"])."','".htmlspecialchars($_POST["nr_dok"])."','".htmlspecialchars($_POST["dostawca"])."','".htmlspecialchars($_POST["przyjal"])."' , '".htmlspecialchars($_POST["uwagi"])."' )"); // zapisywanie rekordu do bazy
  65.  
  66. if($res){ // jesli dodawanie się powiodło
  67. $lastID = mysql_insert_id();
  68. echo"dodano pz";
  69. }
  70. else
  71. {
  72. echo "NIe dodano dokumentu pz!<br/>".mysql_error();
  73. //komunikat o błędzie;
  74. }
  75.  
  76. //dodawanie produktów - nazwa czy id_produkt?questionmark.gifquestionmark.gif
  77. $iloscDodanychProduktow = count($_POST['nazwa']); // zakladam, ze formularz zawiera pola o nazwach Produkt[] oraz pola o nazwach Ilosc[] (tablice wartosci)
  78. $iloscPoszczegolnychProduktow = $_POST['sztuk'];
  79.  
  80. // tutaj zapytanie dodaj&plusmn;ce produkty (kilka na raz - w ilo&para;ci równej $ilosc); - to umiesz zrobić, więc zrobisz sam
  81.  
  82. $zapytanie = 'INSERT INTO produkty VALUES ';
  83. for($i = 0; $i < count($_POST['nazwa']); $i++){
  84. if(empty($_POST['nazwa'][$i])) {//oraz czy uzupełniono wszystkie dane
  85. echo "Pole \"nazwa\" nie może być puste!";
  86.  
  87. }
  88.  
  89.  
  90.  
  91. else{
  92. // je&para;li pola s&plusmn; poprawne, to dodajesz je do zapytania:
  93. $zapytanie .= '("'.$_POST['id_produkt'][$i].'", "'.$_POST['data'][$i].'", "'.$_POST['id_magazyn'][$i].'", "'.$_POST['nazwa'][$i].'" , "'.$_POST['symbol'][$i].'" , "'.$_POST['producent'][$i].'" , "'.$_POST['typ'][$i].'" , "'.$_POST['jednostka'][$i].'" , "'.$_POST['k_cena_netto'][$i].'" , "'.$_POST['k_stawka_vat'][$i].'" , "'.$_POST['k_cena_brutto'][$i].'" , "'.$_POST['marza'][$i].'" , "'.$_POST['cena_netto'][$i].'" , "'.$_POST['stawka_vat'][$i].'" , "'.$_POST['cena_brutto'][$i].'" , "'.$_POST['sztuk'][$i].'" , "'.$_POST['rezerwacja'][$i].'" , "'.$_POST['skladowanie'][$i].'" , "'.$_POST['opis'][$i].'" , "'.$_POST['kody_kreskowe'][$i].'" , "'.$_POST['minimum'][$i].'" , "'.$_POST['waga'][$i].'", "'.$_POST['gwarancja'][$i].'", "'.$_POST['data_waznosci'][$i].'", "'.$_POST['seria'][$i].'", "'.$_POST['dangerous'][$i].'", "'.$_POST['uwagi'][$i].'" )';
  94. if($i != count($_POST['id_produkt']) - 1)
  95. {
  96. $zapytanie .= ', ';
  97. }
  98. }
  99. }
  100.  
  101. if ( mysql_query($zapytanie) ) {
  102. echo "Dodano produkt do tabeli ";
  103. echo "Produkt został poprawnie dodany!<br />";
  104.  
  105.  
  106. //jak skonczysz dodawanie do tabeli 'produkty', to kontynuujesz w ten sposób:
  107.  
  108. $dodaneProdukty = mysql_result(mysql_query('SELECT GROUP_CONCAT(id_produkt) FROM produkty ORDER BY id_produkt DESC LIMIT '.$iloscDodanychProduktow), 0);
  109. $cenyZaSztuke= mysql_result(mysql_query('SELECT GROUP_CONCAT(k_cena_netto) FROM produkty ORDER BY id_produkt DESC LIMIT '.$iloscDodanychProduktow), 0);
  110. //(k_cena_netto odpowiada kolumnie cenie netto z tabeli produkty i tak ma byc?questionmark.gifquestionmark.gifquestionmark.gif?
  111.  
  112.  
  113.  
  114. //teraz zmienne $dodaneProdukty i $cenyZaSztuke zawierac beda ci&plusmn;gi ID i cen dodanych produktów, oddzielonych przecinkami, np. "14, 6, 3"
  115. $dodaneProdukty = explode(",", $dodaneProdukty); // teraz masz tablice ID, ale s&plusmn; one odwrócone (malej&plusmn;co, a w $iloscPoszczegolnychProduktow masz je rosn&plusmn;co - wiec trzeba odwrócić)
  116. $cenyZaSztuke = explode(",", $cenyZaSztuke); // podobnie z cenami
  117.  
  118. $dodaneProdukty = array_reverse($dodaneProdukty);
  119. $cenyZaSztuke = array_reverse($cenyZaSztuke);
  120.  
  121. //dodanie rekordów do tabeli zamowienia_pz
  122. $zamQuery = 'INSERT INTO zamowienia_pz VALUES ';
  123.  
  124. for($j = 0; $j < count($dodaneProdukty); $j++)
  125. {
  126. $zamQuery .= '("'.$lastID.'", "'.$dodaneProdukty[$j].'", "'.$iloscPoszczegolnychProduktow[$j].'", "'.$cenyZaSztuke[$j].'")';
  127. if($j < count($dodaneProdukty) - 1)
  128. {
  129. $zamQuery .= ', ';
  130. }
  131. }
  132.  
  133. if(mysql_query($zamQuery))
  134. {
  135. echo"powodzenie dodania zamowienia_pz";
  136. //komunikat powodzenia;
  137. }
  138. else
  139. {
  140. //komunikat niepowodzenia
  141. echo "Nie dodano zamowienia pz!<br/>".mysql_error();
  142.  
  143. }
  144.  
  145.  
  146. }
  147. else
  148. {
  149. echo "Dodawanie wyników nie powiodło się!<br/>".mysql_error();
  150.  
  151.  
  152.  
  153. }
  154. }
  155. echo ShowForm();
  156.  
  157. ?>
Michasko
Aby działało poprawnie, id_produkt muszą być większe niż te, które były poprzednio - najlepiej gdybyś miał na tej kolumnie auto_increment zamiast podawać ręcznie. Wtedy zapytanie powinno działać poprawnie.
wojtek1988
Zrobie autoinkrment w tabeli zamowienia_pz na kolumne id_produkt. Już sprawdzam
Michasko
W tabeli produkty ma być ten auto_increment...żebyś dodając produkty nie musiał dbać o to sam.
W ogóle jeśli tylko klucz główny jest typem całkowitym (INTEGER), to powinien mieć auto_increment.
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.