29. juli 2010 - 19:54Der 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 :)
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'");
$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.
$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)
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?
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"
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?
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...
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));
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.
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.
$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 :)
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...
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 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...
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.