04. september 2007 - 23:25Der 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);
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)
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.
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.
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>"; }
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?
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; }
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!
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.