![]() |
Jag har flera olika tabeller (5st) och vill sätta in data i en av tabellerna men detta skall vara kopplat till den andra 4 tabellerna.
Universitet, Program, Termin, Kurs, Bok När jag registrerar en boks titel, författare etc i tabellen Bok vill jag samtidigt att data registreras angående kurs, termin, program och universitet så att man i efterhand kan sortera ut vilka böcker en speficik termin har osv. Blir dock väldigt förvirrad med mina nybörjarkunskaper i PHP och MySQL. Är tacksam för all hjälp! |
Rent databaslayoutmässigt så bör det vara:
1 universitet kan ha flera Program 1 Program kan ha flera kurser 1 kurs kan ha flera böcker ("Termin" är bara kosmetik enligt mig, såtillvida du inte vill koppla att vissa program endast går vissa terminer...men då kanske årtal spelar in också.) Om ett universitet har ett program som heter likadant som ett annat universitets program så betyder det kanske inte att det är samma sak...(att tänka på.) Du måste alltså enligt ovan ha sk kopplingstabeller mellan univ och prog, mellan prog och kurs, mellan kurs och böcker. Ex. Universitet ================== id namn 1 Uppsala universitet 2 Stockholms universitet Program ================== id Namn 1 Datablajj 5p 2 Lärarblajj 15p Koppling_Univ_Program ================== univ_id Prog_id 1 1 1 2 2 2 Etc..etc... (kopplingstabellen ovan visar att Uppsala har båda kurserna medans sthlm bara har kurs med id 2.) Eller var det ren PHP/SQL syntax dy ville ha hjälp med? =) |
Tack för svaret!
En fråga bara. Måste en kopplingstabell skrivas som ovan univ_id Prog_id, eller är det enbart kutym? Vad jag gjort hittills i form av en "kopplingstabell" är att i princip köra in BokID, UniID, ProgramID, TerminID, KursID, Titel författare etc, är detta väldigt onödigt eller har jag gjort rätt? |
Äh, namnen jag gav var bara förslag, tror inte det finns någon "naming convention" vad gäller databastabeller.
Ang din sista fråga; jag är inte riktigt med på vad du säger. Kan du utveckla lite? |
Alltså, jag gjorde en sista tabell där ID från alla övriga tabeller även fanns med.
|
Citat:
Det finns ju inget rätt eller fel i databasmening utan det handlar ju om hur problemdomänen ser ut. |
Hmm, är inte exakt säker på vad du menar, men om vi säger så här: om det visar sig att du lagrar samma information flera gånger i samma tabell så har du gjort fel (ok, det är väl rätt det också men att dubbellagra info ger ju inte direkt någon relationsdatabas (enligt vissa normaliseringsregler))
|
Håller på att bli tokig...nybörjare som man är....
Har iaf skapat mina tabeller och ett script för att lägga in information problemet är bara att informationen aldrig riktigt lagras i tabellen. Skrev denna förklaring på engelska på ett forum hur problemet ser ut. Vore jättetacksam om någon kunde peka ut vad som är fel.... Everytime the same result appears, 9 rows are filled even though data is only put for 1 row. No data appears and following pattern exists. bokID continues as expected, uni ID always null progamID empty (but supposed to be filled) termID empty (but supposed to be filled) kursID always 0 title empy (but supposed to be filled) author 1 Null apart from row 8 author 2 Null apart from row 7 author 3 Null apart from row 6 author 4 Null apart from row 5 year Null apart from row 4 edition always null isbn null apart from row 2 publisher null apart from row 3 status null apart from row 1. html koden: <form action="insert_book.php" method="post"> <table border=0> <tr> <td>Universitet</td> <td> <input type="text" name="uni" maxlength=50 size=30> </td> </tr> <td colspan=4><input type=submit value=Tanka Upp!></td> delar av PHP koden: inga error uppstår men inte heller får jag bekräftat mitt sista echo. mysql_query("INSERT INTO tblbooks (year) VALUES ('$year')"); mysql_query("INSERT INTO tblbooks (publisher) VALUES ('$publisher')"); mysql_query("INSERT INTO tblbooks (isbn) VALUES ('$isbn')"); mysql_query("INSERT INTO tblbooks (status) VALUES ('$status')"); $result = mysql_query($query); if ($result) echo mysql_affected_rows()." bok lagrad i databasen."; |
INSERT INTO tblbooks (year, publisher, isbn, status) VALUES ('$year', '$publisher', '$isbn', '$status')")
..för du ska väl lägga in alla dessa data på samma rad i tabellen? |
Aha. Försökte tidigare med att lägga allt på en rad och någon nämde att jag istället skulle lägga in rad för rad vilket jag försökte göra.
Att skapa en databas för att lägga in data och titta på den är det simplaste i databas hantering men inte ens det lyckas jag med.... Problemet kvarstår dock, ingen data kommer in. Varför? |
Om vi säger att du har en tabell med Universitet (där datat mer eller mindre aldrig updateras pga att det inte byggs så många ny univ.)
Du har också lagt in data om programmen i din Programtabell. Du kan ju börja med att knyta ihop vilka program som hör till vilka universitet genom att i din kopplingstabellen (mellan univ och prog) koppla universitetsid till programid. Du gör sedan likadant med kurser; knyter dessa kurser till de olika programmen, och sedan likadant med böckerna, knyter dess böckernas id till kursernas id. Men du får ju tänka på följande; om det finns lokala avvikelser mellan de olika universitetens program så bör de lagras dubbelt i databasen (de kanske har olika kurslitteratur knutet till sig och då måste programmen ligga som en dublett. Likaså gäller givetvis kurserna. |
Citat:
men för att återgå till problemet... Exakt hur lägger du in data och exakt hur hämtar du data när du äsger "att inget finns där"? |
Citat:
Det blir antagligen mycket redundans då kopplingar måste dubbleras för varje universitet som kommer in etc etc. Det bästa är att göra en "riktigt" databasmodell, och i detta fallet betyder det att böckerna bara ska kopplas till kurserna. Ett universitet kan inte ha en bok. Ett program kan inte ha en bok. En kurs kan ha flera böcker. |
Nu går vi off-topic men;
Samma kurs kan ha olika böcker beroende på olika universitet. Således måste man välja på att antingen ha redundans i "kurs" dvs två instanser av samma kurs beroende på universitet, eller så löser man det med en kopplingstabell som talar om vilken bok som hör till vilken kurs på vilket universitet. Om man har den typen av beroenden är till och med databasen normaliserad. Det finns inget som säger att man inte får koppla flera olika tabeller i en gemensam tabell. Allt hänger ju på hur relationerna i data ser ut. bara för att samma kurs råkar ha samma bok på två olika universitet innebär inte det att data är redundant eftersom det är olika universitet. Du refererar till att man skall göra en "riktig" databasmodell. "Riktig" betyder i alla praktiska fall att DB-modellen måste vara anpassad för de relationer man kan identifiera, inte anpassad för en fantasivärld. Det är naturligt att knyta bok till kurs och kurs till universitet. men om man gör det finns bara en lösning när samma kurs har olika böcker på olika universitet och det är att göra två olika kurser, men med samma namn. Om det nu är så att detta är vanligt (vilket det sannolikt är) blir det lättare och mer i linje med de verkliga relationerna att lägga allt i en enda kopplingstabell. Med lite våld kan man kanske kalla det redundans, men det är inte intressant egenligen för det man vill ha är en DB-modell som liknar verkligheten för att på så sätt göra jobbet att lägga in och hämta data enklare. Samtidigt ger den förenklade (med en gnutta redundans) sannolikt snabbare svar än en mer puristisk design. |
Kopplingar ska göras på 1 ställe så de kan pekas om utan att behöva updatera på flera ställen. Om nu en kurs skulle byta universitet (vilket iofs är fantasi i detta fall men som exempel:) så behöver man updatera xxx antal kopplingar istället för att bara peka om kursen.
Japp, två kurser som har olika innehåll är INTE likdana bara för att vi människor väljer att identifiera en kurs vid dess namn (som må vara samma). Det är därför inte redundans att lagra en (till synes) identiskt kurs flera gånger. Min personliga åsikt är inte att din modell är mer "i linje med de verkliga relationerna". De flesta strukturer beskrivs både lättas och bäst i en trädstruktur, inte en "stjärnstruktur" där 1 objekt har förgreningar åt alla håll även om de övriga objekten (tabellerna) har inbördes kopplingar. Måhända att i detta fall endast böckerna är en avgränsad sak som ska behandlas och då duger kanske din struktur, men om man någon gång i en oöverskådlig (oplanerad snarare) framtid behöver göre en förändring så är det dumt att ha målat in sig i ett hörn. Tänk att senare behöva lägga till en tabell som kanske beskríver författare. Då måste man i ditt fall lägga till en kolumn och updatera alla rader i denna (på bredden) växande kopplingstabell. Samma bok, med samma författare, behöver alltså updateras på xxx antal ställen. |
Jag är oerhört tacksam för Era svar. Det är en stor tröst, tro mig!
Iaf. Så här har jag lagt upp mina tabeller. Funderade om det var något i radernas beskrivning som är felaktig och som därför skapar "tom" data i min tabell. Är aningen förvirrad då det är så pass många olika variabler som skall in. Kommentera gärna! Åter igen är jag väldigt tacksam! create table tbluni ( uniID CHAR(4) NOT NULL PRIMARY KEY, uni CHAR(50) NOT NULL); create table tblprogram ( programID CHAR(5) NOT NULL PRIMARY KEY, uniID CHAR(4) NOT NULL, program CHAR(30) NOT NULL ); create table tblterm ( termID CHAR(7) NOT NULL PRIMARY KEY, programID CHAR(5) NOT NULL, term INT NOT NULL ); create table tblcourse ( kursID CHAR(6) NOT NULL PRIMARY KEY, termID CHAR(7) NOT NULL, course CHAR(100) NOT NULL, credits CHAR(2) NOT NULL ); create table tblbooks ( bokID INT NULL AUTO_INCREMENT PRIMARY KEY, uniID CHAR(4), programID CHAR(5) NOT NULL, termID CHAR(7) NOT NULL, kursID INT NOT NULL, title VARCHAR(200) NOT NULL, author1 VARCHAR(50) NULL, author2 VARCHAR(50) NULL, author3 VARCHAR(50) NULL, author4 VARCHAR(50) NULL, year CHAR(4) NULL, edition CHAR(3) NULL, isbn CHAR(13) NULL, publisher CHAR(60) NULL, status VARCHAR(5) NULL ); |
Citat:
Dock är det naivt av dig (och ett hån mot mitt intelekt :D ) att tro att bara för att jag i detta fall finner en enda kopplingstabell lämplig så skulle det betyda att när jag vill lägga till författare så måste jag göra det med en kolumn till i den gigantiska tabellen. Jag är ute efter att använda de relationer som är verkliga och en bok har en eller flera författare och tvärt om. Därför är det oavsett den ursprungliga stora kopplingstabellen lämpligt med en separat kopplingstabell för bok/författare. En lösning utesluter inte en annan... Steiner: Exakt hur lägger du in data. Och exakt hur ser du att dina tabeller är tomma? |
Glömde säga att jag tittar efter sparad data genom att gå in i PHPADMIN. Använder jag enbart SQL satser i PHPADMIN sparas data utan problem...för att titta på datan väljer jag bara vilken databas sedan vilken tabel och "VISA", tabellen kommer då fram och den data jag satt in finns där.
Försöker jag köra via formulär så är tabellen delvis NULL och de rader som inte är NULL är helt tomma. |
Har viss data sparad, ca 100 rader, och försökte åtminstone få in den i databasen.
Det skall tydligen gå om man konverterar excellfilen till CSV och lägger in den via PHPADMIN. Visst skapas det rader men det är all NULL precis som tidigare.... |
Försöker lägga in kolumner rad efter rad. Den första fungerar, dvs uniID men inte programID då uppstår NULL-felet.... Har tagit bort svenska tecken och vad som än så länge enbart finns i kolumen är "lak" (utan " förstås).
|
jag repeterar:
Exakt hur ser din PHP sträng ut som du försöker inserta? I ett tidigare inlägg påpekade ju robert ett problem. gör typ: $qs = sprintf("INSERT bla bla bla"); echo " " . $qs . "</p>"; mysql_query($qs); Om mysql_query returnerar false? vad får du i så fall för fel? |
Ah ursäkta.
Så här ser koden ut. <? $uni = addslashes($uni); $program = addslashes($program); $term = addslashes($term); $course = addslashes($course); $title = addslashes($title); $author1 = addslashes($author1); $author2 = addslashes($author2); $author3 = addslashes($author3); $author4 = addslashes($author4); $edition = addslashes($edition); $year = addslashes($year); $publisher = addslashes($publisher); $isbn = addslashes($isbn); $status = addslashes($status); $db=mysql_connect("localhost", "uppsalamedicin_", "vitpiller"); mysql_select_db("uppsalamedicin_", $db); if (!$db) { echo "Error Kunde inte kontakta databasen försök igen senare."; exit; } mysql_query("INSERT INTO tblbooks (year, publisher, isbn, status) VALUES ('$year', '$publisher', '$isbn', '$status')"); $result = mysql_query($query); if ($result) echo mysql_affected_rows()." bok lagrad i databasen."; ?> |
Jag får alltså inte fram något felmeddelande alls. Det enda jag får fram är den HTML kod som är skriven innan scriptet. Något händer dock med scriptet eftersom data "registreras" i database...
|
Jag förstår allvarligt inte vad du säger...
vad menar du med Något händer dock med scriptet eftersom data "registreras" i database...? Vad ger mysql_affected_rows()? Om du kör strängen som skapas manuellt, i phpadmin - funkar det då? |
Kör jag php scriptet så lagras inte den data jag satt in i formuläret, men en ny rad i tabellen skapas, dvs en ny bok registreras men ingen information om boken finns tillgänglig.
mysql_affected_rows() ger ingenting. Det enda som sker efter att jag tryckt på knappen "skicka", dvs anropat mitt php script (insert_book.php) är att den html kod som finns i början kommer fram. Inga mysql_affectd_rows(), ingen error som if (!$db) som visar att databasen inte kontaktas (vilken den ändå måste göra då en ny bokID registreras). För att göra det väldigt enkelt har jag valt att göra ett formulär med en enda rad. www.uppsalamedicin.se/bokbas/nybok5.html |
Sätter jag in detta i PHPADMIN
INSERT INTO tblbooks VALUES ("uu", "lak", 1, "cbb", "jag och döden", "sven hedin", "arne", "sven", "kalle", "2004", "1", "12345674121", "stromabolaget", "reck"); får jag detta svar: #1136 - Column count doesn't match value count at row 1 Det är 14 columner utöver ( bokID INT NULL AUTO_INCREMENT PRIMARY KEY), vilket motsvarar antalet fält ovan ("uu", "lak", 1 etc) |
Så här ser det ut i PHP admin när jag väljer att exportera data från tblbooks. Då har jag gått in på www.uppsalamedicin.se/bokbas/nybok5.html och valt att skicka mitt formulär 2 ggr (två rader uppstår alltså tabellen, men som visas nedan finns ingen data alls).
Själv är jag lite osäker på varför kursID tex har default '0', vad är "UNIQUE KEY" som står för uniID detta stämmer väl inte överens med hur jag har skapat tabellen ovan? Struktur för tabell `tblbooks` # CREATE TABLE `tblbooks` ( `bokID` int(11) NOT NULL auto_increment, `uniID` varchar(4) default NULL, `programID` varchar(5) NOT NULL default '', `termID` varchar(7) NOT NULL default '', `kursID` int(11) NOT NULL default '0', `title` varchar(200) NOT NULL default '', `author1` varchar(50) default NULL, `author2` varchar(50) default NULL, `author3` varchar(50) default NULL, `author4` varchar(50) default NULL, `year` varchar(4) default NULL, `edition` char(3) default NULL, `isbn` varchar(13) default NULL, `publisher` varchar(60) default NULL, `STATUS` varchar(5) default NULL, PRIMARY KEY (`bokID`), UNIQUE KEY `uniID` (`uniID`), KEY `bokID` (`bokID`) ) TYPE=MyISAM AUTO_INCREMENT=3 ; # # Data i tabell `tblbooks` # INSERT INTO `tblbooks` VALUES (1, NULL, '', '', 0, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ''); INSERT INTO `tblbooks` VALUES (2, NULL, '', '', 0, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ''); |
Byt ut:
Kod:
if ($result) Kod:
if ($result) Är att du ju inte specificerat alla kolumner du vill inserta (som du gjort med dina 4 kolumner i PHP koden). Om du inte gör INSERT table(columns) VALUES(values) utan bara INSERT table VALUES(values) måste du ha med alla kolumner vilket ju är lämpligt med tanke på din auto increment. På den här raden: mysql_query("INSERT INTO tblbooks (year, publisher, isbn, status) VALUES ('$year', '$publisher', '$isbn', '$status')"); Inseratr du ju t.ex. inget i kolumnen programID m.fl. som har NOT NULL och då misslyckas ju inserten eftersom du inte tillhandahpålller värden för kolumner som är NOT NULL och dessutom saknar default. |
eg0master,
tusen tack för hjälpen. Jag gör ändringarna och meddelar vad som skett! |
Jag gjorde ändringen och det svar jag får är:
Query was empty. Jag har innan dess tagit bort tabellen och lagt till en ny fast den ser ut såhär: Kod:
create table tblbooks |
Ja du... nu börjar det verkligen vara konstigt...
Uppenbarligen går något fel i alla fall :-) Frågan är om du skall försöka skicka med $db till mysql_query. Det brukar jag alltid göra. |
Jo, jag vill ju bara ha en fungerande kontakt med min DB.
Den kod jag skrivit är direkt kopierad från exempel från böcker, men det blir fel trots detta....Om du har ett formulär kopplat till ett script som jag kanske kunde använda vore jag oerhört tacksam! |
Min erfarenhet är att tyvärr kan exempel förutsätta vissa saker vilket gör att så snart man försöker testa med en liten förändring så kan det sluta funka. Men men...
Jag brukar använda mig av funktioner i stil med detta: Kod:
function cellfish_db_connect() Kod:
$db = cellfish_db_connect(); Jag föreslåt att du testar detta. Då kommer vi ju även i utskriften se exakt hur frågan som körs ser ut. |
Tack! Jag försöker vidare! Håller med om att små förändringar gör stor skillnad...borde väl egentligen skriva en helt ny kod...
Åter igen tack! |
Alla tider är GMT +2. Klockan är nu 19:22. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson