PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Klassenproblem


clockwork
21.02.2007, 14:08:54
Hi erstmal, bin neu hier im Forum weil ich ein Problem habe :)

Ich habe seit kurzem mit OOP PHP begonnen und möchte mir zum erlernen der Klassen eine kleine MySQL Funktion basteln. Dies klappt aber nur halbwegs so wie ich das gerne möchte ;)

Irgendwie werden die Daten unendlich oft hitereinander ausgegeben ;) bzw. der Datensatz, da ich ja die DB auch nur testweise erstellt habe :)

index.php

<?php
include 'lib/class.MySQL.php';

$MySQL = new MySQL;

$connection = $MySQL->connect_db('localhost','news_admin','asdf');
$MySQL->select_db('news_system');

while($array = $MySQL->sql_select_array('SELECT * FROM `t_user`'))
{
echo $array['username'];
}
?>


class.MySQL.php

<?php

class mySQL {
var $connected;
var $issue = FALSE;
var $select = FALSE;

//MySQL connection data
var $host;
var $user;
var $password;
var $db;

function connect_db($host,$user,$password)
{
if(!$this->connected = mysql_connect($host,$user,$password))
{
echo "Fehler beim Verbinden der Datenbank ...";
}
return $this->connected;
}

function close_db()
{
mysql_close($this->connected);
}

function select_db($db)
{
if(!mysql_select_db($db,$this->connected))
{
echo "Fehler beim Auswaehlen der Datenbank ...";
}
}

function sql_select($sql)
{
if(!$this->select = mysql_query($sql))
{
echo "Fehler beim Auslesen der SQL-Datensaetze ...";
}
return $this->select;
}

function sql_select_array($sql)
{
if(!$this->issue = mysql_fetch_array($this->sql_select($sql)))
{
echo "Fehler beim erstellen des Array ...";
}
return $this->issue;
}

function sql_select_assoc($sql)
{
if(!$this->issue = mysql_fetch_assoc($this->sql_select($sql)))
{
echo "Fehler beim erstellen des Array ...";
}
return $this->issue;
}

function sql_fetch_row($sql)
{
if(!$this->issue = mysql_fetch_row($this->sql_select($sql)))
{
echo "Fehler beim erstellen des Array ...";
}
return $this->issue;
}
}
?>

lars68
21.02.2007, 14:16:21
hi,

erstmal muss ich dich enttäuschen!

der datenbankzugriff wie du ihn hier verwendet ist nicht mehr lange in dieser art in den neuesten PHP releases verfügbar....

die 'mysql' funktionen fallen raus!

deshalb sollte ab jetzt nur noch der nachfolger, die alleseits beliebte, mitgelieferte PDO klasse regeln!

die vorteile der PDO-klasse liegen hauptsächlich darin, dass statements für versch. arten von datenbanken verwendet werden können!

also --> http://www.php.net --> suche: PDO

aber kein grund zur sorge! du entscheidest ja selbst welches PHP release auf deinem server läuft....
wollte nur mal erwähnen dass es einen nachfolger gibt *schäm*


hf & gl :D

clockwork
21.02.2007, 14:20:14
oha xD

das heisst dan wohl, neu schreiben :D

lars68
21.02.2007, 14:23:49
hey ne musst du nich =)

nur bei den neuesten php releases dann....

bin mir aba ehrlich gesagt net mal mehr sicher ab welcher VER das sein wird !

also kein stress!!
lehn dich zurück und benutz die mysql fkt =)

war nur dumme klugscheißerei weil mir langweilig is *g*
sorry


wenn ich dir die handhabung von PDO erklärn soll kann ich das schnell mache...sieht komplizierter aus als es ist !

gruß

clockwork
21.02.2007, 15:49:07
jo, wäre ich eh froh wenn mir einer das ganze noch erklären könnte, blicke wirklich nicht durch, was denn da oben nicht stimmt :D

cyan.ide
22.02.2007, 11:27:04
der datenbankzugriff wie du ihn hier verwendet ist nicht mehr lange in dieser art in den neuesten PHP releases verfügbar....

die 'mysql' funktionen fallen raus!

Wo steht das? Und wo steht, das statt dessen PDO zum Einsatz kommt?
Sicher ist PDO die best practice, aber wozu wurde dann MySQLi eingefuehrt?

Zur Ermutigung:
Eine Klasse - wie oben vorgestellt - ist eigentlich eine tolle Sache, wenn sich diese Klasse als Wrapper fuer die direkten Datenbankfunktionen versteht.

Zumal sich dadurch auch Konstrukte realisieren lassen wie:

[...]
function sqlstr( $str )
{
if ( get_magic_quotes_gpc() ) $str = stripslashes( $str );
return mysql_real_escape_string( $str, $this->res );
}

[...]

function insert( $table, $vars, $file, $line )
{
$names = ""; $values = "";
mysql_ping( $this->res );
if( $vars ) foreach( $vars as $n => $v )
{
if($names) $names .= ", "; $names .= "`".$n."`";
if($values) $values .= ", "; $values .= "\"".$this->sqlstr( $v )."\"";
}
$query = "INSERT INTO ".$this->prefix.$table." ( ".$names." ) VALUES ( ".$values." );";
$this->do_query( $query );
$last_insert_id = 0;
$last_insert_id_res = mysql_query( "SELECT LAST_INSERT_ID();", $this->res );
if( $last_insert_id_res ) $last_insert_id = mysql_result( $last_insert_id_res, 0 );
$this->catcherror( $query, $file, $line );
$this->affected = mysql_affected_rows( $this->res );
return mysql_insert_id( $this->res );
}
[...]


[...]
unset( $var );
$var["feld1"] = "abc";
$var["feld2"] = 123;
$var["feld3"] = $unquoted_variable;
$db->insert( "mytable", $var, __FILE__, __LINE__ );
[...]


Das ganze ist dann im schlimmsten Fall komplett durch PDO / MySQLi oder andere Funktionen anpassbar, ohne dass man alles umschreiben muss.

Opendix
22.02.2007, 20:10:39
die 'mysql' funktionen fallen raus!


dies halte ich definitiv für ein Witz!
Ich denke dann würde der grösste Teil der PHP-Applikationen nicht mehr funktionieren!
Und die Entwickler machen ja schon ein drum rum wenn man ein einzelnen Funktionen die Parameter-Reihenfolge ändern sollte (damit über gleich) da werden sie kaum eine sooo wichtige Komponente standardmässig entfernen!

btw. schau dir doch mal die PEAR-Klassen zu diesem Thema an!
Oder Proepel (oder so) find eich auch noch interessant :)

cyan.ide
22.02.2007, 20:26:22
Sag(t) mal, kann man PEAR eigentlich bei Kommerz-PHP5-Hosting-Paketen voraussetzen?
Kein Hoster schreibt dazu was (...ob dafuer oder dagegen)

Opendix
22.02.2007, 20:44:50
Nein ich denke nicht. zumindest bei hostpoint.ch muss man für sämtliche PEAR-Klassen selbst sorgen.

Aber das ja kein Problem....

BenniG.
23.02.2007, 07:59:30
Vielleicht sollte man mal wieder back to topic kommen..
Das Problem ist diese Zeile:

while($array = $MySQL->sql_select_array('SELECT * FROM `t_user`'))

Damit wird die Abfrage unendlich oft ausgeführt..
Du musst deine Klasse so machen, dass du erst die Abfrage ausführst und dann die einzelnen Zeilen durchgehst..
Also so wie es mysql_query und mysql_fetch_xxx machen. kannst dir ja mal anschauen, wie das in MySQLi gemacht ist http://www.php.net/mysqli

lars68
23.02.2007, 09:12:07
ich dachte (bin mir nicht sicher) dass ich mal auf einer seite gelesen hätte, dass PHP DATA Objects durch die Objektorientierung als einzige Datenbankschnittstelle in zukunft zur Verfügung stehen wird!

aber kann natürlich sein dass da nur scheiße stand ;-)
hab keine ahnung!

gruß

cyan.ide
23.02.2007, 15:57:06
ich dachte (bin mir nicht sicher) dass ich mal auf einer seite gelesen hätte, dass PHP DATA Objects durch die Objektorientierung als einzige Datenbankschnittstelle in zukunft zur Verfügung stehen wird!

Kann ich mir nicht Vorstellen.
Ich habe mir gerade mal PDO als solches angeschaut. Die Helpfiles und Beispiele auf php.net zu PDO sind vollkommen unausgereift und einige Beispiele funktionieren nicht mal, weil sie einfach falsch sind. Als Beispiel:

http://de.php.net/manual/de/ref.pdo.php

<?php
$db = new PDO('oci:', 'scott', 'tiger');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
$id = get_new_id(); // some function to allocate a new ID

// assume that we are running as part of a file upload form
// You can find more information in the PHP documentation

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);

$stmt->beginTransaction();
$stmt->execute();
$stmt->commit();
?>

$stmt (PDOstatement) hat keine Methoden "beginTransaction();" und "commit();".
Dann werden viele Befehle nur sehr Schwammig erklaert. Und eine Datenbankverbindung mit "$mypdo = NULL" zu beenden ist nichts, wovon ich schnell Fan werde.

Wenn PDO wirklich alles andere abloesen soll, dann ist das zu php.net anscheind noch nicht durchgedrungen. Die Grundidee ist jedoch gut.