Kom ihåg mig?
Home Menu

Menu


Funktion för att connecta till Mysql databas

 
Ämnesverktyg Visningsalternativ
Oläst 2013-06-13, 18:57 #1
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Standard 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:
function connect_to_db() {

    
$db = new mysqli('localhost''namn''lösen''databasen');

    
//Check db error
    
if (mysqli_connect_errno()) {
        echo 
'Sorry, we are experiencing connection problems.';
        exit;
    } 
    
    return 
$db;


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.
Legendarisk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 19:42 #2
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 19:59 #3
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
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?
Legendarisk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 20:26 #4
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
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.
Legendarisk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 20:33 #5
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 20:37 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Legendarisk Visa inlägg
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.
Du skapar bara en instans av DB-klassen, sen återanvänder du samma Connection i alla andra anrop mot samma databas.

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....
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-13, 22:27 #7
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Citat:
Ursprungligen postat av Legendarisk Visa inlägg
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:
function connect_to_db() {

    
$db = new mysqli('localhost''namn''lösen''databasen');

    
//Check db error
    
if (mysqli_connect_errno()) {
        echo 
'Sorry, we are experiencing connection problems.';
        exit;
    } 
    
    return 
$db;


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.
Din kod går utmärkt att bygga vidare på, det som gäller är bara att du inkluderar filen där funktionen finns + inte skapar en ny anslutning för varje fråga.

PHP-kod:
<?php
function connect_to_db() {
    static 
$db null;
    if (
is_null($db) || !$db->ping()) {
        
$db = new mysqli('localhost''namn''lösen''databasen');
        if (
mysqli_connect_errno()) {
            echo 
'Sorry, we are experiencing connection problems.';
            exit();
        }
    }
    return 
$db;
}
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-14, 09:33 #8
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Legendarisk Legendarisk är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2012
Inlägg: 359
Citat:
Ursprungligen postat av Jake.Nu Visa inlägg
Din kod går utmärkt att bygga vidare på, det som gäller är bara att du inkluderar filen där funktionen finns + inte skapar en ny anslutning för varje fråga.

PHP-kod:
<?php
function connect_to_db() {
    static 
$db null;
    if (
is_null($db) || !$db->ping()) {
        
$db = new mysqli('localhost''namn''lösen''databasen');
        if (
mysqli_connect_errno()) {
            echo 
'Sorry, we are experiencing connection problems.';
            exit();
        }
    }
    return 
$db;
}
Tack för tipset!

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
Legendarisk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-14, 09:48 #9
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Legendarisk Visa inlägg
Tack för tipset!

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?
Nej, en variabel som är static behåller sitt värde efter att funktionen avslutas
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-14, 10:44 #10
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
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:
Exempel på PDO
$db = new PDO('mysql:host='.$host.';dbname='.$database, $usr, $pwd);

Sedan kan en query se ut så här istället för tradiotionell mysqli_query()
$sql = "SELECT * FROM table
WHERE table.id =? ORDER BY name";

$params = array( $id );
$stm = $db->prepare($sql);
$stm->execute($params);

Ge järnet!
corneliisandberg är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 20:13.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017