Avatar billede googolplex Novice
05. marts 2005 - 13:15 Der er 11 kommentarer og
1 løsning

PHP5 (OO) og MySQLi

Jeg sidder og arbejder lidt med PHP5/MySQLi (OO style), og har et par spørgsmål i den forbindelse:

1. Hvis jeg har følgende:

$handle = new mysqli($server, $username, $password, $database);

Er $handle så et object, en resource eller begge dele ?

2. Jeg har en poll-klasse, der skal have forbindelse til MySQL. Hvad er smartest:

- At instantiere klassen med et gyldigt handle således:

$poll = new Poll($mysqlHandle);

- At lade klassen lave forbindelsen selv:

$poll  = new Poll($server, $username, $password, $database);

3. Hvad er den store fordel ved 'prepared statements' og i hvilke situationer bør man (ikke) benytte dette ?

4. Nogle der kender en god klasse til at arbejde med PHP5 (OO)/MySQLi ?
(Jeg kender selv PEAR:DB, PEAR:MDB, ADOdb, Propel og MyObjects.)
Avatar billede coderdk Praktikant
05. marts 2005 - 13:37 #1
1. Det er det et objekt.

2. Jeg ville foretrække at den lavede sin egen instans af databaseobjektet i sin constructor - en anden løsning ville være at lade poll nedarve fra mysqli ;)

3. Der er ingen grund til ikke at benytte prepared statements til alt ;)

4. Der må jeg melde pas ;) Jeg kender kun PEAR og ADOdb, men bruger ikke rigtigt nogle af dem...
Avatar billede googolplex Novice
05. marts 2005 - 14:22 #2
Kan du uddybe 2 og 3 lidt ?
Avatar billede coderdk Praktikant
05. marts 2005 - 14:46 #3
2. F.eks. smid dine mysql information er i en fil, mysql_defs.php med:

define( "MYSQL_HOST", "dinhost" );
define( "MYSQL_USER", "username" );
define( "MYSQL_PASS", "password" );

og i din poll class require filen og tilføj private $db; til klassen, og i contructor'en:

$this->db = new mysqli( MYSQL_HOST, MYSQL_USER, MYSQL_PASS, "dindatabase" );

eller lav en mysqli wrapper-klasse og lad din poll-class extende den...

3. Det vil da ikke skade at benytte prepared statements overalt? :)
Avatar billede googolplex Novice
05. marts 2005 - 15:01 #4
2. Det er præcis sådan jeg gør nu (bortset fra at jeg ikke laver forbindelsen i constructor'en, men kalder $this->connect, fordi man afaik ikke kan 'throw new Exception' i en constructor.)

3. Øhh, hvorfor ikke, hvad er den store fordel ?
Avatar billede googolplex Novice
05. marts 2005 - 15:01 #5
$this->connect(); - ;)
Avatar billede coderdk Praktikant
05. marts 2005 - 15:17 #6
2. Mjah, ok, ja du kan jo bare kalde connect før databasen skal bruges første gang...

3. Den store fordel er man helt undgår SQL-injections, og man vænner sig til at bruge den ;) Men man kan også bare bruge mysqli->query hvis man hellere vil det ;P
Avatar billede googolplex Novice
05. marts 2005 - 16:19 #7
OK, jeg prøver prepared statements, det ville jo næsten også være dumt andet, når jeg nu skal til at bruge mysqli for "første gang" ;)

Du skulle vel ikke have et godt fif/link til hvornår man skal kaste en Exception og hvornår man ikke skal? Jeg synes jeg kan kaste dem alle steder hvor der er den mindste mulighed for en fejl, det virker lidt voldsomt...

Læg et svar :)
Avatar billede coderdk Praktikant
05. marts 2005 - 16:32 #8
Well, det er vel et designspørgsmål - Throw dem hvor du gerne vil have mulighed for at håndtere dem ;)
Avatar billede googolplex Novice
05. marts 2005 - 16:37 #9
Sidste spørgsmål :) Sad lige og kiggede på https://www.zend.com/php5/articles/php5-mysqli.php.

Hvorfor i alverden er der ikke noget OO modstykke til mysqli_connect_errno()/mysqli_connect_error() ?

Det virker da lidt underligt, at man skal til at bruge disse 2 funktioner midt OO.
Avatar billede coderdk Praktikant
05. marts 2005 - 17:07 #10
Der er to modsvarende properties: $obj->errno og $obj->error
De er på http://dk2.php.net/mysqli :)
Avatar billede googolplex Novice
05. marts 2005 - 19:41 #11
Nej, det er modsvarende mysqli_errno() og mysqli_error(). Så vidt jeg kan se, er de ikke identiske med mysqli_connect_errno()/mysqli_connect_error(). Ellers ville de vil heller ikke skifte i eksemplet fra Zend. Eller er jeg gal på den ?
Avatar billede coderdk Praktikant
05. marts 2005 - 19:49 #12
Ja, det ser ud til at du har ret, det virker da lidt underligt har du ret i :P Men sådan er det åbenbart, eksemplet på php.net bruger også de to funktioner... Wierd og lidt plat ;)
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