Hallo,
nachdem ich nun einige viele Lektüre über OOP immer wieder gelesen habe und erneut durchgelesen habe , habe ich mich nun heute rangesetzt und einmal eine MySql-Klasse erstellt. Dafür habe ich wirklich den halben Tag gebraucht..
Was ist Sinn und Zweck dieses Threads?
Ich würde gerne von den - schon mehr Erfahreren - ein kleines " Feedback " hören, ob ich das Verständnis von OOP kapiert habe oder ich völlig daneben liege. Verbesserungsvorschläge wären natürlich auch gut
Fangen wir an:
Ich habe insgesamt 4 Daten. Davon sind 2 Klassen, 1 Interface und eine ausführende Datei:
index.php : ausführende Datei
MySql : Hauptklasse
Sql : abgeleitete Klasse von MySql
Connect : Interface
Ein UML-Diagramm habe ich mir gespart, dafür habe ich im Interface festgelegt, welche Methoden aufjedenfall vorhanden sein müssen, damit die Klassen überhaupt funktionieren.
Hier sind die Dateien
Connect.php
MySql.php
Diese Klasse soll eine Verbinung zur Datenbank herstellen und schließen, sowie ein paar Dinge. ( Wegen der vielen anderen Methoden, habe ich diese Klasse auch von der Sql Klasse getrennt )
Sql.php
Diese Klasse soll die gesamten Abfragen bearbeiten und sonstige Dinge erledigen, wie zum Beispiel, die Anzahl der geänderten Datensätze anzeigen.
Hier habe ich auch direkt ein Problem: Wenn ich die Methode getNum() aufrufe, bekomme ich einen Fehler. Woran liegt das? Ich komm nicht drauf.
index.php
In dieser Datei erstelle ich die Objekte und spiele ein wenig mit Ihnen rum.
Und so sieht das ganze dann aus:
Meine Frage ist also:
Ist das so ok? Oder liege ich völlig daneben?
Wäre nett, wenn einer etwas dazu sagen könnte
Gruß
Sven
nachdem ich nun einige viele Lektüre über OOP immer wieder gelesen habe und erneut durchgelesen habe , habe ich mich nun heute rangesetzt und einmal eine MySql-Klasse erstellt. Dafür habe ich wirklich den halben Tag gebraucht..
Was ist Sinn und Zweck dieses Threads?
Ich würde gerne von den - schon mehr Erfahreren - ein kleines " Feedback " hören, ob ich das Verständnis von OOP kapiert habe oder ich völlig daneben liege. Verbesserungsvorschläge wären natürlich auch gut
Fangen wir an:
Ich habe insgesamt 4 Daten. Davon sind 2 Klassen, 1 Interface und eine ausführende Datei:
index.php : ausführende Datei
MySql : Hauptklasse
Sql : abgeleitete Klasse von MySql
Connect : Interface
Ein UML-Diagramm habe ich mir gespart, dafür habe ich im Interface festgelegt, welche Methoden aufjedenfall vorhanden sein müssen, damit die Klassen überhaupt funktionieren.
Hier sind die Dateien
Connect.php
PHP-Code:
<?php
/**
*
* @author Sven
*/
interface Connect {
public function __construct($server, $benutzername, $passwort, $datenbank);
public function __desctruct();
public function setDb($database);
}
?>
Diese Klasse soll eine Verbinung zur Datenbank herstellen und schließen, sowie ein paar Dinge. ( Wegen der vielen anderen Methoden, habe ich diese Klasse auch von der Sql Klasse getrennt )
PHP-Code:
<?php
/**
* Description of MySql
*
* @author Sven
*/
class MySql implements Connect {
/*
* @protected
* Datenbank-Verbindung
*
* @resource
*/
protected $_connect;
/*
* @private
* Datenbank-Name
*
* @string
*/
private $_database;
/*
* Stellt eine Verbindung zum Datenbank-Server her und verbindet mit der
* Datenbank
*
* @param string $server; Name des Datenbank-Servers
* @param string $username; Name des Datenbank-Benutzer
* @param string $password; Passwort des Datenbank-Benutzer
* @param string $database; Datenbank-Name
*
* @return void
*/
public function __construct($server, $username, $password, $database) {
$this->_connect = @mysql_connect($server, $username, $password) OR $this->getMySqlError();
$this->setDb($database);
}
/*
* Schließt die Verbindung zum Datenbank-Server
*
* @return void
*/
public function __desctruct() {
mysql_close($this->_connect);
}
/*
* Verbindung zur einer Datenbank aufbauen
*
* @param string $database; Datenbank-Name
*
* @return void
*/
public function setDb($database) {
if(is_resource($this->_connect)) {
@mysql_select_db($database) OR $this->getMySqlError();
$this->_database = $database;
}
}
/*
* Zeigt alle Tabellen innerhalb der aktuellen Datenbank
*
* @return array $tables; Alle Tabellen
*/
public function showTables() {
$sql = 'SHOW TABLES FROM ' . $this->_database;
$query = mysql_query($sql);
while($row = mysql_fetch_array($query)) {
$tables[] = $row[0];
}
return $tables;
}
/*
* Zeigt alle Feldtypen an den angegebenen Tabellen
*
* @param array $tables; Tabellen
*
* @return string $html; Alle Feldtypen mit Tabellen-Name
*/
public function showFieldTypes(array $tables) {
foreach($tables as $table) {
$sql = 'SELECT * FROM ' . $table;
$query = @mysql_query($sql) OR $this->getMySqlError();
$fields = mysql_num_fields($query);
$table = mysql_field_table($query, 0);
$html .= '[ <b><i>Table : ' . $table . '</i></b> ]<br />';
for($i=0; $i<$fields; $i++) {
$type = mysql_field_type($query, $i);
$name = mysql_field_name($query, $i);
$len = mysql_field_len($query, $i);
$flags = mysql_field_flags($query, $i);
$html .= '[' . $name . '] => ( ' . $len . ' ) <b>' . $type . '</b> { ' . $flags . ' }<br />';
}
}
mysql_free_result($query);
return $html;
}
/*
* Liefert MySQL Client Informationen
*
* @return string
*/
public function getMySqlClient() {
return mysql_get_client_info();
}
/*
* Liefert MySQL Host Informationen
*
* @return string
*/
public function getMySqlHost() {
return mysql_get_host_info();
}
/*
* Liefert MySQL Protokoll Informationen
*
* @return string
*/
public function getMySqlProto() {
return mysql_get_proto_info();
}
/*
* Liefert MySQL Server Informationen
*
* @return string
*/
public function getMySqlServer() {
return mysql_get_server_info();
}
/*
* Liefert den momentanten Serverstatus zurück
*
* @return array $status; Status-Informationen
*/
public function getMySqlStat() {
$status = explode(' ', mysql_stat());
return print_r($status);
}
/*
* MySqlError ausgeben
*/
protected function getMySqlError() {
die(mysql_errno() . ' : ' . mysql_error());
}
}
?>
Sql.php
Diese Klasse soll die gesamten Abfragen bearbeiten und sonstige Dinge erledigen, wie zum Beispiel, die Anzahl der geänderten Datensätze anzeigen.
Hier habe ich auch direkt ein Problem: Wenn ich die Methode getNum() aufrufe, bekomme ich einen Fehler. Woran liegt das? Ich komm nicht drauf.
PHP-Code:
<?php
/**
* Description of Sql
*
* @author Sven
*/
class Sql extends MySql implements Connect {
/*
* Der Query
*
* @private
* @string
*/
private $_query;
/*
* Datenbank-Abfrage
*
* @private
* @resource
*/
private $_sql;
/*
* Erledigt alle Abfragen die an den MySql-Server gesendet wird
*
* @param string $query; Der Query
* @return bool oder bei SELECT Abfrage array
*/
public function doQuery($query) {
if(empty($query)) {
return false;
}
$this->_query = $query;
$this->_sql = mysql_query($this->_query) OR parent::getMySqlError();
if(preg_match('/^select/i', $this->_query)) {
$num = mysql_num_rows($this->_sql);
if($num > 0 ) {
while($row = mysql_fetch_array($this->_sql)) {
$output[] = $row;
}
return $output;
}
} else {
$aff = mysql_affected_rows();
if($aff > 0) {
return true;
}
}
return false;
}
/*
* Liefert die Anzahl der Datensätze im Ergebnis
*
* @return int;
*/
public function getNum() {
return mysql_num_rows($this->_sql);
}
/*
* Liefert die Anzahl betroffener Datensätze einer vorhergehenden
* MySQL Operation
*
* @return int;
*/
public function getAff() {
return mysql_affected_rows();
}
/*
* Maskiert spezielle Zeichen innerhalb eines Strings für die Verwendung
* in einer SQL-Anweisung
*
* @return string; Formatierter String
*/
public function getEsc($unescaped_string) {
return mysql_real_escape_string($unescaped_string);
}
/*
* Liefert die ID einer vorherigen INSERT-Operation
*
* @return int
*/
public function getInsertId() {
return mysql_insert_id();
}
/*
* Gibt den Query als String wieder
*
* @return string $this->_query; Query
*/
public function getQuery() {
return $this->_query;
}
}
?>
In dieser Datei erstelle ich die Objekte und spiele ein wenig mit Ihnen rum.
PHP-Code:
<?php
/*
* Super Funktion
*/
function __autoload($class_name) {
require_once($class_name . '.php');
}
/*
* Als erstes spielen wir ein bisschen mit der MySQL Klasse herum
*/
// Objekt erzeugen
$mysql = new MySql('localhost','root','password','test1');
// Zeige mir alle Tabellen in der Datenbank
$tables = $mysql->showTables();
echo '<b>Alle Tabellen:</b><br /><br />';
foreach($tables as $table) {
echo $table . '<br />';
}
echo '<br />';
// Zeige alle Feldtypen und sonstige Informationen
echo '<b>Zeige alle Feldtypen</b><br /><br />';
$tables = array('kategorie');
echo $mysql->showFieldTypes($tables);
echo '<br />';
// Setze neue Datenbank
$tables = $mysql->setDb('test2');
// Zeige davon alle Tabellen in der Datenbank
$tables = $mysql->showTables();
echo '<b>Alle Tabellen:</b><br /><br />';
foreach($tables as $table) {
echo $table . '<br />';
}
/*
* Nun spielen wir ein bisschen mit der SQL Klasse herum
*/
// Objekt erzeugen
$sql = new Sql('localhost','root','password','test1');
// Mache einen neuen Eintrag in die Datenbank
$neuer_name = 'neuer Name';
$sql->doQuery('INSERT INTO kategorie (name) VALUES ("'.$sql->getEsc($neuer_name).'")');
echo 'Mit diesem Eintrag wurden ' . $sql->getNum() . ' neue Eintraege aufgenommen';
echo '<br />';
echo 'Der Query lautet: ' . $sql->getQuery();
echo '<br /><br />';
echo 'Letzte Insert-Id lautet: ' . $sql->getInsertId();
echo '<br /><br />';
// Aendere den Eintrag wieder
$ganz_neuer_name = 'ganz_neu"er_name';
$sql->doQuery('UPDATE kategorie SET name = "'.$sql->getEsc($ganz_neuer_name).'"');
echo 'Mit diesem Eintrag wurden ' . $sql->getAff() . ' neue Eintraege aufgenommen';
echo '<br />';
echo 'Der Query lautet: ' . $sql->getQuery();
?>
Meine Frage ist also:
Ist das so ok? Oder liege ich völlig daneben?
Wäre nett, wenn einer etwas dazu sagen könnte
Gruß
Sven
Kommentar