/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Optimering af databaseopslag
Fra : Kim Ludvigsen


Dato : 09-07-07 16:38

Jeg skal finde tre tilfældige tekster i en MySQL-database og tildele dem
til tre forskellige variabler.

I øjeblikket foretager jeg tre opslag. Vil det være bedre at gøre det
med ét opslag og så bruge php til at tildele de tre fundne tekster til
de tre variabler? Og i så fald, hvordan gøres det?

I øjeblikket bruger jeg denne kode tre gange:

$query = "SELECT * FROM [tabel] where type ='7' ORDER BY RAND() LIMIT 1";
$result = mysql_query($query);
$tekst1=mysql_fetch_assoc($result);

--
Mvh. Kim Ludvigsen
Beskyt de små mod porno på internettet.
http://kimludvigsen.dk

 
 
Michael Zedeler (09-07-2007)
Kommentar
Fra : Michael Zedeler


Dato : 09-07-07 21:26

Kim Ludvigsen wrote:
> Jeg skal finde tre tilfældige tekster i en MySQL-database og tildele dem
> til tre forskellige variabler.
>
> I øjeblikket foretager jeg tre opslag. Vil det være bedre at gøre det
> med ét opslag og så bruge php til at tildele de tre fundne tekster til
> de tre variabler? Og i så fald, hvordan gøres det?
>
> I øjeblikket bruger jeg denne kode tre gange:
>
> $query = "SELECT * FROM [tabel] where type ='7' ORDER BY RAND() LIMIT 1";
> $result = mysql_query($query);
> $tekst1=mysql_fetch_assoc($result);

Du har jo selv skrevet det.

$query = "SELECT * FROM [tabel] where type='7' ORDER BY RAND() LIMIT 3";
$result = mysql_query($query);
$tekst1=mysql_fetch_assoc($result);
$tekst2=mysql_fetch_assoc($result);
$tekst3=mysql_fetch_assoc($result);

Mvh. Michael.

Kim Ludvigsen (09-07-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 09-07-07 22:23

Den 09-07-07 22.26 skrev Michael Zedeler følgende:
> Kim Ludvigsen wrote:

> Du har jo selv skrevet det.
>
> $query = "SELECT * FROM [tabel] where type='7' ORDER BY RAND() LIMIT 3";
> $result = mysql_query($query);
> $tekst1=mysql_fetch_assoc($result);
> $tekst2=mysql_fetch_assoc($result);
> $tekst3=mysql_fetch_assoc($result);

Jeg er forholdsvis begynder med php. Jeg troede, der skulle laves en
løkke eller lignende. Og så var jeg ikke sikker på, om det var bedst at
lade databasen arbejde eller at lade php arbejde. Men det der er jo
smart! Det må jeg kunne bruge et par steder, hvor jeg netop bruger
løkker i øjeblikket.

--
Mvh. Kim Ludvigsen
Brug filtre i Outlook Express til at holde styr på dine mails og til at
minimere spam.
http://kimludvigsen.dk

Leonard (09-07-2007)
Kommentar
Fra : Leonard


Dato : 09-07-07 22:33

On Mon, 09 Jul 2007 23:22:59 +0200, Kim Ludvigsen wrote:

>> $query = "SELECT * FROM [tabel] where type='7' ORDER BY RAND() LIMIT 3";
>> $result = mysql_query($query);
>> $tekst1=mysql_fetch_assoc($result);
>> $tekst2=mysql_fetch_assoc($result);
>> $tekst3=mysql_fetch_assoc($result);
>
> Jeg er forholdsvis begynder med php. Jeg troede, der skulle laves en
> løkke eller lignende.

Jeg plejer at have noget i en løkke:
>> $query = "SELECT * FROM [tabel] where type='7' ORDER BY RAND() LIMIT 3";
>> $result = mysql_query($query);
while ( $tekst1=mysql_fetch_assoc($result) ) {
   noget print osv med udtrækket
}


--
Leonard
RC Tamiya King Hauler 1:14 sælges
http://leonard.dk/tilsalg/kh.php

Michael Zedeler (09-07-2007)
Kommentar
Fra : Michael Zedeler


Dato : 09-07-07 23:15

Kim Ludvigsen wrote:
> Den 09-07-07 22.26 skrev Michael Zedeler følgende:
>> Kim Ludvigsen wrote:
>
>> Du har jo selv skrevet det.
>>
>> $query = "SELECT * FROM [tabel] where type='7' ORDER BY RAND() LIMIT 3";
>> $result = mysql_query($query);
>> $tekst1=mysql_fetch_assoc($result);
>> $tekst2=mysql_fetch_assoc($result);
>> $tekst3=mysql_fetch_assoc($result);
>
> Jeg er forholdsvis begynder med php. Jeg troede, der skulle laves en
> løkke eller lignende. Og så var jeg ikke sikker på, om det var bedst at
> lade databasen arbejde eller at lade php arbejde. Men det der er jo
> smart! Det må jeg kunne bruge et par steder, hvor jeg netop bruger
> løkker i øjeblikket.

Øh. Nej. Jeg ville da bestemt bruge løkker frem for at rulle løkkerne
ud. Det lå bare lige for at illustrere hvor tæt på du selv allerede var.
Du kan skrive det samme med en løkke som stopper værdierne i et array.
Den fremgangsmåde er nemmere at vedligeholde og udbygge.

Mvh. Michael.

Kim Ludvigsen (10-07-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-07-07 08:18

Den 10-07-07 00.14 skrev Michael Zedeler følgende:
> Kim Ludvigsen wrote:

>> smart! Det må jeg kunne bruge et par steder, hvor jeg netop bruger
>> løkker i øjeblikket.
>
> Øh. Nej. Jeg ville da bestemt bruge løkker frem for at rulle løkkerne
> ud.

Også, når det kun drejer sig om 2-4 strenge? Vil en løkke ikke både
bruge mere kode og mere cpu end den direkte tildeling, som du angav. Jeg
er helt med på brugen af løkker til større mængder, men det er der jo
ikke tale om her.

--
Mvh. Kim Ludvigsen
Har du fortalt din far og mor om Ludvigs Hjørne?
http://kimludvigsen.dk

Peter Brodersen (10-07-2007)
Kommentar
Fra : Peter Brodersen


Dato : 10-07-07 09:05

On Tue, 10 Jul 2007 09:18:10 +0200, Kim Ludvigsen
<usenet@kimludvigsen.dk> wrote:

>Også, når det kun drejer sig om 2-4 strenge? Vil en løkke ikke både
>bruge mere kode og mere cpu end den direkte tildeling, som du angav. Jeg
>er helt med på brugen af løkker til større mængder, men det er der jo
>ikke tale om her.

Hvis antallet af strenge netop kan variere mellem fx 2-4, så vil jeg
nok også bruge en løkke. Det er ikke tydeligt, om tekst1, tekst2 og
tekst3 har forskellige indbyrdes betydninger, eller om de blot er af
samme natur.

Hvis der død-og-pine skal hentes lige præcis tre stykker tekst ud, og
det aldrig kan ændre sig, så kunne jeg måske være fristet til at
undlade at bruge en løkke med nogle passende kommentarer tilknyttet.

Den "ekstra cpu-tid" er vitterligt ligegyldig. En ekstra fil-include,
og du har brugt den samme ekstra cpu-tid på ét eneste request, som du
i øvrigt kan spare på små-optimeringer i den her stil over nogle uger.
Dertil kommer, at ledig cpu-tid ikke kan spares op :)

--
- Peter Brodersen
Kendt fra Internet

Kim Ludvigsen (10-07-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-07-07 09:57

Den 10-07-07 10.04 skrev Peter Brodersen følgende:
> On Tue, 10 Jul 2007 09:18:10 +0200, Kim Ludvigsen
> <usenet@kimludvigsen.dk> wrote:
>
>>Også, når det kun drejer sig om 2-4 strenge? Vil en løkke ikke både
>>bruge mere kode og mere cpu end den direkte tildeling, som du angav.
>
> Hvis antallet af strenge netop kan variere mellem fx 2-4, så vil jeg
> nok også bruge en løkke. Det er ikke tydeligt, om tekst1, tekst2 og
> tekst3 har forskellige indbyrdes betydninger, eller om de blot er af
> samme natur.

Samme natur, og altid samme antal. "2-4" er fordi, jeg et sted henter to
strenge, et andet sted tre - og at jeg måske et tredje sted skal bruge
fire.

> Dertil kommer, at ledig cpu-tid ikke kan spares op :)

Øv, dér røg den forretningsidé i vasken!

Hvordan laver man ellers den mest optimale løkke med tildeling af
strengværdier, hvis jeg fx skulle hente flere strenge ud?

--
Mvh. Kim Ludvigsen
Gem internettet på din computer med Net Snippets.
http://kimludvigsen.dk

Bertel Lund Hansen (10-07-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-07-07 14:01

Kim Ludvigsen skrev:

> Hvordan laver man ellers den mest optimale løkke med tildeling af
> strengværdier, hvis jeg fx skulle hente flere strenge ud?

define('MAGICNUMBER', 3);

$tekst=array();
$query = "SELECT * FROM [tabel] where type ='7' ORDER BY RAND() LIMIT ".MAGICNUMBER;
$result = mysql_query($query);
for ($n=0; $n<MAGICNUMBER; ++$n) $tekst[]=mysql_fetch_assoc($result);

Du kan vælge et vilkårligt navn i stedet for "MAGICNUMBER", men
man plejer at bruge store bogstaver ved definitioner.

Udskrift:

   foreach (tekst as $smart_remark) echo $smart_remark;

eller én bestemt:

   echo $tekst[1]; // 0-2 inkl.

Jeg er enig med Peter Brodersen i at CPU-tid er ligegyldig og
'optimering' koster tid i den sidste ende.

Gå efter overskuelig kode i stedet.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Kim Ludvigsen (10-07-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-07-07 14:37

Den 10-07-07 15.01 skrev Bertel Lund Hansen følgende:
> Kim Ludvigsen skrev:

Tak for koden!

> foreach (tekst as $smart_remark) echo $smart_remark;

Den der forstår jeg ikke, hvordan virker den? Skal det ikke være $tekst?

> Jeg er enig med Peter Brodersen i at CPU-tid er ligegyldig og
> 'optimering' koster tid i den sidste ende.

Efter min tilfældighedsgenerator til lki.dk er jeg blevet lidt mere
opmærksom på den slags. Men ok, jeg er så nok røget i den anden grøft nu.

> Gå efter overskuelig kode i stedet.

Som uøvet php'er synes jeg, den allerførste løsning fra Michael er meget
mere overskuelig og gennemskuelig end de andre - i hvert fald når
antallet af strenge ikke er større end en lille håndfuld.

--
Mvh. Kim Ludvigsen
Få en gratis tetris-klon i form af Tetrix.
http://kimludvigsen.dk

Bertel Lund Hansen (10-07-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-07-07 15:00

Kim Ludvigsen skrev:

>> foreach (tekst as $smart_remark) echo $smart_remark;

> Den der forstår jeg ikke, hvordan virker den? Skal det ikke være $tekst?

Jo til det sidste.

I PHP kan man gennemløbe et array på en speciel måde ved at bruge
foreach. Først i parentesen specificerer man hvilket array der
skal bruges, og efter "as" vælger man hvilket variabelnavn
elementerne skal kendes under. Metoden er dejligt overskuelig,
og relativt hurtig, *men* man må ikke glemme at man i så fald
arbejder med en kopi af arrayelementerne. Hvis man f.eks.
skriver:

(1)   foreach ($tekst as $smart_remark) $smart_remark=strtolower($smart_remark);

så bliver man slemt skuffet når man senere bruger arrayet igen.
Der er intet ændret. Følgende generelle metode gør det samme som
før, men her vil ændringer slå igennem:

(2)   for ($nr=0; $nr<(count($tekst); ++$nr) $tekst[$nr]=strtolower($tekst[$nr]);

Man kan også kombinere dem fordi foreach tillader at man også
navngiver nøglen ($nr i eksempel 2):

(3)   foreach ($tekst as $nr => $smart_remark) $tekst[$nr]=strtolower($smart_remark);

=> bruges mellem nøgle og element (som ved et associativt array).

Opsamling:
(1) kan bruges hvis man kun skal aflæse værdierne.
(2) og (3) er lige gode hvis man har brug for at ændre værdierne
inde i løkken. De kan naturligvis også bruges selv om man kun
vil aflæse.

Det er en rigtig lusket fejl at glemme at foreach kun serverer en
kopi. Som begynder er det måske bedst at bruge (2) konsekvent
fordi det er den du vil kunne genkende i mange andre sprog.

>> Gå efter overskuelig kode i stedet.

> Som uøvet php'er synes jeg, den allerførste løsning fra Michael er meget
> mere overskuelig og gennemskuelig end de andre -

Nu skal jeg vise dig hvad censuren slettede i mit foregående indlæg:

========
Gå efter overskuelig kode i stedet. Løkker er overskuelige.

- [Brok]

Jo, de er!
========

Fidusen ved løkken er at dens struktur viser at det er det samme
der sker hver gang. Hvis du derimod laver tre linjer med tre
tildelinger, kan det i princippet være ret forskellige ting der
sker.

Derfor skal du vænne dig til at opfatte en løkke som en velkendt
enhed, og når du når dertil, vil den være mere overskuelig end
en udrullet stribe sætninger.

Jeg bruger løkker også ved to gennemløb. På Fidusos statistikside
har jeg f.eks. opdelt fornavnene i pige- og drengenavne. Nå der
skal laves udskrift, står der så:

   foreach ($sexes as $sx => $sex) {
      blablablablablabla
   }

(Her er $sx nøglen, og $sex er det element jeg skal aflæse (faktisk selv et array)).

Det er overskueligt fordi løkkestrukturen fortæller at vi først
tager pigerne og derefter drengene (eller omvendt). Den
forståelse ville man ikke kunne fange i ét blik hvis løkken
var rullet ud.

Okay, nu sker der en hel del inden i den løkke, men pointen
er også gyldig også ved mindre eksempler.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Kim Ludvigsen (10-07-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-07-07 17:17

Den 10-07-07 16.00 skrev Bertel Lund Hansen følgende:

> (1)   foreach ($tekst as $smart_remark) $smart_remark=strtolower($smart_remark);
> (2)   for ($nr=0; $nr<(count($tekst); ++$nr) $tekst[$nr]=strtolower($tekst[$nr]);
> (3)   foreach ($tekst as $nr => $smart_remark) $tekst[$nr]=strtolower($smart_remark);
>
> Opsamling:
> (1) kan bruges hvis man kun skal aflæse værdierne.
> (2) og (3) er lige gode hvis man har brug for at ændre værdierne
> inde i løkken. De kan naturligvis også bruges selv om man kun
> vil aflæse.

Mine eksisterende løkker ligner (2), men jeg kan vist roligt bruge (1),
der ser mere overskuelig ud. Jeg skal vist ikke genbruge mine arrays.

> Nu skal jeg vise dig hvad censuren slettede i mit foregående indlæg:

Du mener ud over $'et i $tekst?

> Derfor skal du vænne dig til at opfatte en løkke som en velkendt
> enhed, og når du når dertil, vil den være mere overskuelig end
> en udrullet stribe sætninger.

Jeg må erkende, at jeg ikke er nået dertil endnu. Men (1) ser helt klart
mere overskuelig ud end den udgave af (2), jeg har i øjeblikket.

Og al den snak om censur - man skulle jo næsten lave et medie, der er
helt fri for censur. Det kunne fx laves i form af en netavis...

--
Mvh. Kim Ludvigsen
Læs om nyhedsgrupperne, hvordan de opstod, hvordan de bruges, og læs
også et interview med en af superbrugerne.
http://kimludvigsen.dk

Peter Brodersen (10-07-2007)
Kommentar
Fra : Peter Brodersen


Dato : 10-07-07 22:48

On Tue, 10 Jul 2007 16:00:27 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Det er en rigtig lusket fejl at glemme at foreach kun serverer en
>kopi. Som begynder er det måske bedst at bruge (2) konsekvent
>fordi det er den du vil kunne genkende i mange andre sprog.

Hvis man stadigvæk foretrækker at bruge foreach, så kan man i PHP5
lave en reference i stedet for at arbejde på en kopi ved at bruge &:

foreach ($arr as &$value) {
$value = $value * 2;
}

--
- Peter Brodersen
Kendt fra Internet

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste