Odwołanie sie do innej tabeli w bazie danych i pobranie tylko wymaganych danych


(arlid) #1

Witajcie. Mam pytanie. Nie wiem tylko czy jest to możliwe do wykonania i ewentualnie czy dobrze to rozmyśliłem. Chciałbym utworzyć tabelę (załóżmy o nazwie Sprzęt), gdzie kolumny to: ID, Imię, Nazwisko, Producent, Numer seryjny. ID podbijane automatycznie od 1.. w gore, przedstawia liczbę urządzeń.Teraz dla każdego sprzętu chciałbym móc prowadzić coś w stylu historii. Identyfikacja sprzętu byłaby prowadzona po numerze seryjnym (bądź ID) z bazy Sprzęt.

 

Teraz jak zrobić coś takiego:

Wymyśliłem, że wspomniana historia będzie w odrębnej tabeli bazy danych o nazwie "Historia". Załóżmy, ze będą tam pola daty, jakieś pola tekstowe - to raczej mniej istotne. Tutaj za pomocą formularza chciałbym wprowadzać historię wszystkich urządzeń. I teraz mam lekki problem. Czy da się zrobić coś takiego, żeby na liście wszystkich urządzeń (lista w jednym pliku z bazy Sprzęt) po kliknięciu na dane urządzenie wyświetliła się odrębna lista z jego historią? Innymi słowy czy da się wyodrębnić z bazy Historia tylko informacje powiązane  zdanym sprzętem z bazy "Sprzęt"? Bo przecież tam będą historie wszystkich urządzeń.Da się jakoś powiązać te bazy danych?

 

Domyślam się, że można to zrobić np. po ID urządzenia lub jego numerze seryjnym i wtedy wyszukać w bazie "Historia" tylko te rekordy (wiersze), które zawierają te ID, bądź ten numer seryjny (w formie dodatkowego pola w tej bazie). Dobrze myślę? Jest to wykonalne?

 

Dzięki za wszelkie wskazówki.  :slight_smile:


(kostek135) #2

Tak. To będzie zwyczajna relacja jeden wiele (klucz obcy trzymany po stronie tabeli Historia).


(jacko1998) #3

Czyli, że każda “Historia”, będzie posiadała klucz sprzętu ? Tak się pytam, bo też czytam o tych relacjach i można się pogubić.

PS.: Było by źle gdyby dla każdego sprzętu dodał klucz historii ? Bo w książce jest napisane, że można tworzyć relacje jeden do wielu lub wiele do jednego.


(kostek135) #4

W momencie, gdy umieścisz klucz obcy w sprzęcie, to będziesz mógł przypisać do danego sprzętu jedną historię. Dodatkowo sprzęty będą mogły ją współdzielić, co jest totalną bzdurą, bo nawet jak obaj złamiemy nogę, to że efekt jest taki sam, nie znaczy, że z logicznego punktu widzenia to jest to samo wydarzenie. Klucz obcy zawsze umieszczasz po stronie, którą logicznie uznasz za “jeden”.


(jacko1998) #5

Dzięki wielkie ! Tak prosto i od razu pojąłem :slight_smile:


(arlid) #6

Dzięki za odpowiedź.

 

 

Dokładnie o to chodzi. Tylko jak tego dokonać. Możesz podać jakiś mały przykład?. Ponadto może będziesz w stanie podać wskazówki do tych problemów:

 

  1. Mam ustawione wyszukiwanie po nazwisku. Jak zbudować if (jaki warunek), żeby w przypadku, gdy nie ma takiego nazwiska uzyskać tekst, że nie ma żadnych wyników?  Próbowałem tak:

    if (isset($slowo_wyszukiwane))
    {
    // Wyniki
    }
    else
    {
    // przypadek, gdy nie ma wyniku
    }

O ile w przypadku wyników jest ok, o tyle w przypadku opcji else nie mam jego wartości, lecz pustą stronę wyników.

 

  1. Jak uzyskać coś takiego. Mam w tabeli (wiersz = rekord z bazy) całą tabelę Sprzęt. Jak zrobić jakiś dodatkowy link, który pozwoli mi odwołać się do danego ID - tak jakby chciał dodać historię - klikam na ID czy sam wiersz i już mogę z “automatu” dodać konkretną historię do danego urządzenia.

 

  1. Jak zrobić edycję, ale w taki sposób, by np. po kliknięciu edytuj załadować posiadane informacje od razu do wskazanych pół w formularzu. Domyślam się, ze odwrotnie do zapisu do bazy danych z formularza, ale jakoś nie mogę tego ogarnąć.

 

Jakby ktoś mógł udzielić wskazówek to będę wdzięczny.

 

Pozdrawiam


(jacko1998) #7

Prosty przykład tabeli historii: 

 

id;

text;

sprzetId;

 

to id to klucz danej historii(to te id, które jest auto incrementowane). Text  opis danej historii. sprzetId klucz Twojego sprzętu.

 

2 i 3 nie rozumiem o co Ci chodzi 


(kostek135) #8

Po pierwsze, zmienić warunek. isset określa czy zmienna istnieje, a nie czy zwróciła brak wyników. Google: “php sql no results found”.

Po drugie, wstawić pod drugim komentarzem (w else)

echo "Nie ma żadnych wyników.";

Z tego co ja zrozumiałem, do tego wystarczy zwykłe przekazanie parametru przez get

addingHistoryToDevice.php?addTo=id

Poczytaj o takiej tablicy $_GET i o przekazywaniu informacji metodą POST i GET. Ta rada odnosi się zarówno do 2 jak i 3 punktu.


(arlid) #9

Dobra ok. Poczytałem trochę. Udało mi się zrobić to odczytywanie historii i parę innych rzeczy, tylko wszystko jest ok, jak dodaje to z “palca”, niestety. Ale jakieś podwaliny już są. Łacznie “relajci” mam takie::

SELECT * FROM historia LEFT JOIN devices ON (`devices`.`device_id` = `historia`.`device`) WHERE `device` = '6'";

Tylko właśnie jest to zrobione z palca. Ale o tym potem.

 

 

  1. Jak dodać podczas zapisywania historii datę i godzinę wysłania formularza do bazy danych i potem ją odczytac w tabeli? Zrobiłem tak:

    $zapytanie = “INSERT INTO historia VALUES (‘1’, '”.time()."’, 'uszkodzenie elementu ', ‘naprawa (lutowanie)’)";

I przy wyśietlaniu datyi czasu mam tak:

$wiersz = mysql_fetch_row($idzapytania)) {
'.date("d.m.Y, H:i", $wiersz[0]).'

Niestety mam datę 01-01-1970 00:00:00 - co robię źle? Złe pola, sposób?

 

  1. Wracając do linków. Mam taki kod:

    $wiersz = mysql_fetch_row($idzapytania)
    Edycja

gdzie wiersz[0] to po prostu ID. Cały link jest umieszczony w oddzielnej kolumnie (nie ma tego w bazie, to tylko link) i ma odnośnik edycji. Mam tez plik edytuj_sprzet.php, który ma taki fragment:

$sql=mysql_query("select * from devices where device_id='2'");
$wiersz= mysql_fetch_array($sql);
echo '<input type="text" name=" device_name" value="'.$wiersz['device_name'].'"><br />';

I ładnie mi podstawia zadana wartośc urządzenia o ID=2. Ale jak zrobić tak, zeby po naciśnięciu linku edycja (przy wskazanym urządzeniu) to id=2 podstawiło się smao, jakby z linku? Wiem, ze chodiz o to i link powinien wyglądac jakoś tak (tak myślę)

addingHistoryToDevice.php?addTo=id
edytuj_sprzet.phpp?addTo=2

Jakieś dodatkowe wskazówki mogę prosić? Czytałem o $_GET, ale nie bardzo wiem, jak to dokładnie zastosować…

 

Dzięki wielkie za pomoc :D.


(kostek135) #10

@ad 1