![]() |
Funktion för att connecta till Mysql databas
Hej,
Håller på att snickra ihop ett simpelt inloggnings system i PHP och försöker göra själva kopplingen till databasen så enkel som möjligt. Jag har flertalet funktioner vid själva inloggningen som behöver connecta till databasen (exempelvis kolla att username finns osv). Därför har jag gjort en egen funktion för detta i en separat fil som ser ut som följande: PHP-kod:
varav de andra funktionerna sedan använder db för att köra queryn. Det jag undrar är om det är ok i olika avseenden att göra på detta sätt, eller finns det något annorlunda sätt som är att föredra? Tänker på både säkerhetsaspekter och hastighet. Tack på förhand. |
Jag brukar lägga upp en klass för varje DB och minst en klass för varje tabell.
i Klassen DB har jag enmetod som heter connect(userid) och som returnerar endera databasconnection eller true/false. Sen har jag en ytterligare en metod i DB-klassen som heter getConnection() och som returnerar senaste Connection till databasen (Connection finns lagrat som en property i klassen DB). Om connection är NULL så skapas en ny Connection annars returneras den som finns. Då kommer det bara finnas en Connection till databasen i varje session. Det är lite olika om man använder en användarspecifik userid vid inloggning mot dataasen eller om man har en applikationsspecifikt userid för att logga på databasen. Man får skilja på användarens inloggning mot applikationen eller applikationens inloggning mot databasen. Det finns flera olika varianter man kan använda. |
Ok, tack för svaret Conny.
Men vad tror du om mitt sätt att göra det på, är det osmidigt eller fungerar även det? |
Ok tack återigen.
När du säger att du lägger upp en klass för varje DB, har du lust att ge exempel på hur en sådan klass kan se ut? Framförallt vilka klassfunktioner och själva contructorn ser ut. När du sedan exempelvis ska connecta när någon loggar in, skapar du då en instans av den klassen i själva funktionen? Hoppas du förstår hur jag menar. |
Det är delvis OK men du kan bygga ut det med mer funktionalitet så du använder det objektorienterade tankesättet ännu mer...
Du bör dock undvika att ha en massa echo, dvs UI-kod i databasklasser. echo ska bara förekomma i UI-klasserna eftersom det skickar ut info på skärmen till användaren. Du bör ha 3 skikt i din applikation: UI-skitet (kan även kallas VIEW-skiktet i MVC-modellen): ------------------------------------------------------ - Ok med UI-kod - Ingen kod specifik för en enskild databas - Ingen SQL-kod - Anrop till logik-skiktet aldrig till Data-skiktet Logik-skitet (Control-skiktet i MVC-modellen) ------------------------------------------- - Ingen UI-kod - Ingen kod specifik för en enskild databas - Ingen SQL-kod - Anrop till Data-skiktet aldrig till UI-skiktet - Detta skikt "döljer" komplexa databasfrågor för UI-skiktet. Data-Skiktet (kan även kallas för modell-skiktet i MVC-modellen) ------------------------------------------------------------- - Ingen UI-kod - OK med databasspecifik kod - OK med SQL-kod - Vet inget om UI eller Logik-skitet |
Citat:
Däremot blir det en egen instans av varje tabell-klass för du kan ju exempelvis ha två olika instanser av klassen Person uppe samtidigt med olika data, men de är kopplade mot samma databas. Ska se om jag hittar något enkelt exempel för att visa vad jag menar.... Men det finns ramverk som Hybernate och andra som gör just detta.... |
Citat:
PHP-kod:
|
Citat:
Vad innebär det att vi sätter $db till NULL där i början? Skulle ett alternativ kunna vara att man kör $db->close() i funktionerna som anropar connect_to_db funktionen? |
Citat:
så att sätta den till null görs bara första gången den används. Nästa gång funktionen anropas hämtas den befintliga Connection och du får därmed bara en Connection till databasen, vilket spar resurser och exekveringstid. |
Hej Legendarisk!
Jag tycker din approach fungerar och om du inkluderar db-filen på de sidor du hämtar data ifrån kommer det också fungera bra oavsett metoderna OOP eller procedurbaserad programmering. Om du ska skriva klasser/funktioner som nämns ovan tycker jag att du istället för mysqli tittar på PDO connections istället. Då uppnår du minst två saker. 1, du kan byta databasleverantör när du vill och 2 grundläggande sql-injectionskydd om du använder dig av prepare() metoden. PDO har de nödvändiga klasser för att du skall kunna bygga och gå vidare. Enda tråkiga som jag upplever är att du inte kan få sql-frågan utskriven (pratbar) om du använder execute() metoden. Men det löser man på annat sätt. Tänk också såhär. När dagen är slut finns det två sorters kod, den som fungerar och den som inte fungerar. Sensmoralen är nog att; bygg på, skapa intressanta webblösningar och bli framgångsrik. Men såklart är eftertanke redan innan man startar att föredra men låt inte det bli ett ok bara. Citat:
Ge järnet! |
Om du vill undvika att anropa en connect funktion när db används så kan enkapsulera denna funktionalitet, t.ex i en basklass, och ha en eller flera olika dataklasser
class MyData extends BaseData { public function getSomething($id) { return $this->db->getRow("SELECT * FROM table WHERE id=? LIMIT 1", $id); } } $o = new MyData (); $row = $o->getSomething(); echo $row->column1; |
Citat:
Därmed tycker jag det är svårt att svara på frågan i tråden. Vill man hjälpa till att snygga till en funktionell röra så gott det går (som de flesta), eller vill man hjälpa till att skapa en vettig struktur (som ConnyWesth). Däremot håller jag med dig om PDO, av lite andra anledningar. MySQLi har också prepared statements som är lika säkra. Och att byta databas för ett långlivat projekt är till 99% att skriva om frågor och struktur. Att köra ett par regexp replace över kodbasen gör inte stor skillnad. Däremot har PDO ett par funktioner som mysqli saknar. T ex lite smidigare vid flera parametrar till prepared statements och möjligtheten att direkt mappa mot ett eget objekt (motsvarigheten hos PDO mappar till en stdClass). |
Tack för alla svar! Verkligen intressant att ta del av era tankar.
Jag håller mest på att leka och lära mig med diverse hobbyprojekt, men känns alltid bra att lära sig rätt från början av er som har mer vana. |
Legendarisk: Fortsätt experimentera och ha kul. När du säger att du vill lära "rätt" från början så har du inte fel i sak men jag tror på mängdträning allra först. Tanka ner färdiga skript, ändra någon klass eller metod och spinn vidare. En sak man lär sig efter ett tag är att det som är rätt idag kan vara helfel imorgon. Som militär ambulansman fick jag lära mig 15-2 metoden vid hjärt-lungräddning och idag är det någon annan kombination som gäller. Spelar roll om personen lever när kvällen är slut eller hur!
Skicka pm så ger jag dig gärna min skype och kan hjälpa mer hands-on om det behövs. Ha en god och behaglig kväll! OT: Angående Clerence kommentar och för din egen del ta gärna del av vad andra tycker om ämnet OOP och mer rakt-på-sak programmering som procedurell programmering kanske kan kallas. Jag tycker Java är vackert språk men jag får mer gjort med Php men har igentligen ingen religös åskådning om ämnet som sådant. Men att säga att man tycker procedurbaserad programmering rockar 2013 betyder att man genast ska brännas på bål anno 1498 i Spanien. För webben är procedurprogrammering mer naturlig tycker jag. Men alla tycker olika såklart. Länk: http://www.rebol.com/cgi-bin/blog.r?view=0425 |
Jag håller med Clarence om att den Objektorienterade paradigmen är den mest logiska att välja om man vill jobba med programmering över huvud taget.
Det gamla sättet att skriva kod "den imperativa" paradigmen är så obsolete den kan bli. Strunta i att gå omvägar via dessa crappiga exempel som beskriver Imperativa lösningar, sök efter de objektorienterade, använd gärna PDO för databasaccess eller andra objektorienterade sätt att skriva kod. |
Citat:
Men för all del, jag har inget emot att man börjar med dålig kod. Huvudsaken är att man börjar, fortsätter och man vill röra sig framåt. Därför jag tycker frågan i tråden är svår. Jag har också skrivit dålig kod, det hör till att man har en personlig utveckling. Själv skriver jag bättre kod för varje år som går trots att jag jobbat mestadels med PHP i över 10 år (med hobbyprojekt och mindre projekt i en mängd andra språk, förvisso). Att du tror att man ska använda Java för att skriva objektorienterad kod tyder på väldigt liten erfarenhet på området. Själv jobbar jag objekt-orienterat med PHP sedan många år, liksom mina kollegor. Inte sagt att det är perfekt kod för att det är objektorienterat, men det ger förutsättningarna att växa till en bra nivå. För 5-10 år sean var PHP communityn förvisso väldigt omogen inom området och man har på något dumt sätt på den profesionella nivån lärt sig själv det som t ex Java-communityn lärde sig fem år tidigare. Men det kanske också handlar om PHPs ursprung. |
Kamrater Conny o Clarence!
Er kod är bra och min kod är bra. Denna tråd börjar utveckla sig till en religiös åskådning. Jag menade bara att användaren Legendarisk skulle utforska sina möjligheter och inkludera det sätt han vill för att kunna prata med just sin databas. Du Clarence är "administrator" vilket bör göra att du kan elevera frågan till en högre och mer abstrakt nivå. Jag tycker inte du eller Conny har fel. Men jag tycker Clarence är partisk. Jag har väl aldrig sagt att man ska börja med dålig kod? Procedurbaserad kod är väl det de flesta flygplan, pensionssystem och andra rätt ändamålsenliga system jobbar med? De mest rudimentära systemen bygger på metoder som bevisats hålla under mycket lång tid. Jag håller nog med Carl Sassenrath att de flesta OO projekten har mycket svulstig kod och därmed blir svår att underhålla. De som inte håller med Carl kan ju alltid argumentera på hans blogg! Jag tror Carl har mer erfarenhet än de flesta av oss med tanke på att han utvecklat ett flertal operativsystem och programmeringsspråk. Vad jag menar med att webben i sig är mer procedurell än t.ex. en Windowsprogram är att varje klick som laddar om en sida instansierar sig själv och därmed förlorar du OOP vid varje klick. $newFow = new Form(); förlorar lite av sin charm där tycker jag iaf. Häxprocesser och imperativ förföljelse är inte adekvat här. Användaren 'Legendarisk' vill veta vilket sätt som bäst lämpar sig. Vi har alla tre och fler därtill visat på ett flertal sätt ur flera olika vinklar hur du kan kontakta databasen. Det är väl bra? Nu är detta ett glömt kapitel för mig. Som Clarence och Conny indirekt säger...må bästa program tjäna mest pengar ;) Hoppas Legendarisk och andra läsare fick hjälp, jag skickar gärna min skype om du behöver hjälp. |
Här kommer ett exempel på kod för att använda den objectoerienterade paradigmen för PDO och getConnection ()-metoden.
Det här är bara ett enkelt exempel på hur man kan göra. Jag har även lagt in felhantering med 'try {} Catch {}'.... Jag har valt att göra metoden getConnection() static så det inte går att skapa mer än en instans, som i sig görs genom att Connection bevaras i en static deklarerad variabel som jag initierar till null (static $dbconnection = null). I detta fall heter min databas 'Test' därav namnet 'ApplicationDatabaseTest', om jag använder flera databaser i min applikation så kan jag enkelt kopiera denna klass och om jag exempelvis har en annan databas som heter 'Webbshop' så skulle klassen kunna heta 'ApplicationDatabaseWebbshop' . För att hämta Connection så skriver man så här från sina anrop: Kod:
$dbConn = ApplicationDatabaseTest::getConnection(); Kod:
<?php |
Här kommer mer exempel på hur man kan lägga upp en klass som jobbar mot en specifik tabell.
Just den här tabellen heter Players och har tre kolumner. Först lite DDL-script för databasen. Kod:
delimiter $$ Och så här kan man bygga den tabellspecifika klassen. Jag har bara gjort denna enkel så den returnerar resultatsetet men man kan givetvis plocka ut de intressanta värdena och returnera dem som andra objekt eller datatyper beroende på vad man vill ha och vad som blir enkelt att använda i sin applikation. Det här är bara vad jag slängde ihop i går kväll och lite editeringar nu på förmiddagen, så jag har inte ägnat särskilt mycket tid åt det. Kod:
<?php |
Jag använder en autoloader som ligger i underkatalogen 'lib':
Kod:
<?php Kod:
<?php |
Tusen tack Conny! Ska experimentera lite med dina klasser. :)
|
Alla tider är GMT +2. Klockan är nu 04:41. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson