Database interface klasse
Nu vraag ik me eigenlijk het volgende af. Ik heb in mijn connect() methode een extra stuk code gebouwd zodat er opnieuw verbinding wordt gemaakt, wanneer de verbinding om de een of andere reden wegvalt. Om te kijken of de, eerder geopende, verbinding nog open is gebruik ik de mysqli::ping() methode. Wanneer blijkt dat de verbinding niet meer open is, start ik een nieuwe verbinding door middel van de mysql::real_connect() methode. Is dit een correcte manier van handelen?
Mijn code en wat test code staan hieronder:
Index.php (testprogramma):
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
require_once "dbInterface.php";
$database = Database::getInstance();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
$database->killConnection();
echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
$database->killConnection();
$database->killConnection();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
if(!$database->isConnected()) {
$database->verbalizeErrors();
}
unset($database);
?>
require_once "dbInterface.php";
$database = Database::getInstance();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
$database->killConnection();
echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
$database->killConnection();
$database->killConnection();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
if(!$database->isConnected()) {
$database->verbalizeErrors();
}
unset($database);
?>
dbInterface.php (de interface klasse):
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
65
66
67
68
69
70
71
72
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
65
66
67
68
69
70
71
72
<?php
class Database {
/* Private variables */
private static $instance;
private $connection;
private $isConnected = false;
private $host = "localhost";
private $database = "PHPLearning";
private $username = "root";
private $password = "usbw";
/* Public variables */
/* Private methods */
private function __construct() {
}
/* Public methods */
public static function getInstance() {
if(Database::$instance == NULL) {
Database::$instance = new Database();
}
return Database::$instance;
}
public function __destruct() {
if($this->isConnected) {
$this->killConnection();
}
echo "Adios my friend<br />";
}
public function connect() {
if(!$this->isConnected) {
$this->connection = @new mysqli($this->host, $this->username, $this->password, $this->database);
echo "CONNECTING<br />";
} else if(!$this->connection->ping()) {
$this->connection->real_connect($this->host, $this->username, $this->password, $this->database);
echo "RECONNECTING<br />";
}
if(!$this->connection->connect_errno) {
$this->isConnected = true;
}
return $this->isConnected;
}
public function killConnection() {
if($this->isConnected) {
$this->connection->close();
$this->isConnected = false;
echo "CONNECTION KILLED<br />";
}
}
public function isConnected() {
return $this->isConnected;
}
public function verbalizeErrors() {
if($this->connection->connect_error) {
die("Connect error ".$this->connection->connect_errno.": ".$this->connection->connect_error."!<br />");
}
}
}
?>
class Database {
/* Private variables */
private static $instance;
private $connection;
private $isConnected = false;
private $host = "localhost";
private $database = "PHPLearning";
private $username = "root";
private $password = "usbw";
/* Public variables */
/* Private methods */
private function __construct() {
}
/* Public methods */
public static function getInstance() {
if(Database::$instance == NULL) {
Database::$instance = new Database();
}
return Database::$instance;
}
public function __destruct() {
if($this->isConnected) {
$this->killConnection();
}
echo "Adios my friend<br />";
}
public function connect() {
if(!$this->isConnected) {
$this->connection = @new mysqli($this->host, $this->username, $this->password, $this->database);
echo "CONNECTING<br />";
} else if(!$this->connection->ping()) {
$this->connection->real_connect($this->host, $this->username, $this->password, $this->database);
echo "RECONNECTING<br />";
}
if(!$this->connection->connect_errno) {
$this->isConnected = true;
}
return $this->isConnected;
}
public function killConnection() {
if($this->isConnected) {
$this->connection->close();
$this->isConnected = false;
echo "CONNECTION KILLED<br />";
}
}
public function isConnected() {
return $this->isConnected;
}
public function verbalizeErrors() {
if($this->connection->connect_error) {
die("Connect error ".$this->connection->connect_errno.": ".$this->connection->connect_error."!<br />");
}
}
}
?>
Om straks queries te kunnen uitvoeren zal ik later waarschijnlijk een aantal methoden moeten toevoegen die fungeren als doorgeefluiken (Sorry! :'[ ).
Ik sta open voor alle feedback die jullie kunnen bedenken, ook als het niet gerelateerd is aan mijn vraag!
De meeste PHP scripts duren een fractie van een seconde. De kans dat een MySQL connectie wegvalt in die tijd is klein. Een goede foutafhandeling en rapportage is belangrijk. Maar om binnen een PHP script een wegvallende connectie proberen te herstellen gaat mij veel te ver.