Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pomoc z tworzeniem pierwszej bazy danych
ar4
post 12.01.2012, 00:15:10
Post #1





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 10.11.2010
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Witam serdecznie,
jestem studentem informatyki i jako temat zaliczenia (dopuszczenie do egzaminów) muszę wykonać bazę danych. Zadanie jakie muszę wykonać to:
muszę napisać program do obsługi danych magazynowych. Baza danych musi składać się z trzech tabel: tab1, tab2, tab3. Pola formularza nazwa i jednostka mają być polami wyboru typu select. Program powinien posiadać menu oraz uniwersalny formularz. Muszę sprawdzać poprawność wprowadzanych i edytowanych danych.
Nie chcę aby ktoś napisał mi gotowca (chociaż to nie jest zły pomysł wink.gif ), ale chciałbym aby ktoś pomógłby mi załapać o co w tym chodzi i wspólnymi siłami coś napisać... Czy znajdą się tutaj osoby, które pomogą w rozwiązaniu problemu?

Ja na samym początku wyskrobałem coś takiego:

  1. DROP TABLE stany_mag;
  2. DROP TABLE nazwy_towarow;
  3. DROP TABLE jednostki;
  4. CREATE TABLE jednostki
  5. (
  6. nr serial NOT NULL,
  7. jednostka varchar(30) NOT NULL
  8. );
  9. CREATE TABLE nazwy_towarow
  10. (
  11. nr serial NOT NULL,
  12. nazwa varchar(30) NOT NULL
  13. );
  14. CREATE TABLE stany_mag
  15. (
  16. nr serial NOT NULL,
  17. nazwa varchar(30) NOT NULL,
  18. ilosc varchar(50) NOT NULL,
  19. jednostka varchar(30) NOT NULL,
  20. cena varchar(30) NOT NULL
  21. );
  22. INSERT INTO jednostki (jednostka)VALUES('KG'),('M'),('SZTUK'),('LITROW');
  23. INSERT INTO nazwy_towarow (nazwa)VALUES('produkt1'),('produkt2'),('produkt3'),('produkt4');
  24. INSERT INTO stany_mag (nazwa,ilosc,jednosta,cena)VALUES
  25. ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt1'),1,(SELECT nr FROM jednostki WHERE jednostka='KG'),100),
  26. ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt2'),2,(SELECT nr FROM jednostki WHERE jednostka='M'),200),
  27. ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt3'),3,(SELECT nr FROM jednostki WHERE jednostka='SZTUK'),300),
  28. ((SELECT nr FROM nazwy_towarow WHERE nazwa='produkt4'),4,(SELECT nr FROM jednostki WHERE jednostka='LITROW'),400);


Po wysłaniu zapytania mam:

BŁĄD: tabela "stany_mag" nie istnieje

********** Błąd **********

BŁĄD: tabela "stany_mag" nie istnieje
Stan SQL: 42P01

Proszę o pomoc jeżeli to możliwe... proszę pamiętać, że dla niektóry to co jest banalnie proste dla innych całkowicie zielone... smile.gif
Go to the top of the page
+Quote Post
Niktoś
post 12.01.2012, 01:10:18
Post #2





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


W postreSql nie robiłem,nie wiem czy trzeba określac silnik przy tworzeniu tabel czy jakieś collation, ale polecenie insert chyba nie odbiega tak znaczącą od innych baz.
  1. INSERT INTO jednostki (jednostka)VALUES('KG'),('M'),('SZTUK'),('LITROW');

Jedna kolumna "jednostka" do której jednocześnie chcesz wrzucić cztery wartości.Może baza ma sobie wybrać którąś z nich?
Spójrz jak to poprawnie powinno wyglądać:
http://www.w3schools.com/sql/sql_insert.asp

stany_mag tworzysz kolumnę:
Cytat
nr serial NOT NULL,

i zostawiasz ją sobie na pastwę losu ,a przecież NOT NULL ,mówi Ci ,że nie może być pusta.
Nazwy tabel,kolumn nie powinny być dwuczłonowe:rób nr_serial.

I to by było na tyle,może ktoś jeszcze inny coś zauważy.Na razie to miernie wygląda u Ciebie.

Ten post edytował Niktoś 12.01.2012, 01:14:56
Go to the top of the page
+Quote Post
nospor
post 12.01.2012, 07:52:38
Post #3





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




DROP TABLE stany_mag;
DROP TABLE nazwy_towarow;
DROP TABLE jednostki;

Kasujesz tabele, które dopiero później zamierzasz utworzyć - czyli kasujesz coś, co jeszcze nie istnieje. To dostajesz jak wół komunikat:
"Tabela xyz nie istnieje"
logiczne.

Powód edycji: [nospor]:


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Sephirus
post 12.01.2012, 08:53:56
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Użyj:

  1. DROP TABLE IF EXISTS nazwa_tabelki;
  2.  
  3. -- a przy tworzeniu:
  4.  
  5. CREATE TABLE IF NOT EXISTS nazwa_tabelki (...)


Nie wiem jak na postgree ale na MySQL działa.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
ar4
post 12.01.2012, 12:44:50
Post #5





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 10.11.2010
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


@Niktoś
Czyli jak mogę to rozwiązać? Nie zabardzo wiem jak to rozwiązać, aby było dobrze... Czytałem to co podałeś, ale nic z tego mi nie przychodzi do rozumu...
Nawiązując do treści zadania jakie mam wykonać, to z tej tabeli chcę, aby rekord był wybierany z listy w formularzu, który zrobię za jakichś czas (jak zrobię bazę)

@Sephirus
Chyba działa...

Jak połączyłem nr serial tym znakiem _ to wywala mi komunikat:
BŁĄD: błąd składni w lub blisko "nr_serial"
LINE 1: nr_serial NOT NULL,

Ogólnie mam pytanie, czy w dobrym kierunku myślę, aby baza spełaniała wymagania zadania?
Go to the top of the page
+Quote Post
nospor
post 12.01.2012, 12:50:14
Post #6





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Nie słuchaj się niktosia, bo on nie wie że "serial" to taki typ pola który jest autoincrementowany.
wiec nr_serial jest źle
a: nr serial jest dobrze

Swoją drogą ty jako student informatyki powininieneś takie rzeczy wiedziec, wiedziec co piszesz i czemu


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Niktoś
post 12.01.2012, 13:09:34
Post #7





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Nie słuchaj się niktosia, bo on nie wie że "serial" to taki typ pola który jest autoincrementowany.
wiec nr_serial jest źle
a: nr serial jest dobrze

Faktycznie serial jest typem,właśnie doczytałem -powiem ,że pierwszy raz spotkałem się z tym typem-myślałem ,że to nazwa kolumny.Nie używam postreSQl,jednak uważam ,że inserty i selecty- są żle zbudowane,ale niech doradzają mądrzejsi.

Ten post edytował Niktoś 12.01.2012, 13:13:06
Go to the top of the page
+Quote Post
nospor
post 12.01.2012, 13:23:36
Post #8





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




A co ci się nie podoba w insertach i w których?
Bo już ustaliliśmy, że nr nie musi podawać bo to autoincrement. Jeszcze coś?

Cytat
Jedna kolumna "jednostka" do której jednocześnie chcesz wrzucić cztery wartości.Może baza ma sobie wybrać którąś z nich?
rety.... w insert można na raz wkłądać wiecej niż jeden rekord...

Błąd jaki się rzuca w oczy to ostatni insert z selectami. W selectach zawsze pobierasz nr, a przecież tam wkładasz to jako nazwa i jednostka
edit:
a nie, tam to jest niby jako klucz obcy.... no to nie varchar a int, bo przecież nr to int
cena zresztą to też nie varchar a liczba... czego teraz na tych studiach uczą :/
Powód edycji: [nospor]:


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Niktoś
post 12.01.2012, 13:40:15
Post #9





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES |
VALUES ( value [, ...] ) |
query }
One can insert a single row specified by value expressions, or several rows as a result of a query.
Może ja źle rozumie manuale, podam przykłądy:
Insert pojedynczego wiersza:
  1. INSERT INTO employees VALUES (106, 'Hall', 'Timothy');

Insert wielu wierszy jednocześnie:
  1. INSERT INTO employees SELECT * FROM persons;

SELECT * FROM persons=query

Ten post edytował Niktoś 12.01.2012, 13:42:17
Go to the top of the page
+Quote Post
nospor
post 12.01.2012, 13:43:34
Post #10





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Chyba wyciąłeś coś z tego cytatu. Ja znalazłem taką wersję
" One can insert one or more rows specified by value expressions, or zero or more rows resulting from a query."
tongue.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ar4
post 12.01.2012, 13:45:05
Post #11





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 10.11.2010
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Mało uczęszczałem na wykłady i z tego powodu mogę mieć braki... Puki co mam takie coś:
  1. DROP TABLE IF EXISTS stany_mag;
  2. DROP TABLE IF EXISTS nazwy_towarow;
  3. DROP TABLE IF EXISTS jednostki;
  4. CREATE TABLE IF NOT EXISTS jednostki
  5. (
  6. nr serial NOT NULL,
  7. jednostka varchar(30) NOT NULL
  8. );
  9. CREATE TABLE IF NOT EXISTS nazwy_towarow
  10. (
  11. nr serial NOT NULL,
  12. nazwa varchar(30) NOT NULL
  13. );
  14. CREATE TABLE IF NOT EXISTS stany_mag
  15. (
  16. nr serial NOT NULL,
  17. nazwa varchar(30) NOT NULL,
  18. ilosc integer NOT NULL,
  19. jednostka varchar(30) NOT NULL,
  20. cena integer NOT NULL
  21. );
  22. INSERT INTO jednostki (jednostka)VALUES('KG'),('M'),('SZTUK'),('LITROW');
  23. INSERT INTO nazwy_towarow (nazwa)VALUES('produkt1'),('produkt2'),('produkt3'),('produkt4');
  24. INSERT INTO stany_mag (nazwa,ilosc,jednostka,cena)VALUES
  25. ((SELECT nazwa FROM nazwy_towarow WHERE nr='1'),1,(SELECT jednostka FROM jednostki WHERE nr='1'),100),
  26. ((SELECT nazwa FROM nazwy_towarow WHERE nr='2'),2,(SELECT jednostka FROM jednostki WHERE nr='2'),200),
  27. ((SELECT nazwa FROM nazwy_towarow WHERE nr='3'),3,(SELECT jednostka FROM jednostki WHERE nr='3'),300),
  28. ((SELECT nazwa FROM nazwy_towarow WHERE nr='4'),4,(SELECT jednostka FROM jednostki WHERE nr='4'),400);


Jak wchodzę na local i wykonuje zapytanie do bazy to tworzą się tabele i wypełnionymi krotkami...
Czy coś jeszcze brakuje mi w tej bazie, aby przejść do pisania uniwersalnego formularza z poziomu którego będę mógł wykorzystać te funckje?
  1. <?php
  2. // biblioteka libDB.inc zawierająca funkcje służące do pracy z bazą danych.
  3. function connectDB()
  4. {// Funkcja służy do nawiązywania połączenia z bazą danych
  5. }
  6. function selectQuery($query)
  7. {// Funkcja służy do wykonywania kwerend typu select. Funkcja zwraca 1 rekord wskazywany przez pointer
  8. }
  9. function modifyQuery($query)
  10. {// Funkcja służy do wykonywania kwerend typu INSERT INTO, UPDATE SET i DELETE FROM
  11. }
  12. function displayData($table1,$table2,$label=array(),$indexASC,&$data=array())
  13. {// Funkcja służy do pobrania danych które będą pojawiały się na formularzach
  14. }
  15. function insertData($data=array(),$label=array(),$table,$select)
  16. {// Funkcja służy do zapisania wprowadzonych przez formularz insert danych
  17. }
  18. function setData($table1,$table2,$label=array(),$data=array(),$select)
  19. {// Funkcja służy do zapisania zmienionych przez formularz insert danych
  20. }
  21. function deleteData($table,$label)
  22. {// Funkcja służy do kasowania bieżącego rekordu z formularza delete
  23. }
  24. function selectDictionery($table)
  25. {// Funkcja służy do pobierania nazw z tabeli słownikowej
  26. }
  27. ?>

Go to the top of the page
+Quote Post
Niktoś
post 12.01.2012, 13:48:31
Post #12





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Nie ,patrz-przecież nie robiłbym tak perfidnych manipulacji:
http://www.postgresql.org/docs/8.1/static/sql-insert.html
Patrz pierwsza linijka po Description.
Chyba jakieś inne manuale czytamy wink.gif

Zresztą, jak Mu pójdzie tzn ,że masz racje-Jesteś bardziej doświadczony niż ja.
Mam nadzieje ,że autor da odpowiedź -to się czegoś też nauczę.

Ten post edytował Niktoś 12.01.2012, 13:51:04
Go to the top of the page
+Quote Post
nospor
post 12.01.2012, 13:51:17
Post #13





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




http://www.postgresql.org/docs/8.2/static/sql-insert.html
wink.gif

poza tym w mysql od lat tak można pisać, a mysql ponoć znasz.
Powód edycji: [nospor]:


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ar4
post 12.01.2012, 13:55:08
Post #14





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 10.11.2010
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Cytat(Niktoś @ 12.01.2012, 13:48:31 ) *
Nie ,patrz-przecież nie robiłbym tak perfidnych manipulacji:
http://www.postgresql.org/docs/8.1/static/sql-insert.html
Patrz pierwsza linijka po Description.
Chyba jakieś inne manuale czytamy wink.gif

Zresztą, jak Mu pójdzie tzn ,że masz racje-Jesteś bardziej doświadczony niż ja.
Mam nadzieje ,że autor da odpowiedź -to się czegoś też nauczę.

Ciesze się, że pomagacie mi... ale jak ta odpowiedź miała mi w czymś pomóc, to na prawdę nie mam zielonego pojęcia o co chodzi w tej podpowiedzi... Nie wiem, po prostu nie mam pojęcia...
Go to the top of the page
+Quote Post
Niktoś
post 12.01.2012, 13:59:09
Post #15





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Nie, piszę w MSSQL ,choć zapytania znacznie się nie różnią, te podstawowe przynajmniej.
Ja nie miałem okazji wpychać wiele wartości do jednej kolumny przy jednokrotnym zapytaniu.
Kiedyś spróbuje -sam jestem ciekaw czy się uda.

No faktycznie przeszkadzamy ar4 w zrozumieniu,zostawiam te poletko Tobie Nospor , bo się lepiej znasz na tej Bazie Danych.
Tłumacz,już nie przeszkadzam.

Ten post edytował Niktoś 12.01.2012, 13:56:10
Go to the top of the page
+Quote Post
ar4
post 12.01.2012, 23:28:37
Post #16





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 10.11.2010
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


@Niktoś
myślę, że nie przeszkadzasz, tym bardziej jak nie mam odpowiedzi od nikogo, to w takim przypadku każda wypowiedź jest dobra...
Ps. prosze o pomoc...
Go to the top of the page
+Quote Post
viking
post 14.01.2012, 11:26:16
Post #17





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Co ja tu widzę bez sensu to że z tabeli nazwy_towarow wybierasz nazwa i wstawiasz to do stany_mag. Powiąż to kluczem po numerze bo inaczej nazwy_towarow nie ma racji bytu. To samo z jednostkami. Poczytaj też jakiś poradnik o kluczach obcych i normalizacji BD.


--------------------
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: 24.04.2024 - 19:37