Avatar billede esbenn Nybegynder
29. juli 2010 - 19:54 Der er 42 kommentarer og
1 løsning

Variabel indeholdende løkke

Hej.

Måske underlig overskrift til mit spørgsmål, men vidste ikke lige hvad jeg skulle kalde det :)

Jeg har 2 tabeller fra mysql der ser ca sådan ud:

1:
object_id  term_taxonomy_id
19          3
19          5
19          6
19          7

2:
term_id    name
3          TEKST
5          TEKST
6          TEKST
7          TEKST

Jeg vil nu første hente fra tabel 1 alle de steder der har object_id 19 og derefter hente navnet på den i tabel 2. Det er jo sådan set lige til. Men så vil jeg altså gerne gemme det resultat som en variabel så jeg kan komme til noget der ligner dette:
$test = TEKST, TEKST, TEKST, TEKST
Altså hvor alle er med opdelt af komma...

Så det er altså den sidste del fra hvordan jeg kommer til at de bare bliver udskrevet til hvordan jeg kan få dem som sådan en variabel...

Håber nogen kan hjælpe...

Hvis spørgsmålet ikke helt er forstået så spørg gerne, så prøver jeg at forklare bedre :)
Avatar billede ggxdg Nybegynder
29. juli 2010 - 20:10 #1
resultloop osv.



if (isset($test)) { $test .= ","; }
$test .= $result['name'];



afslut resultloop
Avatar billede ggxdg Nybegynder
29. juli 2010 - 20:11 #2
Smid lige lidt kode hvis ovenstående ikke løser dit problem.
Avatar billede majbom Novice
29. juli 2010 - 20:13 #3
<?php

$res = mysql_query("SELECT tabel2.name FROM tabel2 INNER JOIN tabel1 ON tabel2.term_id=tabel1.term_taxonomy_id WHERE tabel1.object_id=19");

$test = "";
$i = 0;

while($rows = mysql_fetch_assoc($res)){
    if($i>0){
        $test .= ", ";
    }
    $test .= $rows['name'];
}

?>


sådan måske?
er ikke testet dog...
Avatar billede wanze Nybegynder
29. juli 2010 - 20:39 #4
PHP har allerede en funktion til det, nemlig implode.

http://dk.php.net/implode
Avatar billede majbom Novice
29. juli 2010 - 20:44 #5
-> #4 - doh! jeg går i seng :s
Avatar billede esbenn Nybegynder
29. juli 2010 - 21:32 #6
Prøver med implode, men kan ikke helt få den til at udskrive det hele...

$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");

while($rows = mysql_fetch_assoc($res)){
    $test = implode(',', $rows);
    }

Det giver kun 1 resultat hvor jeg har de 4 i min tabel... (har lige erstattet tabelnavnene med det rigtige, håber ikke det forvirrer.. :)
Avatar billede wanze Nybegynder
29. juli 2010 - 21:57 #7
Det er svært at sige, hvad der går galt, når jeg ikke ved, hvilken data du får ud. Paste evt. et var_dump($rows), så vi ved, hvad vi har at gøre med.
Avatar billede esbenn Nybegynder
29. juli 2010 - 22:03 #8
array(1) { ["name"]=>  string(4) "Blog" } array(1) { ["name"]=>  string(8) "testblog" } array(1) { ["name"]=>  string(3) "tag" } array(1) { ["name"]=>  string(3) "hmm" }

og det eneste resultat jeg for ud er hmm...
Avatar billede wanze Nybegynder
29. juli 2010 - 22:10 #9
Prøv med mysql_fetch_array() fremfor mysql_fetch_assoc().
Avatar billede ggxdg Nybegynder
29. juli 2010 - 22:10 #10
$rows skifter værdi hver gang dit while loop kører, hvilket er grunden til at jeg ikke brugte implode(), men

if (isset($test)) { $test .= ","; }
$test .= $result['name'];


ellers skal du ligge værdierne i et array i while-loopet, for bagefter at implode arrayet, eller behandle mysql_fetch_assoc($res) direkte, hvilket nok er lidt for omstændigt.
Avatar billede wanze Nybegynder
29. juli 2010 - 22:19 #11
ggdxdg: Så vidt jeg kan se får han  4 resultater ud hver gang han kører løkken.
Avatar billede esbenn Nybegynder
29. juli 2010 - 22:20 #12
$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_assoc($res))
        {
            if (isset($test)) { $test1= ","; }
            $test1= $rows['name'];
        }

Giver stadig kun hmm som resultat...
Avatar billede esbenn Nybegynder
29. juli 2010 - 22:23 #13
Kan det være et problem at jeg har flere løkker i hinanden, og der derfor kan komme nogle problemer?
Avatar billede esbenn Nybegynder
29. juli 2010 - 23:08 #14
Hvis jeg prøver med array istedet for assoc:
       
$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_array($res))
        {
            if (isset($test)) { $test1= ","; }
            $test1= $rows['name'];
            $test2 = implode(',', $rows);
            echo var_dump($rows);
        }

var_dum($rows):
array(2) { [0]=>  string(4) "Blog" ["name"]=>  string(4) "Blog" } array(2) { [0]=>  string(8) "testblog" ["name"]=>  string(8) "testblog" } array(2) { [0]=>  string(3) "tag" ["name"]=>  string(3) "tag" } array(2) { [0]=>  string(3) "hmm" ["name"]=>  string(3) "hmm" }

echo $test1;:
hmm

echo $test2;:
hmm,hmm
Avatar billede esbenn Nybegynder
29. juli 2010 - 23:34 #15
Smider lige hele koden, kan være det giver lidt svar :)

<?php
$blog = mysql_query("SELECT * from ideaal_term_relationships WHERE term_taxonomy_id='3' order by object_id ASC");
while($blog_row = mysql_fetch_array($blog))
{
    $blog_id=$blog_row['object_id'];
    $blog_post = mysql_query("SELECT * from ideaal_posts WHERE ID='$blog_id'");
    while($blog_post_row = mysql_fetch_array($blog_post))
    {
        setlocale(LC_TIME, 'da_DK');
        $myDate = $blog_post_row['post_date'];
        $date= strftime('%e. %B %Y',strtotime($myDate));
        // Hvis kl skal med, så ændre strftime('%e. %B %Y',strtotime($myDate)); til strftime('%e. %B %Y kl. %T',strtotime($myDate));
       
        $res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_array($res))
        {
            if (isset($test)) { $test1= ","; }
            $test1= $rows['name'];
            $test2 = implode(',', $rows);
            echo var_dump($rows);
        }
    echo "<div class='home_blog'><div class='blog_title'>".$blog_post_row['post_title']."</div><span class='blog_date'>".$date."</span>&thinsp;<span class='blog_tag'>".$test2."</span><div class='blog_ref'>".$blog_post_row['post_excerpt']."</div><div class='blog_more'>Læs mere...</div></div>";
       
    }
}
?>
Avatar billede majbom Novice
30. juli 2010 - 07:11 #16
du skal heller ikke køre implode inde i din while, du skal gøre sådan her:

$rows = mysql_fetch_array($res);
$test = implode(','$rows);

burde gøre det...
Avatar billede dmdisco Nybegynder
30. juli 2010 - 10:21 #17
du kan også bruge mysql GROUP_CONCAT(field) hvis du vil have en komma separeret liste
Avatar billede esbenn Nybegynder
30. juli 2010 - 11:28 #18
splazz: det giver mig kun Blog, Blog

dmdisco: hvordan virker det?
Avatar billede majbom Novice
30. juli 2010 - 11:41 #19
-> #18 - og hvad skulle det gi?
Avatar billede dmdisco Nybegynder
30. juli 2010 - 11:49 #20
$res = mysql_query("SELECT GROUP_CONCAT(ideaal_terms.name) FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");

var_dump(mysql_fetch_row($res));

men da du looper det hele en masse gange bliver det til en farlig masse opslag så måske du skulle tænke det hele igennem igen

eks. bruge IN til at finde de poster du skal bruge til sidst, så du henter alle dine blog_id ud i en komma separeretliste og så laver en forspørgsel på at få alle de termer der relatere sig til dem.

$res = mysql_query("SELECT GROUP_CONCAT(ideaal_terms.name) FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id IN (".$blog_id.")");

noget i den stil så slipper du da for en hel del forespørgsler, ka dog godt være at jeg helt har misforstået hvad du vil og skal (har ikke læst det hele igennem)
Avatar billede esbenn Nybegynder
30. juli 2010 - 12:03 #21
splazz:
Der skulle gerne komme dette ud:
Blog, testblog, tag, hmm

dmdisco:
Jeg er rimeligt ny til at bruge IN og få det til at relatere til hinanden, men du har ret i at jeg laver en del loops og queries... Som det er nu laver jeg først en hvor jeg finder blog_id, så en der finder alt det information omkring blog_id og så den sidste der nu gerne skulle finde de tag's der bliver brugt... Ved ikke om du kan gennemskue det hele fra da jeg indsatte hele koden?
Avatar billede majbom Novice
30. juli 2010 - 14:07 #22
$res = mysql_query("SELECT tabel2.name FROM tabel2 INNER JOIN tabel1 ON tabel2.term_id=tabel1.term_taxonomy_id WHERE tabel1.object_id=19");

print_r(mysql_fetch_array($res));


hvad giver det?
Avatar billede esbenn Nybegynder
30. juli 2010 - 14:17 #23
Hvis jeg laver det:

$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        print_r(mysql_fetch_array($res));
        $rows = mysql_fetch_array($res);
        $test = implode(', ', $rows);
        echo $test;

Så giver print_r Array ( [0] => Blog [name] => Blog )
og hvis jeg udskriver $test giver det testblog, testblog

For mig virker det altså somom noget skal løkkes, for de kommer jo fint nok ud (godt nok dobbelt) men den tager bare kun én af dem?!
Avatar billede majbom Novice
30. juli 2010 - 17:23 #24
okay, så giver det jo mening

den skriver det to gange fordi du bruger mysql_fetch_array (så kan du hente med både det associerede navn og tallet, du bør bruge mysql_fetch_assoc, da den så kun bruger navnet.

og den henter altså kun én linje, derfor skriver den kun "Blog, Blog"
Avatar billede esbenn Nybegynder
30. juli 2010 - 21:35 #25
Okay, så skriver den kun det én gang nu... Men jeg for stadig kun det ene udtræk hvor jeg gerne skulle have 4... Men hvis jeg ikke må bruge implode i en løkke, hvordan skal det så gøres?
Avatar billede majbom Novice
30. juli 2010 - 22:44 #26
du skal bruge implode som jeg skrev i #16

grunden til at den kun henter én er nok kun er én der har object_id 19?
Avatar billede esbenn Nybegynder
30. juli 2010 - 22:48 #27
Nej, i databasen: ideaal_term_relationships er der 4 rækker der har object_id 19... Har dobbelttjekket min database.. :)
De 4 har så hvert et term_taxonomy_id som hver har ét "name" som jeg gerne skulle have ud... Hvis jeg bare bruger en normal løkke og hiver det ud for jeg alle 4 ud, men uden kommaopdeling og mulighed for at gøre dem til links...
Avatar billede majbom Novice
31. juli 2010 - 00:51 #28
kan du ikke vise din tabelstruktur på de to tabeller?
Avatar billede esbenn Nybegynder
31. juli 2010 - 10:33 #29
Jeg prøver lige at komme med det hele og rækkefølgen jeg gør det i.. :)

Først lige de tre tabeller jeg bruger:
ideaal_term_relationships:
http://www.esbennorgaard.com/ideaal_term_relationships.jpg

ideaal_posts:
http://www.esbennorgaard.com/ideaal_posts.jpg

ideaal_terms:
http://www.esbennorgaard.com/ideaal_terms.jpg

Det jeg så vil gøre er først at finde alle de steder hvor i ideaal_term_relationships hvor term_taxonomy_id er 3.
Så vil jeg bruge det object_id der fra til at hente al information om den post fra ideaal_posts.
Men samtidig vil jeg hente alle de term_taxonomy_id fra ideaal_term_relationships hvor object_id er samme opbject_id som før (i dette tilfælde har vi brugt 19). Det term_taxonomy_id bruger jeg så i ideaal_terms hvor hvert term_id har et name som jeg gerne skulle have skrevet ud på en liste opdelt af komma... Skulle også gerne kunne lave hvert name til et link...


Så kan du lige få det kode jeg har nu:

<?php
$blog = mysql_query("SELECT object_id from ideaal_term_relationships WHERE term_taxonomy_id='3' order by object_id ASC");
while($blog_row = mysql_fetch_array($blog))
{
    $blog_id=$blog_row['object_id'];
    $blog_post = mysql_query("SELECT post_date,post_title,post_excerpt from ideaal_posts WHERE ID='$blog_id'");
    while($blog_post_row = mysql_fetch_array($blog_post))
    {
        setlocale(LC_TIME, 'da_DK');
        $myDate = $blog_post_row['post_date'];
        $date= strftime('%e. %B %Y',strtotime($myDate));
        // Hvis kl skal med, så ændre strftime('%e. %B %Y',strtotime($myDate)); til strftime('%e. %B %Y kl. %T',strtotime($myDate));
       
        $res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        print_r(mysql_fetch_assoc($res));
        $rows = mysql_fetch_assoc($res);
        $test = implode(', ', $rows);
        echo $test;
    echo "<div class='home_blog'><div class='blog_title'>".$blog_post_row['post_title']."</div><span class='blog_date'>".$date."</span>&thinsp;<span class='blog_tag'>".$test."</span><div class='blog_ref'>".$blog_post_row['post_excerpt']."</div><div class='blog_more'>Læs mere...</div></div>";
       
    }
}
?>

Håber der er noget der giver mening.. :)
Avatar billede ggxdg Nybegynder
01. august 2010 - 11:26 #30
Jeg er stadig forholdvist grøn til PHP, og langt fra erfaren i brugen af MySQL, men $rows indeholder da kun 1 resultat ad gangen ikke? Er det ikke derfor man sætter den i en while?
Hvis den kun har et resultat ad gangen kan man vel ikke bruge implode(",", $rows); uden først at gemme resultaterne i et array inden for while-lykken, og bruge implode udenfor?

#14 viser jo tydeligt at scriptet outputter det den skal


$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_array($res))
        {
            if (isset($test1)) { $test1 .= ","; }
            $test1 .= $rows['name'];
            echo var_dump($rows);
        }
        echo "Test: ".$test1;


du havde slettet punktummet foran "=" i #14, hvilket sætter variablen forfra, i stedet for at tilføje til den. Der manglede også et 1-tal i "isset()".
Ovenstående er måske ikke helt praktisk eller effektivt, men det burde fungere.
Skriv lige hvad $test1 giver.
Avatar billede ggxdg Nybegynder
01. august 2010 - 11:32 #31
Med implode:
[div][pre]$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_array($res))
        {
            $arrtest[] = $rows['name'];
            echo var_dump($rows);
        }
        $test1 = implode(",",$arrtest);
        echo "Test: ".$test1;
Avatar billede ggxdg Nybegynder
01. august 2010 - 11:33 #32
prøver lige igen *suk*

Med implode:
$res = mysql_query("SELECT ideaal_terms.name FROM ideaal_terms INNER JOIN ideaal_term_relationships ON ideaal_terms.term_id=ideaal_term_relationships.term_taxonomy_id WHERE ideaal_term_relationships.object_id='$blog_id'");
        while($rows = mysql_fetch_array($res))
        {
            $arrtest[] = $rows['name'];
            echo var_dump($rows);
        }
        $test1 = implode(",",$arrtest);
        echo "Test: ".$test1;
Avatar billede esbenn Nybegynder
01. august 2010 - 11:46 #33
ggxdg: Det virkede! Lækkert!

Må jeg lige spørge, arrtest[] - hvad gør den?

Men smid også et svar så du kan få point :)
Avatar billede ggxdg Nybegynder
01. august 2010 - 12:01 #34
Det er de andre der har arbejdet mest for det og de har nok ret i at det kan optimeres for at reducere opslagene, så jeg syntes bare de skal have pointene.


$arrtest[] gemmer værdien af $rows['name'] for hvert loop.

Ved ikke at skrive tal eller variabler i "[]"-delen, skriver den bare selv til næste ledige plads i arrayet.

Uden for while lykken, hvor arrayet så har fået alle resultaterne, imploder man den bare, og voila, en komma separeret variabel.


Det jeg skrev i #30 burde virke også.
Avatar billede ggxdg Nybegynder
01. august 2010 - 12:06 #35
Og for lige at være sikker på at få alt med, $arrtest[] er et helt almindeligt array :P
Avatar billede majbom Novice
01. august 2010 - 18:17 #36
kan ikke forstå hvis ikke du får samme resultat med:

$rows = mysql_fetch_array($res);
$test = implode(','$rows);

$rows burde indeholde et helt array med alle rækker der blev hentet.
når man kører det i en while løber du bare arrayet igennem samtidig med at det bliver fyldt...

jeg smider et svar, så må du selv lige finde ud af hvem der skal have hvor mange :)
Avatar billede esbenn Nybegynder
01. august 2010 - 21:54 #37
Svært at sige hvorfor det er, men den lavede det i hvert fald ikke rigtigt når jeg kiggede på det.. :)

Men du for point, og så siger jeg mange tak for hjælpen - er for fedt at du gad bruge så meget tid på det!
Avatar billede majbom Novice
02. august 2010 - 08:12 #38
jeg soger tak for point, men jeg skal ikke have alle sammen:

http://www.eksperten.dk/spm/915363
Avatar billede ggxdg Nybegynder
02. august 2010 - 10:01 #39
Du har sikkert ret, men hvis alle resultaterne bliver sat til $rows, vil det så ikke blive et multidimensionelt array?

f.eks.

Rows
-res1
--navn
--efternavn
--titel
-res2
--navn
--efternavn
--titel

osv.?
Avatar billede majbom Novice
02. august 2010 - 10:21 #40
-> ggxdg - jo så skal det være med assoc i stedet for array :)
Avatar billede ggxdg Nybegynder
02. august 2010 - 13:06 #41
Jeg troede den eneste forskel mellem assoc og array, var at assoc kun havde "associative keys" og at array både har "associative keys" og "numeric keys" medmindre MYSQL_ASSOC, eller MYSQL_NUM, blev brugt i mysql_fetch_array-funktionen.

Men hvis man kan bruge array, i stedet for at køre while loops, så tror jeg da jeg har en del scripts jeg kan optimere...
Avatar billede majbom Novice
02. august 2010 - 21:54 #42
ja det er osse den eneste forskel det er mig der kager rundt i det.

jeg var bare sikker på at når man gjorde det på den måde, havde man ét stort array, med alle poster, men nej - det må være noget jeg har fra et andet sprog :s

så der er ingen grund til at rende alle dine scripts igennem for at optimere - i hvert fald ikke efter min metode :D

jeg undskylder mit ringe bidrag til denne tråd :)
Avatar billede ggxdg Nybegynder
03. august 2010 - 19:16 #43
Jeg har det også med at rode rundt i forskellige sprog :P

Jeg har lige kigget lidt på php.net og det ser ud som om de andre PHP/DB funktioner har en *DB-type*_fetch_all() men der eksisterer mærkeligt nok ikke nogen mysql_fetch_all(). Man kan jo så selv lave funktionen, men det undrer mig lidt at den er der for de andre DB'er...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester