FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Flitig postare
|
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. |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Flitig postare
|
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? |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Flitig postare
|
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. |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
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 Senast redigerad av Conny Westh den 2013-06-13 klockan 20:41 |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Klarade millennium-buggen
|
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.... |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Medlem
|
Citat:
PHP-kod:
|
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Flitig postare
|
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? Senast redigerad av Legendarisk den 2013-06-14 klockan 09:36 |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Nykomling
|
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! |
||
![]() |
![]() |
Svara |
|
|