Beginnende met classes
Ik volg sinds een jaar de opleiding Applicatieontwikkelaar, en ben me, voordat ik na de zomervakantie op stage ga, aan het verdiepen in classes e.d. Hier heb ik voorheen nog niet mee gewerkt, en ik weet er dus nog vrij weinig vanaf.
Nu heb ik het onderstaande script gemaakt (gebaseerd op een script dat ik op internet had gevonden), maar nu wil ik een query uitvoeren. Ik heb echter geen idee hoe ik dit kan doen.
Kunnen jullie me een beetje op weg helpen? :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
class Connection
{
protected $username;
protected $password;
protected $db;
public function __construct($u, $p, $d)
{
$this->username = $u;
$this->password = $p;
$this->db = $d;
$mysqli = new mysqli('localhost', $this->username, $this->password, $this->db);
if($mysqli->connect_error)
{
die('Error: '.$mysqli->connect_error.'');
}
if(mysqli_connect_error())
{
die('Error: '.mysqli_connect_error().'');
}
$mysqli->close();
}
}
$loadDb = new Connection('', '', '');
?>
class Connection
{
protected $username;
protected $password;
protected $db;
public function __construct($u, $p, $d)
{
$this->username = $u;
$this->password = $p;
$this->db = $d;
$mysqli = new mysqli('localhost', $this->username, $this->password, $this->db);
if($mysqli->connect_error)
{
die('Error: '.$mysqli->connect_error.'');
}
if(mysqli_connect_error())
{
die('Error: '.mysqli_connect_error().'');
}
$mysqli->close();
}
}
$loadDb = new Connection('', '', '');
?>
Het is soms net tekst verklaren.
Je constructor __construct() is vooral ingericht op het openen van een databaseverbinding met $mysqli = new mysqli(…), maar eindigt met $mysqli->close(). Probeer eerst eens te doorgronden wát hier nu eigenlijk precies gebeurt en waarom dat dus zo nooit gaat werken.
Bijvoorbeeld function query($string).
En daarin voer je dat uit.
Als result geef je dan de resultaten van de query (hetzij een array met data, hetzij een true/false) terug.
Een verwijzing naar het object wat geretourneerd wordt door new mysqli(...), wat de connectie met je MySQL database representeert, is daarentegen wel interessant om op te slaan. Hier kun je dan namelijk aan refereren in de rest van je klasse.
En als je dan toch een wrapper schrijft die gebruik maakt van MySQLi en de communnicatie met je database zou moeten vereenvoudigen, zou je nog aan de volgende zaken kunnen/moeten denken:
- extra connectie-parameters: hostname (hiervoor kun je beter een IP-adres gebruiken dan een hostname, dit scheelt je weer een lookup), poort, character encoding (met name dit laatste is ZEER BELANGRIJK)
- een shorthand voor de _real_escape_string() functie of methode (als je niet gaat voor prepared statements, die nogal brak zijn in MySQLi)
- een aparte klasse voor mysqli_result objecten
- het gebruik van exceptions in plaats van die()
Dat doet je school wel goed, want vriend van me gaat ook naar 2e van applicatie ontwikkelaar en die heeft allang OOP en Classes gehad. Zeker omdat dit ook handig kan zijn bij C#.
declaratie(s)
voorbeeld van gebruik
Zoals Ward aangaf: het bestuderen van (andermans) code kan op zichzelf al leerzaam zijn.
Gewijzigd op 18/07/2015 11:53:37 door Thomas van den Heuvel
@Ward: Hele goede tip, niet op gelet. Dankjewel.
@Eddy: Ga ermee aan de slag!
@Thomas Dankjewel :)
@PHP Maarten: Mijn PHP-leraar raakte halverwege het jaar overspannen en stopte tijdelijk (nu nog) met werken. Hierna hebben wij alleen praktijkopdrachten gehad van een vervangende leraar.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
class db
{
protected $mysqli;
public function __construct()
{
$this->mysqli = new mysqli('localhost', '', '', '');
if($this->mysqli->connect_error)
{
echo $this->mysqli->connect_error;
}
if(mysqli_connect_error())
{
echo mysqli_connect_error();
}
}
public function __destruct()
{
mysqli_close($this->mysqli);
}
public function qr($fields, $col)
{
$array = '';
$i = 0;
foreach($fields as $each)
{
++$i;
if($i == count($fields)){
$array .= $each;
}
else
{
$array .= $each.', ';
}
}
$qr = mysqli_query($this->mysqli, 'SELECT '.$array.' FROM '.$col.'');
if($qr)
{
echo '<table>
<tr>';
while($row = mysqli_fetch_assoc($qr))
{
foreach($row as $colmn => $val)
{
echo '<td>'.$val.'</td>';
}
}
echo '</tr>
</table>';
}
else
{
echo 'Error';
}
}
}
$db = new db;
echo $db->qr(array('id', 'name', 'email'), '');
?>
class db
{
protected $mysqli;
public function __construct()
{
$this->mysqli = new mysqli('localhost', '', '', '');
if($this->mysqli->connect_error)
{
echo $this->mysqli->connect_error;
}
if(mysqli_connect_error())
{
echo mysqli_connect_error();
}
}
public function __destruct()
{
mysqli_close($this->mysqli);
}
public function qr($fields, $col)
{
$array = '';
$i = 0;
foreach($fields as $each)
{
++$i;
if($i == count($fields)){
$array .= $each;
}
else
{
$array .= $each.', ';
}
}
$qr = mysqli_query($this->mysqli, 'SELECT '.$array.' FROM '.$col.'');
if($qr)
{
echo '<table>
<tr>';
while($row = mysqli_fetch_assoc($qr))
{
foreach($row as $colmn => $val)
{
echo '<td>'.$val.'</td>';
}
}
echo '</tr>
</table>';
}
else
{
echo 'Error';
}
}
}
$db = new db;
echo $db->qr(array('id', 'name', 'email'), '');
?>
Dit is tot nu toe het resultaat, en het werkt. Tips zijn alsnog welkom!
Want die geef je niet eens op.
Daarbij gebruik je $col (van $column?) voor je tabel (wat dus geen kolom is!).
Ik kan me niet voorstellen dat bovenstaande code, zoals hierboven weergegeven, het doet.
Daarnaast doorloop je $fields (welke een array is) om hetzelfde te doen als implode(", ", $fields).
Dat kan dus efficienter.