15. november 2006 - 13:51Der er
36 kommentarer og 1 løsning
Sammenkæde tilbehør og produkt
Databasen: Jeg har blandtandet to tabeller tilbehor og produkt i min database. Imellem dem har jeg en relation som indeholder de to tabellers primær nøgler: t_id og p_id for at kunne sammenkæde tilbehøret til de relevante produktet.
Mit problem er så at jeg skal bruge en side hvor man kan tilføje tilbehør til et produkt og/eller tilføje et produkt til noget tilbehør.
Min ide var noget i stil a la at man skal gå ind på en side (vis_produkt.php?id=1) hvor så databasen henter alt tilbehør og man så kan klikke/markere det tilbehør der passer på den model man er gået ind på. I databasen skal det skrives sådan her:
Jeg antager at din tabel der binder tilbehor og produkter sammen hedder produkt_tilbehor. Dette er helt utestet, jeg har antaget feltnavne forskellige steder ;)
Tilbehør til produkt:
<?php
$pid = $_GET['pid']; // Hent lidt info ud om produktet fra mysql
$sql = "SELECT t.*, COALESCE(pt.p_id,0) AS pid FROM tilbehor AS t LEFT OUTER JOIN produkt_tilbehor AS pt ON t.t_id = pt.t_id WHERE pt.p_id = $pid"; $qh = mysql_query( $sql ) or die( mysql_error() ); $tilbehor = array(); while ( $row = mysql_fetch_assoc( $qh ) ) { $tilbehor[] = $row; }
?> <form method="post" action="gem_produkt_tilbehor.php"> <input type="hidden" name="pid" value="<? echo $_GET['pid'] ?>"> Skriv lidt info om produktet ud her...<br> <select name="tid[]" multiple="multiple" rows="5"> <?
Jeg forstår ikke helt din start ($sql = "SELECT t.*, COALESCE(pt.p_id,0) ...) hvor kommer t. fra ....
Havde bare tænkt mig at jeg ville indlæse alle produkter fra tilbehør, derefter skal man så kunne vælge X antal tilbehør som passer til det produkt man har åbnet, og når man er færdig skal man så klikke på ok, og der skal kaldes op til tabellen "har", som har to attributer, t_id og p_id.
Når tilbehøret indlæses skal den tjekke om der allerede er tilknyttet noget tilbehør til produktet, og disse skal være markeret
Så kan du tilgå felter i tilbehor som t.feltnavn - nyttigt når du skal lave joins :)
Prøv min kode, den gør det som jeg tror du vil - Den henter alt tilbehør og markerer det der findes i forvejen, og så kan du trykke CTRL eller SHIFT ned mens du vælger flere (som alm. listboxe i andre windowsapps)
Ok, men har stadig lidt problemer... har ændret variablerne til mine (det er ikke produkt mere men model, så har ændre alle p'er til m'er).. Men jeg får en fejl: Unknown column 'mt.model_id' in 'field list'
Her er koden: <?php include_once("inc/session.php"); require_once("inc/connection_inc.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test</title> </head> <body> <?php $conn = connection(); $mid = $_GET['id']; $sql = "SELECT t.*, COALESCE(mt.model_id,0) AS model_id FROM tilbehor AS t LEFT OUTER JOIN har AS pt ON t.tilbehor_id = mt.tilbehor_id WHERE mt.model_id = $mid"; $qh = mysql_query( $sql ) or die( mysql_error() ); $tilbehor = array(); while ( $row = mysql_fetch_assoc( $qh ) ) { $tilbehor[] = $row; } ?> <form method="post" action="gem_produkt_tilbehor.php"> <input type="hidden" name="model_id" value="<? echo $_GET['id'] ?>"> Skriv lidt info om produktet ud her...<br> <select name="tid[]" multiple="multiple" rows="5"> <? foreach ( $tilbehor as $row ) { echo "<option value=\"$row[t_id]\""; if ( $row['model_id'] != 0 ) { echo " selected=\"selected\""; } echo ">$row[tilbehorsnavn]</option>"; } ?> </select> * Hold shift nede mens du vælger tilbehør<br> <input type="submit" name="sbmit" value="Gem"> </form> og så gem_produkt_tilbehor.php: <?php if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { if ( count( $_POST['tid'] ) == 0 ) { $sql = "DELETE FROM har WHERE model_id = " . $_POST['model_id']; mysql_query( $sql ) or die( mysql_error() ); } else { foreach ( $_POST['tid'] as $id ) { $sql = "REPLACE INTO har (model_id, tilbehor_id) VALUES (" . $_POST['model_id'] . "," . $id . ")"; mysql_query( $sql ) or die( mysql_error() ); } } }
nej den kode jeg prøvede at demonstrere var til at vise én produkt, hvor man så fik en select-liste hvor den der passer til er markerede, og hvor du kan markere flere for også at tilknytte dem...
Ja beklager, har ikke lige været tip top, du har endda skåret det ud i pap...
Men nu hvor jeg er på rette spor igen, så viser den kun det tilbehør som allerede er knyttet til modellen ellers er den blank hvis der ikke er knyttet noget til... Vil jo gerne have hele listen ud, og så skal tilbehøret som allerede er knyttet til være markeret
Haha... flot, det er med min storebrors profil jeg har svaret. Han må åbenbart have være på i mellemtiden.
Får denne fejl: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
Det er hos $id(tid) den er galt, den kommer ikke med nogen værdi...
DELETE FROM har WHERE model_id = 1 REPLACE INTO har (model_id, tilbehor_id) VALUES (1,)You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
Okay, den burde jeg selv havde set, men det spiller...
Tak for hjælpen, og din tålmodighed.
En sidste ting, vil du forklare denne: $sql = "SELECT t.*, COALESCE(mt.model_id,0) AS model_id FROM tilbehor AS t LEFT OUTER JOIN har AS pt ON t.tilbehor_id = mt.tilbehor_id WHERE mt.model_id = $mid";
okay det spiller alligevel ikke helt... Fx hvis jeg nu går ind på en model med et andet id(2), er tilbehøret fra det første id markeret selvom det andet id ikke har noget tilbehør tilknyttet, og ligeledes, hvis jeg tilknytter noget af det samme tilbehør til det id 2 som det id 1 også har kommer der "duplicates", og alt tilbehør der bare er tilknyttet et eller andet id bliver vist
COALESCE vælger den først i en liste som IKKE er NULL ;)
I vores tilfælde, hvor vi laver et LEFT OUTER JOIN, kan mt.model_id godt være NULL, derfor selecter jeg den med COALESCE, så hvis den er NULL returnerer den i stedet 0 :)
Hvis den så mangler noget tilbehør der burde være selected så lav:
$sql = "SELECT t.*, COALESCE(mt.model_id,0) AS model_id FROM tilbehor AS t LEFT OUTER JOIN har AS pt ON t.tilbehor_id = mt.tilbehor_id WHERE mt.model_id = $mid";
om til:
$sql = "SELECT t.*, COALESCE(mt.model_id,0) AS model_id FROM tilbehor AS t LEFT OUTER JOIN har AS pt ON t.tilbehor_id = mt.tilbehor_id WHERE mt.model_id = $mid ORDER BY model_id DESC";
Den første gør det næsten, men her selecter den kun tilbehør til en model dvs. hvis model 1 har tilbehor 1 kan tilbehor 1 ikke være selected ved andre modeller.
Anden del giver :Unknown column 'mt.model_id' in 'field list'
$sql = "SELECT t.*, COALESCE(mt.model_id,0) AS mid FROM tilbehor AS t LEFT OUTER JOIN har AS mt ON t.tilbehor_id = mt.tilbehor_id AND mt.model_id = $mid";
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.