Avatar billede gulvflaesk Nybegynder
25. februar 2011 - 03:05 Der er 14 kommentarer og
1 løsning

Flere tabeller i databasen

Hej Eksperter,

Jeg er ved at lave en webshop i PHP.

Databasen ser så ledes ud:

produkter
-produktid
-produktnavn
-produktHTML
-dato
-beskrivelse
-image

kategorier
-kategorinavn

brands
-brandnavn

Problemet er at jeg gerne vil have min produkter sat i en kategori og et brand. Alle kategorier og brands skal være i hver sin dropdown når man opretter et produkt.

Hvordan kan jeg få dem til at 'snakke' sammen?

Håber at nogen kan hjælpe mig, da jeg er lidt på herrens mark.
25. februar 2011 - 05:38 #1
Jeg vil foreslaa at du giver tabellerne kategorier og brands hver en ekstra kolonne id med datatype INT, og saa giver du tabellen produkter to ekstra kolonner kategori og brand, ogsaa med datatype INT, for eksempel saaledes:

produkter
id INT kategori INT brand INT navn VARCHAR(32) o.s.v.
1            3                2          superprodukt
2            1                3          mit produkt
3            3                2          produkt a

kategorier
id INT navn VARCHAR(32)
1          madvarer
2          drikkevarer
3          papirartikler

brands
id INT navn VARCHAR(32)
1          Persil
2          Edet
3          Kinroy

Hvis du saa for eksempel i php vil lave en oversigt over alle varer i kategorien papirartikler kan du bruge saadan en forespoergsel:

<?php
$result = mysql_query("SELECT p.id, p.navn as produkt, b.navn as brand FROM produkter p JOIN kategorier k ON p.kategori = k.id JOIN brands b ON p.brand = b.id WHERE k.navn = 'papirartikler'");

echo "Produkter i kategorien papirartikler: <br>";
while($row = mysql_fetch_array($result))
{
  $id = $row['id'];
  $produkt = $row['produkt'];
  $brand = $row['brand'];
  echo "id = $id - produkt = $produkt - brand = $brand <br>";
}
?>
Avatar billede gulvflaesk Nybegynder
25. februar 2011 - 17:12 #2
Hej Christian,

Hvordan for jeg lagt produkterne ind under den korrekte kategori og brand? Jeg vil gerne have brands og kategorier i en dropdown i min 'opret produkt form'.

Jeg må ærligt indrømme at jeg ikke forstår det du har skrevet :-)
25. februar 2011 - 18:57 #3
Jamen det er nok mig der ikke har forstaaet dit problem.  Jeg kan se at du har en tabel produkter med en raekke for hvert produkt saaledes at du for hvert produkt kan se produktets navn, dets beskrivelse, dets dato, o.s.v. Men produtets kategori og brand kan du ikke se fordi produkter og brands ligger i andre tabeller uden nogen forbindelse til produkttabellen. 

Du stiller saa spoergsmaalet hvordan du faar dem til at 'snakke' sammen.  Jeg gik ud fra at spoergsmaalet var hvordan du kan oprette et produkt i en kategori og med et brandnavn og saa gemme oplysningerne i databasen paa en saadan maade at du senere kan traekke oplysningerne ud.  Hvilket du ikke kan med den nuvaerende tabelstruktur. 

Det ville have vaeret et naturligt spoergsmaal, for det giver ingen mening at begynde at lave formularer med drop-down lister saa laenge man ikke kan gemme de indfoerte vaerdier saaledes at man kan finde dem tilbage.  Jeg forklarede derfor hvordan du kan forbinde tabellerne.

Men det kan du saa ikke bruge.  Proev saa en gang mere at forklare hvad du er ude efter, og lad os se hvor langt du selv er kommet.
Avatar billede gulvflaesk Nybegynder
26. februar 2011 - 17:21 #4
Hej igen,

Først og fremmest mange tak for at du giver dig tid til at hjælpe mig.

Her er de filer det drejer sig om:
http://gupl.dk/56736/

Det jeg ikke helt kan greje er hvordan produktet ved hvilken kategori det er i? Altså hvordan vælges det, udfra kategoriens id?
26. februar 2011 - 19:58 #5
Ja, jeg vil gerne give HJAELP TIL SELVHJAELP.  Hvor stor en indsats er du selv parat til at goere i sagen?  Vi har foer kunnet finde ud af det, men  nu synes vi at have svaert ved at kommunikere.

Skal vi foerst tage det med hvordan et produkt ved hvilken kategori det er i?  Du viste denne produkttabel:

produkter
produktid, produktnavn, produktHTML, dato, beskrivelse, image

Hvis du fylder en raekke i tabellen ud, for eksempel produktid=10, produktnavn='cykel', dato='2011-02-25', o.s.v., saa kender produktet cykel sin id, sit navn, sin produktHTML (hvad det saa er,) sin dato, sin beskrivelse, og sin image.  Og ikke andet.

Hvis du ogsaa vil at produktet skal kende sin kategori og brand saa maa du udvide tabellen saa det ogsaa har et felt kategori og et felt brand og fylde disse ud, for eksempel kategori='transportmiddel', brand='SCO'.

Saa langt er det da til at forstaa, ikke sandt?  Eller??

Men det rejser naturligvis nye spoergsmaal:  (1)  Hvordan faar du oplysninger ud af produkttabellen saa du ogsaa ved det, og (2) hvordan faar du oplysningerne ind i produkttabellen til at begynde med?  Det generelle svar er dette:  Man laver et program der kommunikerer med databasen og som indeholder SQL statements saasom "SELECT id, navn, dato, kategori, .... FROM produkter.." og "INSERT INTO produkter VALUES(25, 'cykel', '2011-02-25', 'transportmiddel', 'SCO' ..."

Saadanne programmer kan man downloade, men med mindre man selv er parat til at goere en indsat med selv at aabne og studere filerne og saette sig lidt ind i sagerne, saa kommer man ikke ret langt hvis man vil tilpasse programmerne.

Fra det link du sendte kan jeg se at du downloader en webshop.  Af filerne i linket kunne jeg aabne to, opretprodukt-post.php og opretprodukt.php. 

Fra opretprodukt-post.php kan jeg se at webshoppen goer brug af en databasetabel "produkter" med felterne produktnavn, pris, produktHTML, kategori, brand, beskrivelse, dato, med andre ord saadan som jeg sagde tidligere.

opretprodukt.php indeholder en formular hvor man kan fylde ud produktnavn, pris, kategori, brand, og beskrivelse.  Jeg har pakket filen ud, og du kan se formularen her:  http://christianjorgensen.be/gulvflaesk1.php .  Formularen indeholder en dropdown for kategori, men den dropdown indeholder kun en enkel vaerdi, nemlig 'kategori'.  Ligeledes indeholder formularen en dropdown for brand med en enkel vaerdi, 'brand'.

Og saa tilbage til dit oprindelige spoergsmaal.  Er det saaledes at du har en databasetabel kategorier med en raekke kategorinavne?  Og du vil at dropdownlisten skal indeholde disse kategorier?  Og ligeledes med brand?

I saa fald har jeg disse spoergsmaal:

1.  Den produkt tabel du viser, hvor har du den fra?  (Den er forskellig fra den produkttabel der bruges i dit downloadede program.  Har du maaske skrevet forkert?)

2.  kategorier tabellen, hvor har du den fra?  Bestaar den allerede med kategori vaerdier i?  I saa fald, hvor sidder den?  I den samme database som produkter?  Hvordan blev vaerdierne fyldt ud?  Har tabellen kun en enkel kolonne, kategorinavn?  Eller har den ogsaa en kolonne med en ID?

3.  Samme spoergsmaal for brands tabellen.

Naar vi har akkurat information derover, og hvis du saa er indstillet paa selv at gaa ind og aendre paa databasen og paa php filerne, vil jeg sandsynligvis kunne komme med forslag der kan hjaelpe dig til at opnaa det resultat du soeger.
Avatar billede gulvflaesk Nybegynder
27. februar 2011 - 01:45 #6
Hej igen,

Jeg forstår godt det første du skriver. Altså at 'produkter' tabellen skal have 'kategori-felt' og 'brand-felt'. Det har den fået.

De filer er ikke nogen jeg har downloadet fra en færdig shop. De er godt nok smidt ind i et færdigt template. Koden har jeg altså selv skrevet, ligesom jeg selv har oprettet tabellerne i databasen.

Jeg er villig til at lære det, og det er derfor at jeg skriver i dette forum. Hvis jeg ikke ville lære det kunne jeg vælge at hente eksempelvis Prestashop eller Magento.

Grunden til at de to dropdown er 'tomme' og ikke får noget fra databasen er at jeg ikke ved hvordan jeg henter kategorier og brands ud i dropdown-listen fra databasen, samt hvordan jeg poster det til databasen så 'produktet' ved hvilken kategori det er i.

Min database ser således ud:

brands
  -brandid
  -brandnavn


kategorier
  -kategoriid
  -kategorinavn


produkter
  -produktid
  -produktnavn
  -pris
  -produktHTML
  -kategori
  -brand
  -dato
  -beskrivelse

Tak for din hjælp så langt, Christian :-)

Håber du vil hjælpe mig yderligere på vej...
27. februar 2011 - 08:34 #7
Saa du bygger det selv.  Det er godt.  Og vi fik kategori og brand ind i tabellen produkter. 

Du holdler kategorinavnene i en saerskilt tabel saaledes at produkter blot indeholder kategori-id.  En fordel derved er at du saa paa forhaand kan bestemme hvilke kategorier du vil have og fylde disse i kategoritabellen.  Ved saa at bruge dropdown for kategori sikrer du dig at der ikke kommer til at oprette produkter med ikke-bestaaende kategorier.  Og det samme gaelder for brand.

Saa i tabellen produkter har du i feltet kategori egenlig kategoriid'en og datatypen for feltet skal vaere INT, og tilsvarende for brand.

Udgangspunktet for en kategori dropdown er at du allerede har fyldt vaerdier i kategoritabellen.  For eksempel:

kategorier
id navn
1    madvarer
2    drikkevarer
3    papirartikler

En dropdown hedder, i en html formular, select, og 'tingene' i dropdownen hedder options.  I det link du gav skal du i filen opretprodukt.php finde dette kodeafsnit:

<p><strong>KATEGORI</strong><br />
<select name="kategori" class="box">
<option value="Kategori">Kategori</option>
</select></p>

Det kodeafsnit laver godt nok en dropdown, men uden vaerdier.  Ved at erstatte det med nedenstaaende kode udbygger du det saaledes at koden foerst henter navnene paa kategorierne fra databasen og derefter laver en option for hvert kategorinavn.  (Jeg gaar ud fra at du i koden allerede har en aaben forbindelse til databasen.)

<?php
echo "<p><strong>KATEGORI</strong><br />";
$result = mysql_query("SELECT kategorinavn FROM kategorier");
echo "<select name="kategori" class="box">";
while($row = mysql_fetch_array($result))
{
  $kategorinavn = $row['kategorinavn'];
  echo "<option value=$kategorinavn>$kategorinavn</option>"; 
}
echo "</select></p>";
?>

Og ligeledes for brand.

Men det er naturligvis ikke nok at man kan vaelge en kategori naar man opretter et nyt produkt.  Man skal ogsaa have kategoriid'en indsat paa den rigtige plads i tabellen produkter.  Der skal du saa have fat paa filen opretprodukt-post.php i det link du viste.  Du ser at koden, ud fra det der kommer fra den udfyldte formular, definerer variablerne $produktnavn, $pris, ....$kategori.  $kategori indeholder kategorinavnet, men du skal have fat i kategoriid'en.  Det faar du ved, efter $kategori = ($_POST[kategori]); at skrive:

$kategoriid = mysql_result((mysql_query"SELECT kategorid FROM kategorier WHERE kategorinavn = $kategori"), 0);

og ligeledes for at faa brandid fra brandnavn.

Og til slut skal du tilpasse denne linie:

mysql_query("INSERT INTO produkter (produktnavn, pris, produktHTML, kategori, brand, beskrivelse, dato) VALUES ('".$produktnavn."','".$pris."','".$produktHTML."','".$kategori."','".$brand."','".$beskrivelse."','".$dato."')");

saaledes at du erstatter $kategori med $kategoriid og ligeledes erstatte $brand med $brandid.

Det var en mundfuld, men det skulle give dig dine dropdowner hvor du kan vaelge og indsaette kategorier og brands.  Jeg har ikke haft mulighed for at teste mine kodeforslag, men de skulle virker.  Proev dem ud og fortael mig hvordan det gik.

Lige til sidst, hvordan ved et produkt saa hvilken kategori det tilhoerer?  Produktet ved hvilken produktid det tilhoerer.  Saa kan produktet kikke i kategorier for at se hvilket kategorinavn der svarer til kategoriid'en.
Avatar billede gulvflaesk Nybegynder
28. februar 2011 - 00:04 #8
Hej igen Christian,

Det er helt perfekt, og jeg forstår fuldt ud hvad du skriver. Det er virkelig skønt at du tager du tager dig tiden til at hjælpe mig (igen og igen).

At hente kategorier og brands ud i dropdown, virker perfekt!

Men jeg får desværre en fejl når jeg skal poste til databasen:
Warning: mysql_result(): supplied argument is not a valid MySQL result resource

Jeg har prøvet Google, men finder ikke rigtigt svar...

Her er delen af opretprodukt-post.php-filen som fejler:

$produktnavn = ($_POST[produktnavn]);
$pris = ($_POST[pris]);
$produktHTML = ($_POST[produktHTML]);
$kategori = ($_POST[kategori]);
$brand = ($_POST[brand]);
$beskrivelse = ($_POST[beskrivelse]);
$dato = date('Y-m-d h:i:s');

$kategoriid = mysql_result(mysql_query("SELECT kategoriid FROM kategorier WHERE kategorinavn = $kategori"), 0);
$brandid = mysql_result(mysql_query("SELECT brandid FROM brands WHERE brandnavn = $kategori"), 0);

Jeg ved ikke helt hvorfor denne fejl forekommer?

Igen tusinde tak for din store hjælp så langt!
28. februar 2011 - 06:52 #9
Det er fordi jeg gav dig forkert kode.  Fordi kategorinavn er en tekststreng skal det vaere "....WHERE kategorinavn = '$kategori' " , altsaa med ' ' omkring $kategorier.

Og saa fordi du siger "...WHERE brandnavn = $kategori" i stedet for "...WHERE brandnavn = $brand"

(Saa der staar 1 - 1 paa klokkerlisten.)

Altsaa proev saadan:

$kategoriid = mysql_result(mysql_query("SELECT kategoriid FROM kategorier WHERE kategorinavn = '$kategori'"), 0);
$brandid = mysql_result(mysql_query("SELECT brandid FROM brands WHERE brandnavn = '$brand'"), 0);

(Det jeg oensker mig til min foedselsdag er en rimelig intelligent komputer der goer saadan som jeg vil, ikke saadan som jeg koder.)
Avatar billede gulvflaesk Nybegynder
28. februar 2011 - 11:26 #10
Hej igen Christian,

Tusinde tak for hjælpen!! Det virker helt perfekt!

Lige et sidste spørgsmål, som jeg håber du vil hjælpe mig med.

Hvordan henter jeg 'kategorinavn' ud i stedet for 'kategoriid'?

Lige nu henter jeg ud på denne måde:

$HentProdukter = mysql_query("SELECT * FROM produkter ORDER BY produktid DESC");


            while($ProduktData = mysql_fetch_array($HentProdukter)) {
   
            echo '<tr class="gray">';
   
            echo '<td>';
            echo ''.$ProduktData[produktnavn].'';
            echo '</td>';
           
            echo '<td>';
            echo ''.$ProduktData[kategori].'';
            echo '</td>';
               
            echo '<td>';
            echo ''.$ProduktData[brand].'';
            echo '</td>';
   
            echo '<td>';
            echo '<a href="retprodukt.php?id='.$ProduktData[produktid].'">RET  </a><span class="v_line">| </span> <a href="sletprodukt.php?id='.$ProduktData[produktid].'" class="delete">SLET </a>';
            echo '</td>';
   
            echo '</tr>';
   
            }

Her er kun 'kategoriid' og 'brandid' fra 'produkter-tabellen'. Jeg har fundet frem til at det hedder INNER JOINS, men jeg kan ikke rigtig få det til at fungere. Hvis du har tid til at forklare mig dette vil det bare være fantastisk :-)
28. februar 2011 - 12:11 #11
Meget hurtigt, for jeg staar og skal afsted - Du kan i dette tilfaelde bruge JOIN i stedet for INNER JOIN.  Proev at rod med dette,  det skulle virker.  Ellers er jeg med paa pinden igen i aften.

$HentProdukter = mysql_query("SELECT *, k.kategorinavn as kategori, b.brandnavn as brand FROM produkter p JOIN kategorier k ON  p.kategori = k.kategoriid JOIN brands b ON p.brand = b.brandid ORDER BY produktid DESC");


            while($ProduktData = mysql_fetch_array($HentProdukter)) {
 
            echo '<tr class="gray">';
 
            echo '<td>';
            echo ''.$ProduktData[produktnavn].'';
            echo '</td>';
         
            echo '<td>';
            echo ''.$ProduktData[kategori].'';
            echo '</td>';
             
            echo '<td>';
            echo ''.$ProduktData[brand].'';
            echo '</td>';
 
            echo '<td>';
            echo '<a href="retprodukt.php?id='.$ProduktData[produktid].'">RET  </a><span class="v_line">| </span> <a href="sletprodukt.php?id='.$ProduktData[produktid].'" class="delete">SLET </a>';
            echo '</td>';
 
            echo '</tr>';
 
            }
28. februar 2011 - 15:43 #12
Jeg kom i tanker om, da jeg var ude af doeren, at mit kodeforslag duplikerer navnene kategori og brand.  Dette skulle virke bedre:

$HentProdukter = mysql_query("SELECT *, k.kategorinavn, b.brandnavn FROM produkter p JOIN kategorier k ON  p.kategori = k.kategoriid JOIN brands b ON p.brand = b.brandid ORDER BY produktid DESC");


            while($ProduktData = mysql_fetch_array($HentProdukter)) {

            echo '<tr class="gray">';

            echo '<td>';
            echo ''.$ProduktData[produktnavn].'';
            echo '</td>';
       
            echo '<td>';
            echo ''.$ProduktData[kategoriid].'';
            echo '</td>';
           
            echo '<td>';
            echo ''.$ProduktData[brandid].'';
            echo '</td>';

            echo '<td>';
            echo '<a href="retprodukt.php?id='.$ProduktData[produktid].'">RET  </a><span class="v_line">| </span> <a href="sletprodukt.php?id='.$ProduktData[produktid].'" class="delete">SLET </a>';
            echo '</td>';

            echo '</tr>';

            }
Avatar billede gulvflaesk Nybegynder
28. februar 2011 - 17:56 #13
Hej Christian,

Det virker helt efter hensigten! Perfekt!

Men forstod ikke helt hvordan at du kom frem til denne:

$HentProdukter = mysql_query("SELECT *, k.kategorinavn as kategori, b.brandnavn as brand FROM produkter p JOIN kategorier k ON  p.kategori = k.kategoriid JOIN brands b ON p.brand = b.brandid ORDER BY produktid DESC");

Vil du ikke være sød at forklare hvordan den bliver strikket sammen og hvad de enkelte ting betyder?

Igen tusinde tak for hjælpen, du er en stjerne!
28. februar 2011 - 20:30 #14
Lad os sige at du har skrevet navnet op paa en du moedte og nu vil du gerne ringe til ham.  Saa tager du telefonbogen og kikker navnene igennem indtil du kommer til et navn der er det samme som det du har skrevet op.  Saa aflaeser du hvilket telefonnummer der staar ud for det navn.  (Undskyld hvis jeg skaerer det for meget ud i pap.)

Omvendt kender hvert produkt et kategorinummer, nemlig det der staar i feltet kategori.  Hvis produktet vil kende kategorinavnet tager det kategoritabellen og gaar numrene igennem (kategoriid) indtil det finder et nummer der svarer til det nummer der staar i sit kategorifelt, og saa aflaeser det det kategorinavn der staar ud for kategori-nummeret.

Naar man i en sql forespoergsel skriver to tabelnavne og instruksen JOIN, saa forsoeger programmet at lave en ny tabel der kombinerer de to tabeller.  Med instruksen ON fortaeller man programmet hvordan den skal kombinere tabellerne.  Naar du siger "SELECT .... FROM produkter JOIN kategorier ON produkter.kategori = kategorier.kategoriid..." saa er det paa menneskesprog dette:  Tag hver linie af tabellen produkter, aflaes vaerdien i feltet kategori, soeg saa i tabellen kategorier efter linien med denne vaerdi i feltet kategoriid, og put saa de to linier, den fra procukter og den tilsvarende fra katetorier, i en linie i den nye kombinationstabel." 

Saa skoent et produkt i tabellen produkter kun kender sit kategorinummer, saa kender produktet i den nye kombinationstabel ogsaa kategorinavnet.

Og naar du saa har denne kombinationstabel saa udvider du den til ogsaa at inbefatte linien fra brands hvor produkter.brand = brand.brandid.

Plus at jeg er doven og finder det lettere at kalde produkter for p og kategorier for k og saa joine on p.kategori = k.kategoriid.
Avatar billede gulvflaesk Nybegynder
01. marts 2011 - 19:53 #15
Tak for forklaringen. Det giver mening.

Tusinde tak for al din hjælp! Du burde (hvis du ikke gør det allerede) undervise i det skidt :-)

Takker og bukker.

De bedste hilsner herfra...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester