Slettet bruger
10. august 2010 - 02:20
Der 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.
10. august 2010 - 12:27
#6
Ja...
Der er en PHP-funktion der hedder explode()
$pieces = explode(", ", $_POST['input']);)
http://dk.php.net/manual/en/function.explode.php[/div] 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.
10. august 2010 - 12:29
#7
Jeg prøver lige igen - sorry
Ja...
Der er en PHP-funktion der hedder explode()
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.
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.
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.
10. august 2010 - 13:30
#10
$rb_res = mysql_query(SELECT * FROM tabel);
while ($rb_row = mysql_fetch_assoc($rb_res))
{
if(!mysql_query(INSERT INTO indekstabel (navn) VALUES('$rb_row[navn]')))
{
die('Error: ' . mysql_error());
} else {
$id_ref = mysql_insert_id();
$rb_ex_arr = explode(",", $rb_row['type']);
foreach($rb_ex_arr as $rb_ex_val) {
if(!mysql_query(INSERT INTO typetabel (id_ref, type) VALUES('$id_ref', '$rb_ex_val')))
{
die('Error: ' . mysql_error());
}
}
}
}
ovenstående er et meget hurtigt forslag (sikkert fuld af fejl) til hvordan du kan lave et script til at konvertere din database
indekstabel:
[id][navn]
CREATE TABLE indekstabel (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
navn CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
typetabel:
[id_ref][type]
CREATE TABLE typetabel (
id_ref MEDIUMINT NOT NULL,
type TINYINT NOT NULL,
PRIMARY KEY (id_ref)
);
Ovenstående danner 2 tabeller, hvilket gør mine tidligere eksempler ubrugelige.
10. august 2010 - 13:47
#11
Mine tidligere eksempler var nemme at skrive om, hvis du ikke skal bruge navn eller noget fra "indekstabellen"
echo "Typer:<br />
$type_res = mysql_query(SELECT DISTINCT id_ref,type FROM typetabel);
while($type_row = mysql_fetch_assoc($type_res)){
echo "<a href=\"?type=".$type_row['type']."\">".$type_row['type']."</a><br />"
}
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 />";
10. august 2010 - 14:15
#12
Tilpassede lige mit ovenstående eksempel og smed den over i den anden tråd.
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.
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.
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
11. august 2010 - 09:20
#16
Liste der viser antal inlæg af forskellige typer:
<?
include("config.php");
$id_res = mysql_query("SELECT DISTINCT(type), refid FROM type");
while($id_row = mysql_fetch_assoc($id_res))
{
$num_res = mysql_query("SELECT refid 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 />";
}
?>
Jeg har aldrig prøvet en
mysql_query("SELECT DISTINCT(type), refid FROM type");før, så jeg håber den opfører sig som det er meningen :)
Den skulle outputte en type-liste, med link til
I side2.php, kan du bare lave en
mysql_query("SELECT id FROM main WHERE id = $_GET['refid']");
Slettet bruger
11. august 2010 - 12:17
#17
startede lige med antal:
Den viser rigtigt listen, men der er 0 ud for alle typerne.
$num_res = mysql_query("SELECT refid FROM type WHERE type = '$id_row[type]'");
java script:%20void(0);
Slettet bruger
11. august 2010 - 12:18
#18
Hvor kom det der java script fra. :S det er ikke noget jeg har sat ind :S
11. august 2010 - 13:24
#19
hmmm... fungerer links som de skal?
Slettet bruger
11. august 2010 - 13:27
#20
Nu har jeg fået leget lidt mere med det:
<?
include("config.php");
$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
Slettet bruger
11. august 2010 - 13:39
#21
Har ikke prøvet det med links endnu.
11. august 2010 - 13:51
#22
include("config.php");
$id_res = mysql_query("SELECT DISTINCT(type), refid FROM type");
while($id_row = mysql_fetch_assoc($id_res)){
$num_que = "SELECT refid FROM type WHERE type = '".$id_row['type']."'";
$num_res = mysql_query($num_que);
$type_num = mysql_num_rows($num_res);
echo "<a href=\"side2.php?refid=".$id_row['refid']."\">".$id_row['type']." (".$type_num.")</a><br />";
}
?>Meningen med scriptet, er at det skal tælle antallet af ID'er der matcher den aktuelle type, i loopet.
Hvis det stadig ikke fungerer, kan vi lige prøve med
COUNT(refid) AS refidcount
Slettet bruger
11. august 2010 - 14:29
#23
Jeg måtte rette lidt i den for at få det til at virke:
Det var denne linje:
$id_res = mysql_query("SELECT DISTINCT(type), refid FROM type");
til:
$id_res = mysql_query("SELECT DISTINCT(type) FROM type");
Jeg måtte fjerne
, refidHvorfor er det type er i () og hvorfor var det du valgte Distinct?
Jeg måtte lave linket om:
echo "<a href=\"side2.php?type=".$id_row['type']."\">".$id_row['type']." (".$type_num.")</a><br />";
For den skal jo hente en bestemt type.
Side 2 har jeg sat sådan op:
<?
include("config.php");
$type_res = mysql_query("SELECT * FROM main WHERE id = 'refid'");
while($type_row = mysql_fetch_assoc($type_res))
{
echo ".$type_row['title']."<br>";
}
?>
Her prøver jeg at hente id=refid
Og så vise titlerne i main databasen
11. august 2010 - 15:34
#24
"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.
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>";
11. august 2010 - 19:12
#26
<?
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 />";
}
?>
Se om det ikke lige klarede det :)
11. august 2010 - 19:17
#27
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.
11. august 2010 - 19:21
#28
$type_que = "SELECT * FROM type, Main WHERE type.refid = Main.id AND type.type = '".$_GET['type']."'";
burde også fungere tror jeg...
Slettet bruger
11. august 2010 - 19:23
#29
Se det var en start. Nu forsvandt fejlen.
Men der er bare ingen data, der bliver udskrevet.
:P
Slettet bruger
11. august 2010 - 19:33
#30
Prøvede lige den anden $type_que
Der kom heller ingen fejl. Men heller ikke nogen udskrift med data.
11. august 2010 - 19:55
#31
hmm...
hvordan ser adresselinjen ud når du kører scriptet?
hvis der ikke er en
?type=x
så vil jeg skyde på det er problemet :P
Slettet bruger
11. august 2010 - 20:00
#32
Linje er perfekt og har været faktisk hele tiden :(
Men det er som om den ikke henter data'en frem.
Hvordan kan den se hvilken database, den skal hente title fra?
Slettet bruger
11. august 2010 - 20:00
#33
side2.php?type=1
Slettet bruger
11. august 2010 - 21:26
#34
Har kigget lidt mere på det og prøvet en masse.
Men kan desværre ikke lige se hvad jeg kan gøre.
Jeg var inde og læse om INNER JOIN men fandt ikke rigtigt en fejl eller et svar.
11. august 2010 - 23:11
#35
<?
include("config.php");
$type_get = $_GET['type'];
echo "Typen hentet fra adressen: ".$type_get."<br />";
$type_que = "SELECT * FROM type INNER JOIN main ON type.refid = Main.id WHERE type.type = '$type_get'";
echo "<br />Query:".$type_que."<br /><br />";
$type_res = mysql_query($type_que);
while($type_row = mysql_fetch_assoc($type_res))
{
echo $type_row['title']."<br />";
}
?>
Rettet:
Main
til
main
Tilføjet:
Echo af type og query, så man kan se om det opfattes rigtigt.
11. august 2010 - 23:12
#36
hvis det stadig ikke fungerer, så skriv lige hvad den echoer ud.
11. august 2010 - 23:21
#37
<?
include("config.php");
$type_get = $_GET['type'];
echo "Typen hentet fra adressen: ".$type_get."<br />";
$type_que = "SELECT * FROM type INNER JOIN main ON type.refid = main.id WHERE type.type = '$type_get'";
echo "<br />Query:".$type_que."<br /><br />";
$type_res = mysql_query($type_que);
while($type_row = mysql_fetch_assoc($type_res))
{
echo $type_row['title']."<br />";
}
?>
fik ikke lige rettet alle "Main" *suk*
Slettet bruger
11. august 2010 - 23:23
#38
Der er problemet:
Den har type oppe i URL'en
Men ikke med i query'en
Typen hentet fra adressen:
Query:SELECT * FROM type INNER JOIN Main ON type.refid = main.id WHERE type.type ''
Slettet bruger
11. august 2010 - 23:25
#39
Hehe fik heller ikke ændret dem helt rigtigt.
Men det er de blevet nu og samme fejl.
11. august 2010 - 23:28
#40
dine echo's har stadig ikke typen med?
Slettet bruger
11. august 2010 - 23:30
#41
Nope
11. august 2010 - 23:30
#42
prøv lige at erstatte
$type_get = $_GET['type'];
med
$type_get = 1;
så vi lige kan finde ud af om queryen, og det andet fungerer.
Slettet bruger
11. august 2010 - 23:33
#43
Så finder den hele listen som den skal.
Men selvf kun for type 1.
11. august 2010 - 23:39
#44
Men det fungerer som det skal så? altså queryen?
jeg prøvede at lave en test fil:
gettest.php
<?
$type_get = $_GET['type'];
echo "Typen hentet fra adressen: ".$type_get."<br />";
$type_que = "SELECT * FROM type INNER JOIN main ON type.refid = Main.id WHERE type.type = '$type_get'";
echo "<br />Query:".$type_que."<br /><br />";
?>
gettest.php?type=1
outputter
Typen hentet fra adressen: 1
Query:SELECT * FROM type INNER JOIN main ON type.refid = Main.id WHERE type.type = '1'
Jeg ved ikke lige hvorfor $_GET['type'] ikke fungerer for dig :s
Slettet bruger
11. august 2010 - 23:43
#45
Det undre godt nok også mig :S
11. august 2010 - 23:47
#46
Men når queryen fodres med et tal, så fungerer den helt som den skal - ikke?
Slettet bruger
11. august 2010 - 23:53
#47
Jo... Så virker det super.
Synes bare det er underligt at den ikke kan hente den med _GET
11. august 2010 - 23:55
#48
Vil du ikke lige prøve at smide din kode ind som den ser ud nu?
Slettet bruger
11. august 2010 - 23:59
#49
<?
include("config.php");
$type_get = $_GET['type'];
echo "Typen hentet fra adressen: ".$type_get."<br />";
$type_que = "SELECT * FROM type INNER JOIN main ON type.refid = main.id WHERE type.type = '$type_get'";
echo "<br />Query:".$type_que."<br /><br />";
$type_res = mysql_query($type_que);
while($type_row = mysql_fetch_assoc($type_res))
{
echo $type_row['title']."<br />";
}
?>
12. august 2010 - 00:11
#50
Jeg har da aldrig haft problemer med $_GET
pff!
Det kan være du kan lave det med en dropdown menu i den side hvor du får typelisten, og så kan du måske lave det med $_POST i stedet for.
Jeg syntes godt nok jeg er lidt på bar bund mht hvorfor $_GET ikke virker...
Slettet bruger
12. august 2010 - 00:29
#51
God nyhed...
Fik det til at virke.
MEN.....
Jeg har fået et problem jeg har prøvet at sætte det ind hvor jeg virkelig har brug for det. Og der er Fejl på den.
Denne gang kan den slet ikke finde _GET
Er det fordi mine database nu hedder.
SS_MOVIE
s_ID
s_TYPE
SS_TYPE
s_ID
s_REFID
s_TYPE
så vil den ikke finde _GET er der en grund til det?
Slettet bruger
12. august 2010 - 00:32
#52
Det er sådan set ikke denne det faktisk skal være i men det er en mini udgave af den rigtige hvor databaserne næsten hedder det samme.
Prøv at lav en hurtig database som jeg viste ovenover og se om det virker.
<?
include("config.php");
$type_get = $_GET['s_TYPE'];
echo "Typen hentet fra adressen: ".$type_get."<br />";
$type_que = "SELECT * FROM SS_TYPE INNER JOIN SS_MOVIE ON SS_TYPE.s_REFID = SS_MOVIE.s_ID WHERE SS_TYPE.s_TYPE = '$type_get'";
echo "<br />Query:".$type_que."<br /><br />";
$type_res = mysql_query($type_que);
while($type_row = mysql_fetch_assoc($type_res))
{
echo $type_row['s_TITLE']."<br />";
}
?>
Slettet bruger
12. august 2010 - 00:51
#53
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.
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
12. august 2010 - 08:00
#55
Hvordan ser adressen ud?
[adresse+sti+fil]?s_TYPE=1
Hvad returnerer den så?
Fanger $_GET['s_TYPE'] værdien som den skal?
12. august 2010 - 08:02
#56
#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å.
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.
12. august 2010 - 12:59
#58
Du kan lave flere variabler i dit adressefelt,
fil.php?var1=weee&var2=84&var3=kage
$_GET['var1']
"weee"
$_GET['var2']
"84"
$_GET['var3']
"kage"
12. august 2010 - 13:04
#59
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
http://da.wikipedia.org/wiki/SQL_injection
Slettet bruger
12. august 2010 - 13:15
#60
Nice... Takker. :)
Vi tilbyder markedets bedste kurser inden for webudvikling