10. august 2010 - 02:20Der er
59 kommentarer og 1 løsning
Vælg dele af data fra database på forskellige måder.
Der er lidt flere opgaver i en her.
Jeg har en database hvor jeg har følgende felter. Ved ikke hvordan dette kommer til at se ud: [id][type] -1-|-1,2,3- -2-|-2,3,4- -3-|-1,2,4- -4-|--1,3--
Jeg vil gerne have at jeg kan lave en liste med de forskellige typer der er. I dette tilfælde:
[Typer] 1 2 3 4
Jeg vil også gerne have så hvis man trykker på et af tallene, på den liste jeg lige har lavet. Så kommer man ind på en side som henter det frem der indholder type 4
Skal bare have hjælp til at lave linket og den mysql_query der skal bruges på næste side.
[id][Type] -2-|-2,3,4- -3-|-1,2,4-
Dernæst vil jeg gerne have at jeg kan lave en tæller der indholder fx type 4
Der er (2) der indholder type 4
3 små opgaver som i princippet er 1. Men vil gerne adskille dem så jeg kan se hvordan man løser hver enkel opgave.
det ville være en del nemmere hvis du havde flere tabeller hvor du "fordeler" indholdet og laver relationer imellem dem - er det muligt for dig at ændre i din struktur?
Jeg vil mene at det bliver nemmere at behandle data, og lave querys hvis du spreder dine types ud på deres egne celler, enten ved at tillade at din ID gantages, elle ved at tilføje en ekstra tabel.
$type_res = mysql_query(SELECT DISTINCT type FROM tabel) while($type_row = mysql_fetch_assoc($type_res)) { echo "<a href=\"?type=".$type_row['type']."\">".$type_row['type']."</a>" //dette er din liste med link af typer }
resultater af type x:
$id_res = mysql_query(SELECT id FROM tabel WHERE type = '$_GET["type"]'); echo "ID'er af typen ".$_GET['type'].":"; while($id_row = mysql_fetch_assoc($result)) { echo $id_row['id']."<br />"; //liste af resultater af typen fra tidligere links }
Antal der indeholder type x kan laves med:
$result = mysql_query(SELECT type FROM tabel WHERE type = '$_GET["type"]'); $type_num = mysql_num_rows($result);
echo "ID'er af typen ".$_GET['type'].":"; $id_res = mysql_query(SELECT id FROM tabel WHERE type = '$_GET["type"]'); while($id_row = mysql_fetch_assoc($id_res)){ echo $id_row['id']."<br />"; //liste af resultater af typen fra tidligere links }
Der er sikkert flere, så det fungerer nok ikke lige første gang...
Synes godt om
Slettet bruger
10. august 2010 - 11:53#4
Jeps det ved jeg at det er meget nemmere. Men nu er det desværre en gammel database hvor der skal laves noget nyt spændene.
Der er kun 2542 rækker med mellem 3 og 7 så kaldte typer i. Så det er ikke så let lige at skulle til at sidde og smide det i en ny database.
Synes godt om
Slettet bruger
10. august 2010 - 12:12#5
Jeg havde sådan set bare lavet en øve database kun med ID og Type.
Det kommer jo til at tage en krig at skulle lave det hele om. Hele systemmet der sender data'en skal laves om så der bliver mindst 4 databaser. Da der sådan set er 3 coloner det skal laves i. Og så skal de 2542 indlæg laves om manuelt.
Men hvis det ikke kan laves så må jeg jo prøve det.
Så har jeg bare et lille spørgsmål.
Hvis du har et input felt. Og data'en i det indputs felt så bliver lavet sådan: type1, type2, type3
Kan man så godt få den til at sende hver type til sin egen celle i databasen?
På samme måde kan du lave et PHP-script der laver din DB om for dig, men det kan måske godt komme til at tage lidt tid.
Det kan også sagtens lade sig gøre at bruge din DB som den er, men dine queries bliver nok lidt bøvlede, eller også skal du bruge PHP til at sortere resultaterne.
Men hvis det er fordi at du skal bruge dine gamle DB resultater frem i tiden, vil jeg klart anbefale at konvertere dem.
som du kan bruge til at lave dit input om til en array, som du så bare kan loope igennem, mens du insætter værdierne.
På samme måde kan du lave et PHP-script der laver din DB om for dig, men det kan måske godt komme til at tage lidt tid.
Det kan også sagtens lade sig gøre at bruge din DB som den er, men dine queries bliver nok lidt bøvlede, eller også skal du bruge PHP til at sortere resultaterne.
Men hvis det er fordi at du skal bruge dine gamle DB resultater frem i tiden, vil jeg klart anbefale at konvertere dem.
Synes godt om
Slettet bruger
10. august 2010 - 12:33#8
Var også lige ved at skulle skrive om man ikke kunne lave et script det hentede frem og lagde ud i en ny database.
Er det noget nogen af jer kan hjælpe mig med? På den måde kan jeg nøjes med at lukke siden i et par timer en nat.
Så oprette jeg lige et nyt spørgsmål til det.
Synes godt om
Slettet bruger
10. august 2010 - 12:54#9
Sådan holde lige denne åben til det andet er på plads ggxdg's forslag skal jo nok bruges derefter.
echo "ID'er af typen ".$_GET['type'].":<br />"; $id_res = mysql_query(SELECT id_ref FROM typetabel WHERE type = '$_GET["type"]'); while($id_row = mysql_fetch_assoc($id_res)){ echo $id_row['id']."<br />"; }
$result = mysql_query(SELECT id_ref FROM typetabel WHERE type = '$_GET["type"]'); $type_num = mysql_num_rows($result); echo "Der er ".$type_num." resultater af typen ".$_GET["type"].".<br />";
Tilpassede lige mit ovenstående eksempel og smed den over i den anden tråd.
Synes godt om
Slettet bruger
11. august 2010 - 02:46#13
Nu gør dette jo opgaven lidt anderledes.
Jeg har hoved databasen. Kalder vi (Main)
Og så har jeg 3 databaser som har en reference til hoved databasen De ene kalder vi (Type) Her er flere typer til det et ID i main databasen
Ex er der et indlæg i main databsen hvor ID=3 i Type databasen er der så følgende [Type][refid] --1--|---2--- --2--|---2--- --1--|---3--- --2--|---3--- --4--|---3--- --2--|---4--- --4--|---4--- Så der er en type 1, 2 og 4 der har ref til indlægget i main med ID=3
Så nu er det jeg skal bruge: (Igen opdelt i opgaver, som gerne må løses hver for sig, så jeg kan se hvordan man gør, ved hver enkel.)
Opgave 1
En database der Som laver en liste med alle de forskellige typer der er i databasen type. Og der er jo flere der går igen så de skal jo kun nævnes en gang. Sådan en liste skal jeg have lavet.
Opgave 2
Nu skal 2 databaser blandes sammen. Jeg skal have lavet et link på listen som blev lavet før. Linket skal så åben en ny side, som vi bare kalder side2.php. Denne side skal så indeholde en liste med alle de titler i Main som har en reference til den type der er valgt.
Jeg er ikke verdens bedste til at forklare sådanne noget. Så håber det er forståeligt. Ellers bare spørg.
Synes godt om
Slettet bruger
11. august 2010 - 03:20#14
Opgave 1 løst:
<? include("config.php");
$type_res = mysql_query("SELECT DISTINCT type FROM type"); while($type_row = mysql_fetch_assoc($type_res)) { echo "<a href=\"?type=".$type_row['type']."\">".$type_row['type']."</a><br>"; //dette er din liste med link af typer }
?>
Jeg har leget lidt med det andet du postede. Men kan ikke få det til at virke med at den skal vise antal indlæg der er med hver type Lige nu kommer typerne lodret og jeg vil gerne have antallet i en () ved siden af. Fx: 1 (10) 2 (4) 3 (2) 4 (7)
næste problem er så at indsætte det rigtige link. den skal hoppe til side2.php Og vise en liste med alle de titler fra Main databasen som har referencen til typen.
Det må jo være noget med where id = idref id i main, og idref i type databasen. Men synes ikke jeg kan få det til at virke.
Synes godt om
Slettet bruger
11. august 2010 - 03:59#15
Nu er det på tide jeg kommer i seng.... har prøvet lidt at få antallet til at blive vist:
[dv] <? include("config.php");
$sql = mysql_query("SELECT COUNT(*) AS antal FROM type WHERE type='$_GET['type']'"); $row = mysql_fetch_array($sql);
$type_res = mysql_query("SELECT DISTINCT type FROM type"); while($type_row = mysql_fetch_assoc($type_res))
{ echo "<a href=\"?type=".$type_row['type']."\">".$type_row['type']."</a> ($row[antal])<br>"; //dette er din liste med link af typer }
?> [/div]
Kan bare ikke få det rigtigt sat ind i denne del: WHERE type='$_GET['type']'
Hvis jeg manuelt skriver 1 så virker det. Men så viser det antal der er af 1'er i databasen. Men det gør den jo så selvf ud for allesammen. Men jeg prøvede bare for at teste.
Jeg har prøvet med WHERE type='$_GET['type']' WHERE type='.$type_row['type'].' WHERE type=.$type_row['type']. WHERE type=$type_row['type'] Og mange mange flere :P
$id_res = mysql_query("SELECT DISTINCT type FROM type"); while($id_row = mysql_fetch_assoc($id_res)) { $num_res = mysql_query("SELECT type FROM type WHERE type = '$id_row[type]'"); $type_num = mysql_num_rows($num_res); echo "<a href=\"side2.php?refid=".$id_row['refid']."\">".$id_row['type']." (".$type_num.")</a><br />"; }
?>
Fejlen skulle gerne være fremhævet med fed skrift. Det er den linje der den brokker sig over.
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in list.php on line 8
"type" smed jeg i parentes fordi jeg gerne ville outputte refid til linket, men hvis man siger "DISTINCT type, refid" vil den lave et output så snart der er en forskel i den ene af dem, hvilket giver en hulens masse resultater.
Jeg kender ikke så meget til DISTINCT, men den outputter kun unikke resultater, hvilket er smart nok.
Man kan nok også bruge GROUP BY (læste vist nok et sted at det er mere effektivt end DISTINCT, da den ikke løber alle resultater igennem, eller noget i den retning):
$id_res = mysql_query("SELECT type FROM type GROUP BY type");
Set i retrospekt vil min tidligere query ikke ouputte det der var meningen m.h.t. refid, jeg aner ikke lige hvad jeg har tænkt da jeg lavede den. Jeg har jo tydeligtvis forsøgt at få en enkel ID ud af det hele, men selvfølgelig er det typen der skal linkes videre, da der er flere ID'er som deler de forskellige typer.
Fungerer optællingen nu?
<? include("config.php");
$type_que = "SELECT * FROM type INNER JOIN Main ON type.refid = Main.id WHERE type.type = '".$_GET['type']."'"; $type_res = mysql_query($type_que); while($type_row = mysql_fetch_assoc($type_res))
{ echo ".$type_row['title']."<br>"; } ?>
Jeg håber ovenstående fungerer som Side2.php, det er ret lang tid siden jeg har arbejdet med joins.
Synes godt om
Slettet bruger
11. august 2010 - 15:59#25
$type_que = "SELECT * FROM type INNER JOIN Main ON type.refid = Main.id WHERE type.type = '".$_GET['type']."'";
Puha det er noget jeg aldrig har set før.
Den skal jeg lige forstå.
Select * From type --> her er du inde i databasen type Inner join main --> her går du ind i databasen main ON type.refid = main.id --> her laver du et eller andet med refid fra type og id fra main. WHERE type.type = '".$_GET['type']."' --> her skal type i databasen type være = get type som du henter fra databasen type?
Det virker ikke. Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in side2.php on line 9
linje 9 er denne: echo ".$type_row['title']."<br>";
$type_que = "SELECT * FROM type INNER JOIN Main ON type.refid = Main.id WHERE type.type = '".$_GET['type']."'"; $type_res = mysql_query($type_que); while($type_row = mysql_fetch_assoc($type_res))
og ja... din gennemgang af scriptet er helt korrekt...
INNER JOIN samler 2 tabeller.
ON sammenligner felter fra begge tabeller som skal være ens. Så vi sammenligner "refid" fra "type"-tabellen, med "id" fra "Main"-tabellen, de steder det passer sammen, samles.
WHERE kender du nok :)
Som sagt, det er lang tid siden jeg har rodet med joins, så det er ikke sikkert den lige fungerer i første forsøg.
Gad vide om det er min Host der har noget med det at gøre. Min FTP adgang har heller ikke været helt stabil i men den har da kørt godt de sidste 1½ time.
Synes godt om
Slettet bruger
12. august 2010 - 03:09#54
Hehe... Fandt en fejl. De sidste par gange jeg smed mine fil op var den røget i forkerte mappe. Så det var derfor, at der var så store problemer tidligere.
Men bare mærkelig, at det nye jeg lavede så stadig ikke virker. Henviser til #52
#51 _GET har ikke noget med din database at gøre, den fanger bare variblen du sætter i adressen, så hvis den bliver fanget som den skal, så er det scriptet der skal arbejdes på.
Synes godt om
Slettet bruger
12. august 2010 - 12:27#57
Ahhhhhh. Se jeg havde jo rettet linket på et tidspunkt. Det var jo der fejlen så lå. jeg havde kaldt den ?side= Så det vil sige at _GET henter alt ned efter =
Super smid et svar :) og 1000, 1000 tak for tålmodigheden og hjælpen.
Men hvis du bruger $_GET og $_POST variabler til dine querys er det en god idé at lave tiltag så du forhindrer SQL-INJECTION.
Der er mange funktioner som kan bruges til at undgå injection, men hvad du selv syntes bedst om og alt efter hvor sikkert du vil have det, så må du selv lige vælge :P
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.