17. august 2010 - 22:14Der er
76 kommentarer og 1 løsning
Hjælp til sammenkædning
Hejsa alle i php folkens
Jeg har et spørgsmål som jeg håber I kan hjælpe med.
Jeg har to tabeller som jeg skal have koblet sammen.
Men i den ene tabel bliver genereret et galleri alt efter hvor mange billeder der uploades. Galleriet er et lightbox galleri hvor der uploades et stort billede og scriptet skalerer så billedet ned til thumbnail og smider det i en anden mappe, og der kan desuden tilføjes en caption (billedtekst)
Så her skal der kunne uploades f.eks. 21 billeder som alle skal hæftes ind i det samme galleri DEN DEL MANGLER JEG OGSÅ EN LØSNING PÅ
Desuden har jeg en anden tabel, som pt. indeholder en id, overskrift, brødtekst
Overskriften og brødteksten skal så kunne kobles på førnævnte galleri som f.eks. er på 21 billeder, men der skal kun laves én overskrift pr. galleri DET MANGLER JEG HJÆLP TIL
Jeg har følgende: /////Galleri upload scriptet <?php //Dette script laver en thumb: $file=$_FILES['file']['name']; $dir="../galleri"; $thumbdir="$dir/thumbs";
// If files sætning if($_FILES[file]['name']!=""){ $filename=$dir."/".$file; $thumb=$thumbdir."/thumb_{$file}"; move_uploaded_file($_FILES['file']['tmp_name'], $filename);
// Set de nye dimensiooner på thumben list($width, $height) = getimagesize($filename); $new_height = 100; $division = $height / $new_height; $new_width = $width / $division;
// Indsæt i DB $data_sql=sprintf("INSERT INTO j_galleri (caption, stortpic, lillepic) VALUES ('%s', '%s', '%s')", $caption, $file, "thumb_{$file}"); mysql_select_db("TESTER_GALLERI", $db); $Result1 = mysql_query($data_sql, $db) or die(mysql_error()); echo "Billedet uploadet og info lagt i databasen"; } ?>
Det er korrekt at jeg skal gerne have kædet de to tabellers indhold sammen på en eller anden facon, men er hverken stærk i Group by eller Joins - og jeg formoder det er det vi er ude i til dette.
Jeg har det her galleri, hvor administrator skal kunne lægge nye billeder op. Lad os sige at administratoren har en billedgruppe på 21 eller 34 billeder som alle skal høre under samme kategori, som f.eks. kunne være "Tur til Dubai". Alle disse billeder uploades og der genereres en thumb og der kan skrives en caption til hvert billede under upload processen.
Når det så er færdigt, skal der kobles en overskrift på dette 34 billeders galleri som så naturligt ville være "Tur til Dubai".
Denne overskrift kommer fra en anden tabel, og skal så kobles på mit galleri med de 34 billeder eller et andet antal.
Så det jeg efterlyser er lidt guide i den retning, som jeg håber du nu forstår lidt bedre.
så du har 'galleries' som indeholder alle billederne og 'galleryheader' som indeholder overskrifterne til kategorierne/mapperne?
du er nødt til at have en relation mellem de to tabeller, det almindelige vil være at bruge id'et fra 'galleryheader' og have ved hvert billede i 'galleries'.
du kiunne så lave en side hvor du opretter 'gallerier' som er 'galleryheaders', og når du uploader billederne vælger du først galleriet, så du kan tage dette id med til tabellen 'galleries'.
Det lyder som noget Join, og det er netop det jeg mangler noget hjælp til, da jeg har forsøgt mig lidt frem men ikke kan finde ud af det.
Det jeg har er netop det som du beskriver her og jeg har postet mine DB dumps længere oppe.
Min slut tanke er at jeg vil gøre følgende: På siden galleriliste.php vil jeg vise en liste af alle de gallerier jeg har. Denne liste skal genereres udfra tabellen "galleries" og "galleryheader". Så fra brugerens perspektiv vil han/hun se en liste af gallerier og vælger så f.eks. at klikke det galleri der har titlen "Tur til Dubai"
Ved klik på dette galleri, vises man over på en helt ny side som viser alle billeder i det aktuelle lightbox galleri og som har en overskrift fra min "galleryheader"
Men jeg kan ikke gennemskue sammenhængen imellem udtrækket fra DB og hvordan jeg skal få vist de forskellige lister/visninger.
<?php $query = "SELECT * FROM `galleryheader` LEFT JOIN `galleries` ON galleryheader.id=galleries.id"; $result = mysql_query($query) or die("MySQL Query fejl");
Som I kan se er noget af det udkommenteret. Men den ene echo der IKKE er udkommenteret virker heller ikke.
Det du nævner her Danco, betyder det at jeg skal tilføje endnu en række i mine tabeller som kunne hedder stick_id og så kunne jeg lave noget join på det?
Den her stick_id skal den være INT ? Skal den have andre attributter ?
du har id i begge tabeller og begge har autoincrement, hvilket er fint nok, så du har en unik id på alle dine linjer. men du har ikke et felt i galleries som indeholder id'et på galleryheaderen, du kunne kalde den gh_id eller noget, det er så du har en relation mellem de to tabeller, ellers har du ingen anelse om hvilke billeder der hører til hvilke gallerier.
Det er den forkerte tabel du har sat den ind på. Den tabel hvor du holder dine billeder skal du indsætte din gh_id attribut. Desuden er det så pænt at du holder gh_id i samme domæne som galleri_header's id: dvs int(11) not null auto_increment.
CREATE TABLE IF NOT EXISTS galleries ( id int(11) not null auto_increment, path varchar(200) not null, comment mediumtext not null, gh_id int(11) not null )ENGINE=MyISAM;
Sådan noget lign. eller hvordan din galleries tabel nu engang ser ud. På den måde får en reference fra dit billede til din galleryheader tabel, som du skal bruge en din query.
Splazz, jeg har nu prøvet at indsætte den php kode du har smidt over til mig. Jeg forstår dog ikke følgende: SELECT g.caption og senere g.file_path, samt h.overskrift...
Hvor finder du de g og h henne?
Jeg har indsat følgende men opnår en MySql Error fejl
<?php require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM galleries AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die("MySQL Query fejl");
galleries AS g laver et alias, så du kan skrive g i stedet for galleries. og når du så skriver g.caption, fortæller du at du vil have fat i caption-feltet i galleries (g) tabellen.
prøv lige at ret:
$result = mysql_query($query) or die("MySQL Query fejl");
til:
$result = mysql_query($query) or die(mysql_error());
NU har jeg rettet nogle små ting til, så nu står der følgende: <?php //$query = "SELECT * FROM `galleryheader` LEFT JOIN `gallery` ON galleryheader.id=galleries.id"; require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error());
?> Hvad med mine "echos" skal de også hedde g.caption og så videre...?
Lige nu får jeg ikke noget ud. Siden er bare helt blank og hvis jeg får vis source code står der ikke noget brugbart? Til gengæld er mysql fejlen også væk :0)
Jeg har nu en kode der ser sådan ud, men der kommer stadig intet ud på selve siden - den er stadig blank? -------------------------- <?php require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); mysql_num_rows($result); while ($row = mysql_fetch_assoc($result)) { echo $row['overskrift'] . "<br />". $row['bread'] . "<img src='galleries/thumb/g1.gif' title='$overskrift' /><br /><br />";
Min kode ser sådan her ud: __________________________________ <?php require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); echo "mysql_num_rows($result)"; while ($row = mysql_fetch_assoc($result)) { echo $row['overskrift'] . "<br />". $row['bread'] . "<img src='galleries/thumb/g1.gif' title='$overskrift' /><br /><br />";
Det $galleri er noget du har skrevet i indlægget som er her: fre. d. 20. august 2010 kl. 08:34:13| #13
Jeg tror problemet er at der ikke er nogen "muse-handling" som skulle føre til at der kommer et output.
Ideen her var bare at få "echo´et" noget ud fra begge tabeller, men jeg har jo ikke angivet på nogen måde at en muse-handling skulle føre til dette, da jeg er usikker på hvordan denne handling streng-mæssigt ville se ud?
Kunne det være noget a la dette, eller hvordan ville løsningen se ud ? ----------------------------- <?php require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); echo mysql_num_rows($result); while ($row = mysql_fetch_assoc($result))
jeg går ud fra at du har flere gallerier siden det skal styres via database?
så må du have en side hvor de forskellige gallerier listes og man kan vælge hvilket man vil se, f.eks.
<a href="vis_galleri.php?id=16">Billeder fra Oda's 130 års føsdag</a> <a href="vis_galleri.php?id=27">Billeder fra Bebses barnedåb</a> osv.
så får du $id med i din adresselinje som kan hentes med $GET['id'], som du kan bruge i din query, du skal bare huske at undersøge at variablen indeholder det du ønsker og ikke er farlig...
Jeg forventer at have to sider: - galleriliste.php (her kommer alle gallerier i en liste visning) - gallerivisning.php (her ender man når har valgt at klikke på et galleri på forrige side)
Du skriver <a href="vis_galleri.php?id=16">Billeder fra Oda's 130 års føsdag</a> Men hvordan ville den a href se ud: echo "<a href='vis_galleri.php?id=id'>Billeder fra Oda's 130 års føsdag</a>";
når du laver din galleriliste henter du dit data fra galleryheader-tabellen og laver den liste som en tabel eller noget. her skal du så hente id'et med ud fra tabellen og bruge i dit link...
Men jeg skal lige have forklaret en ting lidt grundigt her.
Jeg uploader et billede til en mappe i min struktur og under selve upload processen vil php koden selv generere et thumbnail og jeg får mulighed for at skrive en caption (billedtekst) ind. Se indlægget Oprettet tir. d. 17. august 2010 kl. 22:14:49 .
Når jeg så får uploadet, lade os sige 34 billeder som udgør ét galleri, så vil der gå noget tid førend jeg uploader endnu et galleri. Når dette sker kunne det nye galleri f.eks. bestå af 23 billeder, men da det hele jo uploades til de samme mapper hvordan finder jeg så en sammenhæng mellem de uploaded billeder og min galleryheader som jo "skriver" både en overskrift og en brødtekst ud.
Jeg kan ikke helt se koblingen og derfor kan jeg heller ikke nå frem til en endelig forståelse og vil gerne have dette forklaret på baggrund af det vi nu har lavet?
Kan du forklare mig det Splazz?
Jeg er mere end villig til at hæve pointene da jeg gerne vil lære dette og samtidig have en forståelse for det komplette output.
det er det du skal bruge gh_id til - det er det samme tal som id i galleryheader. lad os sige at du har et galleri med 17 billeder der hedder 'Billeder fra Hawaii - Maj 2009', som ligger i din galleryheader sådan her:
id: 2 | overskrift: Billeder fra Hawaii - Maj 2009 | bread: De fedeste billeder fra vores verie på Hawaii bla bla bla...
gh_id skal du jo sætte når du uploader billederne - det er jo der du opretter rækkerne i tabellen. når du uploader billeder skal du vælge hvilket galleri de tilhører (og på den måde få id'et over i gh_id
Så jeg skal sætte et skjult form felt som hedder gh_id, som så sætter en auto increment på hver gang.
Men så forstår jeg ikke lige....
Hvert billede jeg uploader bliver jo uploadet et af gangen og hvis jeg uploader billed1.jpg og giver det en caption så får det jo dels en auto incrementet id og en auto incrementet gh_id hver gang?
Så hvis jeg har har 57 billeder der er uploadet har de jo hver et id og et gh_id, som har samme nummer ?
// Indsæt i DB $data_sql=sprintf("INSERT INTO j_galleri (caption, stortpic, lillepic) VALUES ('%s', '%s', '%s')", $caption, $file, "thumb_{$file}"); mysql_select_db("TESTER_GALLERI", $db); $Result1 = mysql_query($data_sql, $db) or die(mysql_error()); echo "Billedet uploadet og info lagt i databasen"; } ?>
gh_id skal ikke auto_incrementes (ikke i galleries), det er id'et på rækken i galleryheader og den bliver jo incrementet dér.
du kunne jo lave en select-box der lister de gallerier der nu engang er i galleryheader hvor du så kan vælge hvilket galleri billedet skal gemmes under / høre til.
grunden til at den er 0 er at du ikke har sat den til id'et på det galleri billedet tilhører, men du kan jo rette den i din phpmyadmin, på dem du har lavet.
nu kan jeg ikke lige gennemskue dine kryptiske strenge i galleryheader, så jeg kan ikke se hvad gh_id skal være i dine to rækker i 'gallery', men lad os sige at den skal være 1, så skal dit link jo bare være:
<a href="vis_galleri.php?id=1">Billeder fra Oda's 130 års føsdag</a>
Nu ser min DB for "gallery" sådan ud: CREATE TABLE IF NOT EXISTS `gallery` ( `id` int(11) NOT NULL AUTO_INCREMENT, `gh_id` int(11) NOT NULL, `caption` varchar(255) COLLATE utf8_bin DEFAULT NULL, `file_path` varchar(255) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;
***php*** <?php require_once ('strings.php'); $query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); echo mysql_num_rows($result); while ($row = mysql_fetch_assoc($result))
Nu ser min php sådan ud: ________________________________ <?php require_once ('strings.php'); if(isset($_GET['id']) && !empty($_GET['id']) && is_nummeric($_GET['id'])){ $id = $_GET['id']; }
$query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); echo mysql_num_rows($result); while ($row = mysql_fetch_assoc($result))
$query = "SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"; $result = mysql_query($query) or die(mysql_error()); echo mysql_num_rows($result); while ($row = mysql_fetch_assoc($result))
Hvis jeg gør følgende, får jeg både vist nogle thumbnails (gallery) og nogle overskrifter samt bread (galleryheader) og på mine thumbnails får jeg også sat en title tekst på i form af min Caption (gallery)
Men min link over næste side, hvor alle billeder skal vises virker ikke da der ikke kommer noget ID på mit link? Jeg ved ikke helt hvorfor noget af det lykkes og andet ikke...
Nu får jeg så følgende ud, inden jeg klikker på linket: - overskrift og bread fra ID 1 (galleryheader), samt caption og thumb fra ID 1 (gallery) - overskrift og bread fra ID 2 (galleryheader), samt caption og thumb fra ID 2 (gallery)
Nu er spørgsmålet så....
Er dette korrekt ?
For hvis jeg mouse-over på de to klik-links får jeg henholdsvis ID 1 og ID 2
Jeg kan stadig ikke helt se logikken, er det ikke bare en liste som numerisk dannes og hvordan skal min php så se ud på den side hvor linket viser hen for at fange henholdsvis indhold fra både GALLERY og GALLERYHEADER med ID 1 ? -----------------------
Min galleryheader ser sådan ud: ----------- CREATE TABLE IF NOT EXISTS `galleryheader` ( `id` int(11) NOT NULL AUTO_INCREMENT, `overskrift` tinytext COLLATE utf8_bin NOT NULL, `bread` text COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;
Jamen når jeg kommer over på den side hvor jeg egentlig skal have vist alle billederne i det pågældende galleri, viser den igen alle sammen ?
Koden på visningssiden er sådan pt. er det forkert? ----------------------- <?php require_once ('strings.php'); $foresp = mysql_query("SELECT * FROM `galleryheader` INNER JOIN `gallery` ON galleryheader.id=gallery.id"); $id = $_GET['id']; echo "ID:".$id. "<br />"; while($row = mysql_fetch_assoc($foresp))
Hej igen På den side hvor jeg ankommer ser min php sådan ud: ----------------------------- <?php require_once ('strings.php'); $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"); $id = $_GET['id']; echo "ID:".$id. "<br />"; while($row = mysql_fetch_assoc($foresp))
require_once ('strings.php'); $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$galleri'"); $id = $_GET['id']; echo "ID:".$id. "<br />"; while($row = mysql_fetch_assoc($foresp))
til:
require_once ('strings.php'); $id = $_GET['id']; $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$id'"); while($row = mysql_fetch_assoc($foresp))
Det hjalp da gevaldigt, nu er der bare det problem at min "overskrift" og "bread" bliver echo´et ud flere gange.
Det er jo meningen at det output kun skal komme én gang fra min galleryheader...
PHP ser sådan ud nu: --------------------------- <?php require_once ('strings.php'); $id = $_GET['id']; $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$id'"); while($row = mysql_fetch_assoc($foresp))
du kan jo lave en variabel og sætte den til true inden din while. i din while laver du en if-sætning, som tjekker om variablen er sat til true - hvis den er udskriver du overskrift og brødtekst og sætter variablen til false.
Jeg har nu lavet dette, men det er stadig ikke rigtigt for nu skriver den kun indholdet ud én gang og det gælder både overskrift, bread og billeder, så noget er galt....
---------------------------------- <?php require_once ('strings.php'); $id = $_GET['id']; $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$id'"); $myTest = TRUE; while($row = mysql_fetch_assoc($foresp))
<?php require_once ('strings.php'); $id = $_GET['id']; $foresp = mysql_query("SELECT g.caption, g.file_path, h.overskrift, h.bread FROM gallery AS g INNER JOIN galleryheader AS h ON g.gh_id=h.id WHERE h.id='$id'"); $myTest = TRUE; while($row = mysql_fetch_assoc($foresp))
nej det gør ikke noget carsten, de point betyder ikke ret meget for mig...
selv tak, og tak for point :)
Synes godt om
Ny brugerNybegynder
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.