Problem mit mysql Klasse

Ja gut die Info wäre am Anfang interessant gewesen. Also PHP4 geht es nicht-> "definitiv"
Objektorientiertheit wurde mit Version PHP5 eingeführt. Also d.h. benutze keine Klassen oder update dein PHP. "var" wird in PHP4 nicht unterstützt, außer im Konstruktor.
PHP:
//Fehler var $connected = FALSE;
//Fehler var $host;
//Fehler var $user;
//Fehler var $pswd;
//Fehler var $dbname;
//Fehler var $verbindung;
//Fehler var $sql_query;
//Fehler var $query_counter;
nehme stattdessen ein include z.B. config.php oder probiere das hier
PHP:
class mySQL {


function mySQL($ID = DB_STANDARD) {
global $mySQL_settings;
var $connected = FALSE;
var $host;
var $user;
var $pswd;
var $dbname;
var $verbindung;
var $sql_query;
var $query_counter;
$this->host = $mySQL_settings[$ID]['host'];
$this->user = $mySQL_settings[$ID]['user'];
$this->pswd = $mySQL_settings[$ID]['pswd'];
$this->dbname = $mySQL_settings[$ID]['dbname'];
$this->verbindung = @mysql_connect($this->host, $this->user, $this->pswd);
if ($this->verbindung === FALSE) {
$this->error("CONN.OPEN");
}
if (@mysql_select_db($this->dbname, $this->verbindung) === FALSE) {
$this->error("DB.SELECT");
} else {
$this->connected = TRUE;
}
}
weil im Konstruktor ist var erlaubt.
 
Zuletzt bearbeitet von einem Moderator:
Nunja aber mit php5 funktioniert es leider auch nicht :-(

Danke trotzdem für die Unterstützung!

Falls noch jemand einen Tipp hat wäre ich sehr dankbar.

Gruss
 
OOP war bereits in PHP4 vorhanden, also bitte nicht soetwas erzählen. PHP5 brachte nur einige schöne neue Features mit sich (neu für PHP).

Dein Problem ist einfach der falsche Zugriff auf die Daten.

PHP:
<?php

##### Hier folgen die Einstellungen der Verbindungen

define("DB_STANDARD", 1);

# Verbindung 'STANDARD'
$mySQL_settings[1]['host'] = 'localhost';
$mySQL_settings[1]['user'] = 'root';
$mySQL_settings[1]['pswd'] = '';
$mySQL_settings[1]['dbname'] = 'test';

####################

class mySQL {
var $connected = FALSE;
var $host;
var $user;
var $pswd;
var $dbname;
var $verbindung;
var $sql_query;
var $query_counter;

function mySQL($ID = DB_STANDARD) {
global $mySQL_settings;
$this->host = $mySQL_settings[$ID]['host'];
$this->user = $mySQL_settings[$ID]['user'];
$this->pswd = $mySQL_settings[$ID]['pswd'];
$this->dbname = $mySQL_settings[$ID]['dbname'];
$this->verbindung = mysql_connect($this->host, $this->user, $this->pswd);
if ($this->verbindung === FALSE) {
$this->error("CONN.OPEN");
}
if (mysql_select_db($this->dbname, $this->verbindung) === FALSE) {
$this->error("DB.SELECT");
} else {
$this->connected = TRUE;
}
}  
// wenn das Skript nicht mit PHP5 ausgeführt wird, folgende Funktion einfach löschen!
// function __destruct() {
// if (!$this->connected) {
// $this->error("NO CONN");
// } else {
// if (mysql_close($this->verbindung) === FALSE) {
// $this->error("CONN.CLOSE");
// }
// }
// }

function DBQueries() {
if (!$this->connected) {
$this->error("NO CONN");
} else {
return $this->query_counter;
}
}

function DrawDBQueries() {
if (!$this->connected) {
$this->error("NO CONN");
} else {
if ($this->DBQueries == 1) {
$text = "Es war 1 mySQL-Abfrage nötig";
} else {
$text = "Es waren ".$this->DBQueries." mySQL Abfragen nötig";
}
}
return $text;
}

function query($sql) {
if (!$this->connected) {
$this->error("NO CONN");
} else {
$this->sql_query = $sql;
$this->query_counter++;
$result = mysql_query($this->sql_query, $this->verbindung);
if ($result === FALSE) {
$this->error("QUERY FAILED");
} else {
return $result;
}
}
}

function select($sql, $anzahl = NULL) {
if (!$this->connected) {
$this->error("NO CONN");
} else {
$result = $this->query($sql);
if ($result !== FALSE) {
$anzahl1 = mysql_num_rows($result);
$anzahl = $anzahl1;
for($i = 0; $i < $anzahl; $i++) {
$array[$i] = mysql_fetch_object($result);
}
}
}
return $array;
}

function error($error_type) {
switch ($error_type) {
case 'CONN.OPEN':
$text = "Beim Öffnen der Verbindung ist ein Fehler aufgetreten";
break;

case 'CONN.CLOSE':
$text = "Beim Schließen der Verbindung ist ein Fehler aufgetreten";
break;

case 'NO CONN':
$text = "Die angeforderte Aktion konnte nicht durchgeführt werden, da keine Verbindung zur Datenbank besteht!";
break;

case 'DB.SELECT':
$text = "Beim Auswählen der Datenbank ist ein Fehle aufgetreten. Ev. ist die Datenbank nicht vorhanden";
break;

case 'QUERY FAILED':
$text = "Während folgender Abfrage ist ein Fehler aufgetreten:\n\n".$this->sql_query;
break;

default:
$text = "Es ist folgender, unbekannter Fehler aufgetreten: ".$error_type;
}
if ($this->connected) {
$text .= "\n\nmySQL meldet:\nFehler-Nummer: ".mysql_errno($this->verbindung)."\nFehler-Beschreibung: ".mysql_error($this->verbindung);
}
echo $text."\n";
}

}

$sql = new mySQL(); // neue Verbindung
$daten = $sql->select("SELECT * FROM foo"); // einfache Abfrage 

echo "Ergebnis: ".$daten[0]->bla;
?>

Du bekommst ein numerisches Array zurück, wobei jeder Eintrag ein Objekt repräsentiert.
Das hättest du übrigens auch selbst herausfinden können, wenn du [phpf]var_dump[/phpf] auf $daten angewedet hättest. Allgemein ist es sinnvoll sich die Ergebnisse mal anzuschauen.
Übrigens, [phpf]error_reporting[/phpf] auf E_ALL hätte dir dann auch das hier gesagt:
Notice: Trying to get property of non-object in file.php on line xxx
 
Dankeschön!
Kann man die Klasse vielleicht so umschreiben dass ich ein einfaches Array...also kein nummerisches Array geliefert bekomme?

Ich möchte wenns geht die Abfragen so einfach als möglich halten also ohne [0] in der Abfrage!

Gruss
 
Nein, mit deiner jetzigen Struktur ist das nicht möglich, da du sonst immer nur den letzten Datensatz zurückerhältst.

Grundsätzlich muss ich dir sagen, das deine Klasse weder "schön" noch sehr performant ist.

  • Du arbeitest mit global was wirklich nicht sehr schön ist. Schöner wäre eine Variablenübergabe im Konstruktur
  • Deine Methoden sind nicht sehr intuitiv
  • Text einrücken erhöht die Lesbarkeit
  • Wofür ist der Parameter $anzahl in der select Methode?
  • Warum nimmst du überhaupt mysql_fetch_object?
  • Du prüfst insgesamt 5x auf if($this->connected). Gerade diesen Schnipssel könntest du in eine Methode auslagern und somit wiederverwenden. Und Wiederverwendbarkeit ist ja gerade etwas was die OOP predigt ;)
  • PHP4 stirbt. Ab August sollte wirklich jeder umsteigen, denn ab diesem Punkt wird es keine Sicherheitsupdates mehr geben. Warum also überhaupt noch für PHP4 entwickeln?

Vielleicht solltest du dich erstmal etwas intensiver mit den allgemeinen Grundlagen der OOP beschäftigen und dir Inspirationen von anderen Klassen holen.
 
Nein, mit deiner jetzigen Struktur ist das nicht möglich, da du sonst immer nur den letzten Datensatz zurückerhältst.

Grundsätzlich muss ich dir sagen, das deine Klasse weder "schön" noch sehr performant ist.

  • Du arbeitest mit global was wirklich nicht sehr schön ist. Schöner wäre eine Variablenübergabe im Konstruktur
  • Deine Methoden sind nicht sehr intuitiv
  • Text einrücken erhöht die Lesbarkeit
  • Wofür ist der Parameter $anzahl in der select Methode?
  • Warum nimmst du überhaupt mysql_fetch_object?
  • Du prüfst insgesamt 5x auf if($this->connected). Gerade diesen Schnipssel könntest du in eine Methode auslagern und somit wiederverwenden. Und Wiederverwendbarkeit ist ja gerade etwas was die OOP predigt ;)
  • PHP4 stirbt. Ab August sollte wirklich jeder umsteigen, denn ab diesem Punkt wird es keine Sicherheitsupdates mehr geben. Warum also überhaupt noch für PHP4 entwickeln?

Vielleicht solltest du dich erstmal etwas intensiver mit den allgemeinen Grundlagen der OOP beschäftigen und dir Inspirationen von anderen Klassen holen.

Richtig, aber es ging ja nur darum es zum laufen zu bringen und ich denke Basteln hilft beim Verstehen, so geht es mir zumindest. Hoffe schon das er die Funktionen sich richtig anschaut. Ach ja glaube ab PHP5 konnte man die Funktionen deklarieren, was von großen Nutzen sein kann... :)
 
Was genau meinst du mit Funktionen deklarieren?

Und natürlich bringt basteln etwas, aber warum nicht gleich in PHP5 basteln und sich die neuen Fähigkeiten zunutze machen (und vorallem sie zu lernen). Denn momentan lernst du eine Syntax die du mit PHP5 nochmal "neu" lernen kannst. Natürlich kann man darauf aufbauen, aber warum nicht direkt "richtig" lernen?
 
Was genau meinst du mit Funktionen deklarieren?

Und natürlich bringt basteln etwas, aber warum nicht gleich in PHP5 basteln und sich die neuen Fähigkeiten zunutze machen (und vorallem sie zu lernen). Denn momentan lernst du eine Syntax die du mit PHP5 nochmal "neu" lernen kannst. Natürlich kann man darauf aufbauen, aber warum nicht direkt "richtig" lernen?

Hallo,

ich meinte public und private. In PHP4 ist alles public, was dann zu Problemen führen kann. Ich gebe dir natürlich recht, gleich PHP5 zu nutzen, dachte eigenlich auch, das xtramen01 es nutzt. Die Info kam dann ja ziemlich spät, das er es nicht macht.

@xtramen01 schaue dir doch mal Pear an http://pear.php.net/ dort ist alles drin was Herz begehrt ;) .

Gruss
 
Ich danke euch für die Unterstützung, kritik und Anregungen.

Werde mich mal umschauen nach anderen Funktionen bzw. mich in die Materie einarbeiten und ein wenig basteln.


Gruss
 
Zurück