frankhaugen Skrevet 18. april 2011 Del Skrevet 18. april 2011 Jeg har en kodebit jeg er lei av å kopiere opp et par hundre ganger i en SWITCH, så jeg ønsker å bruke OOP (Object Oriented Programming) for å gjør det om til en CLASS eller METHOD slik at jeg kan sende inn noen variabler og få ut et sett med verdier i en array som kan brukes i en FOREACH. (endel av koden er litt rotete da jeg fortsatt jobber med den og har ikke "pyntet den til") Kodebit: <?php //Parametere for MySQL query $fieldname = "kategori"; //Navnet på feltet som skal søkes i (Kategori/underkategori) $fieldparameter = ""; //Parameteren man skal søke $dbtable ="produkter"; //navnet på tabellen i databasen $orderparameter = "id"; //navnet på feltet som skal sorteres etter $orderby = " ORDER BY ".$dbtable.".".$orderparameter.""; //MySQL komando for sortering; HUSK: Mellomrom først, og evt ' DESC' for å gå fra høyest til lavest function db_connect() { $connection = mysql_pconnect('mysql5.uniweb.no', '#####', '#####'); if(!$connection) { return false; } if(!mysql_select_db('frankhau')) { return false; } return $connection; } //display lines located using array function db_result_to_array($result) { $res_array = array(); for ($count=0; $row = mysql_fetch_array($result); $count++) { $res_array[$count] = $row; } return $res_array; } //locate the product information function find_products() { db_connect(); $query = "SELECT * FROM produkter WHERE kategori='ringer'"; //TODO: gjør om statiske verdier til variabler $result = mysql_query($query); echo mysql_error(); $result = db_result_to_array($result); return $result; } //call function $products = find_products(); //display result foreach($products as $product) { $javascript = "location.href='index.php?produkt=".$product['id']."'"; echo //html code for a product row to be echoed out ' <div class="element" onclick="'.$javascript.'"> <a class"link" href="index.php?produkt='.$product['id'].'"><img src="images/productimg/'.$product['id'].'_small.jpg" /></a> <font>#'.$product['id'].' - '.$product['navn'].'</font><br /> <font>'.$product['pris'].',-</font> </div> '; } ?> Det jeg vil er at jeg kan fortsatt bruke FOREACH loop-en jeg har nederst i koden sånn at jeg kan forandre parameterene som går inn i MySQL query-en i forskjellige CASE-er i en SWITCH. Det beste vil være å gjør dette i samme fila om mulig. Dette vil gjør min jobbe 10 ganger lettere da jeg jobber med 20-30 CASE-er alle skal kontakte databasen for å hente ut data. OG det er en ypperlig anledning til å lære noe nytt. Noen som kunne tenke seg å demonstrere hvordan jeg kan løse dette? jeg fant ikke noe bra som beskrev dette med OOP i PHP godt nok. Takk på forhånd for hjelp! -frank Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 Ehm.. Hvor er switch'en som du snakker om? Lenke til kommentar
frankhaugen Skrevet 18. april 2011 Forfatter Del Skrevet 18. april 2011 Ehm.. Hvor er switch'en som du snakker om? SWITCH kommandoen er "utenfor" denne kodebiten, altså dette er 1 CASE av en SWITCH. Så switchen er irrelevant til hva jeg prøver å gjøre da hele poenget her er å unngå å ha en kode på 2000 linjer. U See?? Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 *blinks* oh jeez.. Hvorfor definerer du generiske funksjoner.. hvorfor definerer du funksjoner i det hele tatt inni en switch blokk? Forresten, tror det hadde vært greiere å brukt en array for slikt: $arr['case1'] = array("param1", "param2", "param3"); $arr['case2'] = array("param1x", "param2x", "param3x"); function doMagicStuff($blargh) { list($param1, $param2, $param3) = $blargh; // insert magic stuff here } if (isset($arr[$val])) { doMagicStuff($arr[$val]); } else { die("OMG HAX"); } Note: vært en stund siden jeg kodet PHP, så kan ikke garantere at koden ikke har syntax feil Lenke til kommentar
frankhaugen Skrevet 18. april 2011 Forfatter Del Skrevet 18. april 2011 *blinks* oh jeez.. Hvorfor definerer du generiske funksjoner.. hvorfor definerer du funksjoner i det hele tatt inni en switch blokk? Forresten, tror det hadde vært greiere å brukt en array for slikt: $arr['case1'] = array("param1", "param2", "param3"); $arr['case2'] = array("param1x", "param2x", "param3x"); function doMagicStuff($blargh) { list($param1, $param2, $param3) = $blargh; // insert magic stuff here } if (isset($arr[$val])) { doMagicStuff($arr[$val]); } else { die("OMG HAX"); } Note: vært en stund siden jeg kodet PHP, så kan ikke garantere at koden ikke har syntax feil Vel jeg definerer funksjoner inni en SWITCH block fordi det er det mest hensigtsmessige i denne sammenhengen, (SWITCH-en er de forskjellige listene man får opp fra en produktkatalog). Og din måte er kurrant men er bare en annerledes måte å gjør det på, som ikke er helt kopatibelt med andre elementer, tro meg jeg, liker ikke SWITCH men i mitt tilfelle er jeg nesten helt avhengig av den, ergo mitt ønske om å få rullet inn mine MySQL funksjoner i en CLASS jeg kan kalle på for å øke leslighet og gjør redigering enklere. men takk for forslaget! Lenke til kommentar
Thomas. Skrevet 18. april 2011 Del Skrevet 18. april 2011 <?php class Method { private static $navn; /** Kode i en funksjon **/ public static function Funksjon($var) { self::$navn = $var; echo 'Hei, ' . self::$navn . '!'; } } $var = 'case2'; switch($var) { case 'case1': Method::Funksjon('Ola'/** verdier for case 1 **/); break; case 'case2': Method::Funksjon('Per'/** verdier for case 2 **/); break; } ?> Noe slikt? Du har kun hoved-koden din en plass, og erstatter verdier i den i de forskjellige case'ene slik at du kan oppnå forskjellig funksjonalitet.. Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 (endret) function db_connect() { $connection = mysql_pconnect('mysql5.uniweb.no', '#####', '#####'); if(!$connection) { return false; } if(!mysql_select_db('frankhau')) { return false; } return $connection; } function db_result_to_array($result) { $res_array = array(); for ($count=0; $row = mysql_fetch_array($result); $count++) { $res_array[$count] = $row; } return $res_array; } Kan ikke se noen god grunn til at du må definere noen funksjoner inni en switch, men denne ser jeg virkelig absolutt ingen grunn i det hele tatt å ha inni switchen.. db_result_to_array kan forresten lett kastes vekk. Og bytte ut foreach blokken med while ($product = mysql_fetch_array($result, MYSQL_ASSOC)) { // foreach koden her.. Som burde være i en funksjon definert utenfor SWITCH'en, ikke copypasted. } og find_products() kan fint endres til find_products($sql) - og flyttes ut av CASE'n. Even better, find_products($table, $category) eller find_products($table, $field, $value) Det du da sitter igjen med inni case'n er : $products = find_products("produkter", "kategori", "ringer"); while ($product = mysql_fetch_array($result, MYSQL_ASSOC)) { display_product($product); } Som du igjen kan putte i en funksjon, så du har igjen display_products("produkter", "kategori", "ringer"); Endret 18. april 2011 av Terrasque Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 Generelt sett: 1. Finn ut alle ulike verdier for hver case. 2. Finn ut hvilke av de verdiene som kan hentes / lages fra andre verdier. 3. Lag funksjon(er) som utfører riktig logikk med de verdiene. Det er forsåvidt det samme som man trenger å gjøre for å putte logikken inn i en class. Du sier at det er grunner for at det må være slik, uten at noe av koden du viser har noen grunn til det. Så enten tar du feil, eller så har du gitt mangelfull informasjon Vanskelig å si hvilken, men siden vi bare har den informasjonen du har gitt å jobbe med, så må vi gi svar utifra det. Lenke til kommentar
frankhaugen Skrevet 18. april 2011 Forfatter Del Skrevet 18. april 2011 <?php class Method { private static $navn; /** Kode i en funksjon **/ public static function Funksjon($var) { self::$navn = $var; echo 'Hei, ' . self::$navn . '!'; } } $var = 'case2'; switch($var) { case 'case1': Method::Funksjon('Ola'/** verdier for case 1 **/); break; case 'case2': Method::Funksjon('Per'/** verdier for case 2 **/); break; } ?> Noe slikt? Du har kun hoved-koden din en plass, og erstatter verdier i den i de forskjellige case'ene slik at du kan oppnå forskjellig funksjonalitet.. YEAHY!! en som viser løsningen istede for å kritisere metodikken min Dette var mer eller mindre hva jeg så etter! Takk Thomas! Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller. Eneste class gjør er å gjøre det lettere å splitte logikken i mindre biter, og å passe rundt data imellom logikk-blokkene (og resulterer som oftest i en mer logisk struktur). Lenke til kommentar
Thomas. Skrevet 18. april 2011 Del Skrevet 18. april 2011 Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller. Enig der Du trenger ikke klasser i tilfellet ditt frankhaugen. Holder med en vanlig funksjon Men vis du heller vil prøve deg med klasser, så kjør på med det. Lenke til kommentar
frankhaugen Skrevet 18. april 2011 Forfatter Del Skrevet 18. april 2011 Klasser er ikke magiske, vettu. Hvis du ikke klarer å splitte det ut i funksjoner definert utenfor CASE'n, så klarer du ikke splitte det ut i en class heller. Eneste class gjør er å gjøre det lettere å splitte logikken i mindre biter, og å passe rundt data imellom logikk-blokkene (og resulterer som oftest i en mer logisk struktur). Poeng, men jeg må ta det bit for bit, desverre kan ikke ikke gi deg en "braindump" så du kan se logikken for å gjøre det slik, og din metodikk er et halvt lysår forann mitt nivå, for hadde jeg vært på ditt nivå hadde jeg ikke trengt å spørre , litt av det som er forvirrende som bar juling er hvordan det er 3-6 forskjellige måte å få samme resultat på, og jeg vil helst holde meg til det jeg kan før jeg svømmer i ny lære, og når jeg svømmer i ny lære vil jeg helst at dette er en dam og ikke et hav (jeg torturerte den metaforen gitt). Takk for innsatsen og jeg må ta meg tid til å gå igjennom dine forslag fordi de virker fornuftige men vil først forstå de i sitt fulle før jeg implementerer de. -frank Lenke til kommentar
Terrasque Skrevet 18. april 2011 Del Skrevet 18. april 2011 (endret) Sant det, forståelse er det viktigste Kanskje god grunn til å vente litt med klasser foreløpig. Jeg tror ikke det er noe behov for klasser i den koden der, og tror det vil forvirre mer enn hjelpe i øyeblikket. I øyeblikket tror jeg du bør refactore kode vekk fra case delene og ut i generelle funksjoner. Og ikke bare prøv ting til de funker, forstå hvorfor det funker (og om det ikke funker slik du forventet, finn ut hvorfor ikke). Edit : http://en.wikipedia.org/wiki/Code_refactoring && http://en.wikipedia.org/wiki/Code_smell Endret 18. april 2011 av Terrasque Lenke til kommentar
frankhaugen Skrevet 19. april 2011 Forfatter Del Skrevet 19. april 2011 Gjorde som dere sa, (for det meste), la hele driten inn i en funksjon, så for alle variablene jeg ville ha inn i sql query-en ditsjet jeg alt og brukte en query som parameter når jeg kaller funksjonen, (lettere siden det var nesten like mange variabler som ord i querien ) Frank er nå en happy liten gutt, og kan endelig gå videre til å takle flerdimensjonale arrays (bare vent jeg kommer nok med en post når jeg står fast og hodet vil dø litt) takk for hjelpen gutta! -frank Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå