Hallo,
Ich habe mich damit beschäftigt eine Klasse zu basteln, die für den Zugriff auf die Datenbank zuständig ist. Eine Instanz dieser Klasse sollte dann in der Session gespeichert werden, damit ich nur einmal eine Verbindung aufbauen muss. So war der Plan aber inzwischen bin ich mir nicht mehr so sicher, ob der so ideal war (vor allem nach Svens Artikel).
Jetzt habe ich jedoch meiner Meinung nach alle nötigen Funktionen der Klasse hinzugefügt, um sie nach Versand mittels $_SESSION zu einem anderen Skript die Verbindung zur Datenbank wieder aufbauen zu lassen. Das geschieht jedoch nicht und mein Ehrgeiz möchte wissen, warum nicht.
Das ist meine Klasse:
class db_handler
{
// VARIABLEN
protected $mysqli;
private static $uniqueInstance = NULL;
// FUNKTIONEN
protected function __construct()
{
echo "<br><b>__construct</b><br>";
print_r($this);
$this->connect();
}
private function connect()
{
echo "<br><b>connect</b><br>";
try
{
$conf = simplexml_load_file("inc/dbconf.xml");
$this->mysqli = new mysqli($conf['host'], $conf['uid'], $conf['pwd'], $conf['db']);
if(mysqli_connect_errno())
{
throw new Exception(mysqli_connect_errno() . " Could not establish connection to database");
}
}
catch(Exception $e)
{
echo $e->getMessage();
$this->mysqli = FALSE;
exit();
}
print_r($this);
}
private final function __clone() {}
public static function getInstance()
{
if(self::$uniqueInstance === NULL)
{
self::$uniqueInstance = new db_handler;
}
return self::$uniqueInstance;
}
function __destruct()
{
$this->close();
}
function __sleep()
{
echo "<br><b>__sleep</b><br>";
print_r($this);
$this->close();
echo "<br><b>__sleep2</b><br>";
print_r($this);
return array();
}
function __wakeup()
{
echo "<br><b>__wakeup</b><br>";
print_r($this);
self::$uniqueInstance = new db_handler;
}
}
Der Code meines ersten Skriptes sieht so aus (in temp.php ist die Klassendefinition):
include('temp.php');
$t = db_handler::getInstance();
session_start();
$a = $t->queryObjectArray("SELECT * FROM member;");
/*print_r($a);
echo "<br>";*/
$_SESSION['db'] = $t;
//header('Location: test2.php');
und liefert diese Ausgaben:
__construct
db_handler Object ( [mysqli:protected] => )
connect
db_handler Object ( [mysqli:protected] => mysqli Object ( ) )
__wakeup
db_handler Object ( [mysqli:protected] => )
__construct
db_handler Object ( [mysqli:protected] => )
connect
db_handler Object ( [mysqli:protected] => mysqli Object ( ) )
__sleep
db_handler Object ( [mysqli:protected] => )
__sleep2
db_handler Object ( [mysqli:protected] => )
Wenn ich dann auf eine andere Seite mit dem Code
include('temp.php');
session_start();
$t = $_SESSION['db'];
echo "<br><br><br>In test2.php<br>";
print_r($t);
$t->execute("SELECT * FROM member;");
echo "<br>§§§<br>";
weiterleiten lasse, dann bekomme ich folgende Ausgabe:
__wakeup
db_handler Object ( [mysqli:protected] => )
__construct
db_handler Object ( [mysqli:protected] => )
connect
db_handler Object ( [mysqli:protected] => mysqli Object ( ) )
In test2.php
db_handler Object ( [mysqli:protected] => )
Fatal error: Call to a member function real_query() on a non-object in C:\Programme\Apache Group\Apache2\htdocs\kendo-do\temp.php on line 130
__sleep
db_handler Object ( [mysqli:protected] => )
__sleep2
db_handler Object ( [mysqli:protected] => )
Die Verbindung wird also in der Funktion connect() aufgebaut aber das in der Session vorhandene Objekt scheint es nicht mitzubekommen.
Was mache ich falsch?
Viele Grüße und danke an alle, die bis zu dieser Zeile durchgehalten haben,
Stefan