Avatar billede nomisweb Nybegynder
04. september 2007 - 23:25 Der er 12 kommentarer og
1 løsning

producent og produkt flettet sammen?

Hej,

Jeg har 2 tabeller i en database som skal flettes ind i hinanden når det trækkes ud.
Jeg har en tabel med info omkring producenter og en tabel med info omkring produkter.

Her er SQL udtræk:
CREATE TABLE `producenter` (
  `id` int(10) NOT NULL auto_increment,
  `producent` varchar(100) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
);

CREATE TABLE `produkter` (
  `id` int(10) NOT NULL auto_increment,
  `producent_id` varchar(100) NOT NULL,
  `produkt` varchar(100) NOT NULL,
  `produkt_text` text NOT NULL,
  `pris` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
);

Det jeg så skal er at man trækker data fra begge tabeller ud og lister det således at først kommer der producent info, og derefter kommer denne producents produkter. Derefter næste producent og vedkommenes produkter, osv osv.

Mit php script ser således ud:
<table>
<?php
$producenter = mysql_query("SELECT * FROM producenter");
$NRproducenter = mysql_num_rows($producenter);

for ($i=0; $i < $NRproducenter; $i++) {
    $row = mysql_fetch_array($producenter);
    echo "<tr><td>".$row[1]." $i</td></tr>\n<tr><td>".$row[2]."</td></tr>\n";
    $produkter = mysql_query("SELECT * FROM produkter WHERE producent_id = '$i'");
    $NRprodukter = mysql_query($produkter);
    for ($x=0; $x < $NRprodukter; $x++) {
            $row2 = mysql_fetch_array($produkter);
            echo "<table><tr><td>".$row2[2]."<br />".$row[3]."</td></tr><tr><td>".$row2[4]."</td></tr></table>";
            }
    }
?>
</table>

Jeg får producenterne frem men ikke deres produkter. Hvordan går jeg bedst dette?

Tak for hjælp
Avatar billede jakobdo Ekspert
05. september 2007 - 08:07 #1
Du burde kunne nøjes med denne sql:
SELECT p1.producent, p1.text, p2.produkt, p2.produkt_text FROM produkter AS p2 INNER JOIN producenter AS p1 ON (p1.id = p2.producent_id)
Avatar billede nielle Nybegynder
05. september 2007 - 08:22 #2
Jeg vil dertil anbefale at du bruger mysql_fetch_assoc() i stedet for mysql_fetch_array() og så kalder felterne ved deres navne i stedet for deres placering - $row["id"] i stedet for $row[1]. For det første gør det koden lettere at læse, og for de andet betyder det at din kode bliver langt mere håprdfør for om du en dag beslutter dig for at udvide en af dine tabeller med et felt mere.
Avatar billede nielle Nybegynder
05. september 2007 - 08:26 #3
Og så synes jeg at denne her konstruktionser farlig ud:

for ($i=0; $i < $NRproducenter; $i++) {
    ....
    $produkter = mysql_query("SELECT * FROM produkter WHERE producent_id = '$i'");
    ...
    }

Den virker kun hvis du ikke har slettet noget produkt fra din tabel på noget tidspunkt (og hvis du ikke allerede har gjort det, så vil det helt sikkert ske på et tidspunkt i fremtiden!). Når det sker, så vil din nuværende kode fungere sådan at de sidste produkter aldrig vil blive listet.
Avatar billede nielle Nybegynder
05. september 2007 - 08:32 #4
håprdfør => hårdfør
Avatar billede nomisweb Nybegynder
05. september 2007 - 08:54 #5
jakob -> tak for sql sætning. Den er jo noget mere smart. Nu har jeg ikke fået det til at fungere, men hvis jeg forstår den rigtigt så henter den alle rækker ind, fra begge tabeller, ik?

nielle -> Jeg ændre det til fetch_assoc. Plejer egentlig også at bruge $row['id'], men var vidst lidt doven.

Jeg roder helt vildt meget rundt i hvad der er fedest at bruge i situationen her, for eller while?
Prøvede denne while, med jakobs sql, bare som test, men der kommer ikke noget ud:

while ($row = mysql_fetch_assoc($shop);) {
echo "<tr><td>".$row['producent']."</td></tr><tr><td>".$row['produkt']."</td></tr>";
}

Nogen andre foreslag?
Avatar billede jakobdo Ekspert
05. september 2007 - 09:07 #6
Virker min SQL, hvis du tester den direkte i PHPMYADMIN?
Avatar billede nomisweb Nybegynder
05. september 2007 - 09:43 #7
Go ide, havde ikke lige tænkt jeg kunne prøve der!
Den virker delvist. Dvs. Den henter producent data for hver gang den henter produkt data, men den skal bare hente producent data en gang og derefter alle produkt data der er. Så måske var det forkert af mig at skrive det skulle flettes sammen.
Men kan jeg ikke bare rette det i php'en?
Avatar billede nomisweb Nybegynder
06. september 2007 - 14:16 #8
Nu har jeg overvejet en anden løsning da jeg som nævnt herover ikke kunne bruge sql sætningen alligevel. Men der er stadig en fejl i det et sted, er der mon nogle gode ideer eller lidt hjælp at hente?

$producenter = mysql_query("SELECT * FROM producenter");
$NRproducenter = mysql_num_rows($producenter);

function produkt($producent_id) {
    $produkter = mysql_query ("SELECT * FROM produkter WHERE producent_id = '$producent_id'");
    while ($produkt_row = mysql_fetch_assoc($produkter);) {
        $out = "<table><tr><td>".$produkt_row['produkt']."<br />".$produkt_row['produkt_text']."</td></tr><tr><td>".$produkt_row['pris']."</td></tr></table>";
    }
    return $out;
}

for ($i=0; $i < $NRproducenter; $i++) {
$row = mysql_fetch_assoc($producenter);
    echo "<tr><td>".$row['producent']." $i</td></tr>\n<tr><td>".$row['text']."</td></tr>\n";
    echo produkt($row['id']);
    }
Avatar billede nielle Nybegynder
06. september 2007 - 14:20 #9
Prøv at ret din:

$out = "<table><tr><td>".$produkt_row['produkt']."<br />".$produkt_row['produkt_text']."</td></tr><tr><td>".$produkt_row['pris']."</td></tr></table>";

til:

$out .= "<table><tr><td>".$produkt_row['produkt']."<br />".$produkt_row['produkt_text']."</td></tr><tr><td>".$produkt_row['pris']."</td></tr></table>";
Avatar billede michael_stim Ekspert
06. september 2007 - 14:20 #10
while ($produkt_row = mysql_fetch_assoc($produkter);)
Har du et ; for meget:
while ($produkt_row = mysql_fetch_assoc($produkter))
Avatar billede nomisweb Nybegynder
06. september 2007 - 14:35 #11
Det ser sgu ud til at virker! :-) Nu skal jeg bare lige tilpasse deisgnet lidt. Nej hvor fedt. Tak for hjælpen! Så blev min dag bare tusind gange bedre!
Avatar billede nielle Nybegynder
06. september 2007 - 20:34 #12
Svar :^)
Avatar billede nomisweb Nybegynder
07. september 2007 - 09:38 #13
Og tak for hjælpen! :-)
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