Avatar billede ggxdg Nybegynder
26. august 2011 - 10:56 Der er 14 kommentarer og
1 løsning

mysql results funktion

Ahoy - jeg keder mig lige lidt, og har ikke mulighed for at teste flg. ligenu.

function mysql_p($query, $content, $prefix = "", $suffix = "", $arrt = "MYSQL_ASSOC", $db = "my_fancy_default_db") {
  $db_selected = mysql_select_db($db);
  if (!$db_selected) {
    return mysql_error();
  }
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result, $arrt)) {
    foreach ($row as $key => $elem) {
      ${$key} = $elem;
    }
    $returnvar .= $content;
  }
  return $prefix . $returnvar . $suffix;
}

mysql_p("SELECT foo, bar FROM foobar WHERE foo = $bar","<tr><td>${'foo'}</td><td>${'bar'}</td></tr>\n","<table>\n","</table>\n");


Det er egentligt bare for at lege lidt rundt, og for at lave en funktion, som med en simpel linje kan parse resultatet fra en query så fleksibelt som muligt.

Der er med garanti bedre måder at gøre det på, og da koden ovenfor som sagt er utestet, er der muligvist nogle syntax-fejl.

Hvordan ville du/i løse ovenstående?

Her er lige et par tillægsspørgsmål:
1.) når "${'foo'}" bruges i funktionskaldet, vil PHP så ikke brokke sig over at den ingen værdi har?
2.) vil "foreach ($row as $key => $elem) {${$key} = $elem;}" sløve scriptet rigtigt meget? (Det kommer naturligvist an på antallet af elementer i $row, og sikkert størrelsen af disse, men er det f.eks en fordobling af eksekveringstiden?)
3.) ville f.eks. "return $row;" beholde sine assosiative keys? (i det her tilfælde, ville det selvfølgeligt være irrelevant, da hvis man valgte at gøre det, ville hele idéen med funktionen bare være redundant).

Smider lige en god stak point på, for der er ikke rigtig nogen desideret løsning på ovenstående, da det i øjeblikket er et tankeeksperiment, og ikke et egentligt problem - så folk kommer nok til at dele lidt :)
Avatar billede vagnk Juniormester
26. august 2011 - 13:19 #1
Jeg kan ikke se den store forskel i at lave et normal while-loop og så din function.

Du selecter din DB hver gang du laver en query. Det kunne man måske leve med hvis ens kode flintrede rundt i forskellige databaser.

Du laver et foreach-loop inden i et while-loop. Uden at teste vil jeg tro at du i bedste fald kører loopet igennem med antal rækker * antal rækker. Men det er sikkert en detalje der hurtigt kunne rettes. Men jeg synes stadig du lægger en unødvendig frakke uden på et normalt loop uden at der er nogen synlig gevinst.

Dertil kommer at jeg har et problem med kan parse resultatet fra en query så fleksibelt som muligt.. I mine øjne er der ikke tale om at parse (i betydningen undersøge/analysere), men om at sætte resultatet ind i en tabel. Hvordan vil du reagere hvis det er nødvendigt at handle på indholdet af 'foo' eller 'bar'. Hvis f.eks. 'foo' med værdien -1 skal springes over eller highlightes?
Avatar billede ggxdg Nybegynder
26. august 2011 - 14:45 #2
Det med db'en er for så vidt heller ikke nødvændig, det var nu bere for at have den med, men den kan skrottes.

foreach loopet er for at man ikke er nød til at kende navnet på "$row"-variablen, men den er som du siger, overhovedet heller ikke nødvendig.

Mht parsing - har åbenbart ikke lige haft den rette viden om hvad det betød, troede egentligt bare det var at "behandle/præsentere en datastrøm" - jeg ved ikke lige hvordan jeg bedre skal forklare det, men så kunne man da lige blive det klogere :)

Det behøver ikke nødvendigvist at være en tabel, det kan i princippet være alt.

I første omgang er det egentligt bare meningen at det skulle være en simpel måde at præsentere data der er hentet fra en database, om det er en menu, eller noget tekst, eller en poll, bør egentligt at være underordnet.

function mysql_p($query, $content, $prefix = "", $suffix = "", $arrt = "MYSQL_ASSOC") {
  $result = mysql_query($query);
  while ($row = mysql_fetch_array($result, $arrt)) {
    $returnvar .= $content;
  }
  return $prefix . $returnvar . $suffix;
}

mysql_p("SELECT foo, bar FROM foobar WHERE foo = $bar","<tr><td>$row['foo']</td>\n<td>$row['bar']</td></tr>\n","<table>\n","</table>\n");

mysql_p("SELECT link, item FROM menu","<li><a href='$row['link']'>$row['item']</a></li>\n","<ul>\n","</ul>\n");

mysql_p("SELECT a.*, COUNT(c.id) AS cCnt FROM news AS n LEFT JOIN comments AS c ON ( c.id = n.id ) GROUP BY n.id ORDER BY id DESC LIMIT $start, $limit","<div>\n<div>\n$row['a.title']\n</div>\n<div>\n$row['a.author']\n</div>\n<div>\n$row['cCnt']\n</div>\n</div>\n","<div>\n","</div>\n");



Det kunne jo være rigtigt fedt at lave noget som kunne reagere på resultatet, eller f.eks. tilføje mulighed for at funktionen selv kunne fylde kollonner, hvis der var et ukendt nummer af disse, eller noget i den retning. Men som sagt er det nu egentligt bare for at rode lidt rundt jeg laver det her, så der er ikke rigtigt nogen krav til funktionen, som vel også sagtens kunne have været en class.
Idéen til at starte med var at lave en enkel funktion, som kunne præsentere al data, i stedet for enten at skrive et whileloop, med queries, eller en ny funktion, hver eneste gang man skal plukke lidt data ud.
Avatar billede olebole Juniormester
26. august 2011 - 17:54 #3
<ole>

Hvis man ikke kender antallet af kollonner, så kan man vist roligt sige, man "bare roder"  *o)

Er der i øvrigt en årsag til at bruge mysql_fetch_array? Såvidt jeg kan se, bruger du slet ikke dens talindekserede array, så mon ikke du bør bruge mysql_fetch_assoc i stedet?

/mvh
</bole>
Avatar billede ggxdg Nybegynder
26. august 2011 - 18:26 #4
#3 "$arrt" - variablen specificerer MYSQL_ASSOC (default) eller MYSQL_NUMROW, hvis den er defineret i funktionskaldet.
Du har ret i at den i øjeblikket ikke bruges, jeg smed den ind i tilfælde af at funktionen evt. blev udvidet til selv at kunne smide data ind imellem nogle seperatorer, så man med meget lidt kode eksempelvis kunne outputte nogle store tabeller.
Set i retrospekt er der nok ikke megen brug for det, for det er sjældent at man outputter al dataen i en tabel, så du har helt ret.
Men som sagt, er mysql_fetch_array som default i min funktion begrændset til MYSQL_ASSOC.

function mysql_p($query, $content, $prefix = "", $suffix = "", $arrt = "MYSQL_ASSOC") {
while ($row = mysql_fetch_array($result, $arrt)) {

men jo, man kan da spare lidt kode,ved bare at definere den som ASSOC fra starten.


Er der egentligt nogen forskel i performance på associative arrays ift. talindekserede arrays? Ummidelbart har jeg en idé om at talindekserede arrays er en lillesmule hurtigere, men jeg aner det ikke.
Avatar billede olebole Juniormester
26. august 2011 - 18:42 #5
Det kommer i høj grad an på, hvordan de bruges - og til hvad. Der er f.eks. ret meget forskel på for og foreach
Avatar billede vagnk Juniormester
26. august 2011 - 19:05 #6
forskel i performance på associative arrays ift. talindekserede arrays?

I gamle dage (med 8-bit CPU'er og adressebus) kunne det have stor betydning om en variabel var defineret som tegnet "0" eller tallet nul. Skulle variablen bruges til det ene eller andet skulle den castes (ændre type) inden brugen. I dag er fortolkere som php så intelligente at de caster on-the-fly og CPU'ernes clock-frekvens så hurtig at det nærmer sig et akademisk spørgsmål.

Æhem - tror jeg! Jeg vil i hvert fald lægge større vægt på kodens læsbarhed end akademiske nanosekunder.
Avatar billede ggxdg Nybegynder
26. august 2011 - 23:26 #7
#5 man kan vel ikke bruge et associativt array direkte i et for loop?
Foreach kan vel bruges med alle typer arrays.

Er der altid stor forskel på for og foreach, kan man f.eks. sige at det i alle tilfælde er bedre at bruge for end foreach, eller kommer det an på om det er associative, eller talindekserede, eller hvordan de bruges/misbruges?

#6 hehe, yeah. Jeg forstillede mig også at foreskellen er så lille at der skal nogle ret seriøse arrays til for at gøre nogen mærkbar forskel, og noget så stort arbejder jeg slet ikke i, så fra min kodnings synspunkt er det ret irrelevant, men man kan ligeså godt få fakta på plads, før man danner sig dårlige vaner. Under alle omstændigheder, agter jeg også at holde mig til associative arrys, så længe data ikke skal behandles automatisk af et script.
Avatar billede majbom Novice
27. august 2011 - 14:47 #8
det kan godt være at der ikke umiddelbart er forskel at mærke på for kontra foreach, men ved større array og flere (mange flere) brugere på én server (webhoteller o.l.) vil det nok kunne mærkes...

-> #7 - du KAN godt bruge en for-løkke på et ass. array - du kan hente keys ud med array-keys :)
Avatar billede olebole Juniormester
27. august 2011 - 17:43 #9
En god regel, som ikke kun knytter sig til programmering, lyder: "Alt, hvad man gør/bruger, bør være velovervejet og velbegrundet i forhold til den aktuelle situation og kontekst".

Folk med indsigt i den danske folkesjæl vil nok argumentere for, at reglen lyder ganske udansk og ude af takt med folkesjælden. Det gør den dog ikke spor dårligere  *D

Har du en god grund til at bruge et associativt array fremfor et talindekseret, bør du bruge et associativt. Ellers bør du bruge den mere simple konstruktion.

Har du en god grund til at bruge en foreach-løkke fremfor en for-løkke, bør du bruge en foreach. Ellers bør du bruge den simplere for-løkke.

Naturligvis er læselighed en ikke uvigtig parameter, men sålænge læseligheden ikke forringes væsentligt, bør man vælge den simpleste løsning til den enkelte opgave.

Og for lige at præcisere: en for-løkke er velegnet til talindekserede, mens en foreach er velegnet til associative arrays. Man kan sagtens lave krumspring, der vender op og ned på anvendelserne af array- og/eller løkketyper - men der skal som altid være en god grund  =)
Avatar billede vagnk Juniormester
28. august 2011 - 09:29 #10
Alt, hvad man gør/bruger, bør være velovervejet og velbegrundet i forhold til den aktuelle situation og kontekst

Kære ole: Gælder den ikke i alle livets forhold? Skrive brev, køre bil, elske med konen, gå i bad, på arbejdet osv osv?
Avatar billede olebole Juniormester
28. august 2011 - 14:33 #11
Lige præcis, men det ville nok hurtigt føre debatten for vidt i disse spalter  *o)

Jeg har aldrig set en person - et fotografi eller et spejlbillede af en - som har kunnet leve op til den ellers ret elementære grundregel.

Når jeg kikker i kode ude på nettet eller taler med folk om deres kode her på E, får jeg det indtryk, at kode meget ofte er yderst sparsomt overvejet og tyndt begrundet.

Prøv f.sks. at surfe med en Explorer, der er sat til at melde enhver scriptfejl. Det er ved at være undtagelsen fra reglen, når man kan se et site uden fejlmeddelelser. Den slags kan ret let undgås ved brug af ganske almindelige tanker hos udviklere(n)  *o)
Avatar billede ggxdg Nybegynder
24. januar 2012 - 10:36 #12
Jeg tror at det er på tide at få lukket denne tråd, tak for alle jeres inputs, smid et svar jer der vil ahve point, så lukker jeg den inden for den næste uge :)
Avatar billede olebole Juniormester
24. januar 2012 - 13:18 #13
Jeg samler ikke på points, så det må være andres  =)
Avatar billede majbom Novice
24. januar 2012 - 18:53 #14
jeg springer over
Avatar billede ggxdg Nybegynder
26. januar 2012 - 08:08 #15
Jeps - jeg lukker, der var ingen der ville have point.

Endnu en gang; tak for jeres inputs :)
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