24. april 2011 - 17:08Der er
13 kommentarer og 1 løsning
2 x MySQL-while driller
Hejsa. Jeg har 2 udtræk fra MySQL, hvor jeg skal printe alle værdierne. Jeg afvikler 2 x while - den anden "while" afvikles inde i den første, hvorfor den anden "while" skal køre flere gange. Men den kører kun første gang.
$sql ="SELECT `id` FROM `table1`"; //3 poster $res1 = database($sql); $sql ="SELECT `tal` FROM `table2`"; //5 poster $res2 = database($sql);
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
function database($sql){//Funktion der laver alm databasekald og returnerer resultatet $config = ini();//Hent databaseparametre mysql_select_db($config['db_base']); $res = mysql_query($sql); //Udfør forespørgsel if (!$res) {//Tjek om det gik godt die("<b>Databasefejl:<br></b>" . mysql_error() ."<b><br>MySQL-sætningen var:<br></b>". $sql);//Udskriv fejlmelding og stop udførsel } return $res;//Returner resultat af forespørgsel }
Det må være din logik der ikke passer. Hvad du gør i #0 er absolut ikke det samme som du gør i #3.
I #0 udfører du to sql forespørgsler lige efter hinanden - og så færdig. Resultatet af den anden forespørgsel forsøger du så at genanvende i en while to gange (tre gange i alt) og det kan du ikke med mysql_fetch_array() da indeks pointeren allerede er flyttet helt til slut i den resource.
Ydermere, giver det ikke umiddelbar mening at din database() funktion skal vælge database hver gang du kører funktion - det er unødvendig belastning af serveren. Funktionen sparer dig heller ingenting, da logikken må være at fin funktion alligevel skal gøre tre gange for at kunne gennemløbe den anden forespørgsel tre gange.
Et bedre alternativ ville være at gennemløbe den anden forespørgsel en gang, lægge indholdet i et array og iterere hen over det de tre gange.
@repox I langt de fleste programmeringsopgaver er det besværlige ikke at løse opgaven, men derimod at gøre det smart, effektivt og hurtigt. Du bruger her unødvendigt meget RAM, idet du gemmer al dataen to gange.
#11 Så vil jeg nok nærmere kalde det en holdningssag - det er ikke just hukommelsen jeg bekymrer mig om i sådanne tilfælde. Og ofte vil jeg heller ikke lægge en database funktionalitet sammen med output delen, men hellere have et abstraktionslag til at udføre det for mig i et lokalt scope som returnere et array eller objekt jeg kan behandle i stedet. Dette giver mig stadig en MySQL ressource der frigives efter funktionen er kørt.
#13 Jeg er bestemt ikke enig med dig. MySQL og PHP anvender ikke samme hukommelse, da de ikke bruger den samme proces. Så udover at man skulle skamme sig over at bruge blobs på 10MB, så er det også et performance-mæssigt spørgsmål som jeg mener falder uden for kategorien her.
For at hente trivielt data - tekst, varekataloger, nyheder og andet skrammel - ud, ser jeg det bestemt ikke som en fordel at bibeholde dataene i en ufleksibel MySQL-ressource. Derfor mener jeg at det er en holdningssag at ville optimere i forhold til RAM forbruget. Skulle det ske at mængden af data fra MySQL ville være et performance-problem vil jeg til enhver tid råde folk til at anvende cache-systemer.
Med andre ord; at du vil genbruge en MySQL ressource i det omfang du vil, er naturligvis op til dig. Jeg ser bare ikke selv nogen fordel i det og anvender derfor andre metoder som jeg mener giver mig den performance som jeg har behov for. Der er trods alt heller ikke kun en rigtig vej for at nå målet.
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.