also ich bin nicht grade der Hellste in objektorientierter Programmierung aber ein paar Grundlagen verstehe ich schon. Naja, ich habe mir mal eine Datenbank-Klasse gebaut (bzw. habe es versucht) und aus der möchte ich nach der Abfrage das Ergebnis aus der Klasse herausbekommen. Am besten ich zeig euch mal die Class:
[PHP]class Database {
public $string;
private $host;
private $user;
private $pass;
private $base;
public function __construct($host, $user, $pass, $base) {
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->base = $base;
mysql_connect($this->host, $this->user, $this->pass) or die(mysql_error());
mysql_select_db($this->base);
}
public function __destruct() { }
public function select($string) {
$this->string = mysql_real_escape_string($string);
$sql = $this->string;
$result = mysql_query($sql);
$row = mysql_fetch_object($result);
return $row;
}
}[/PHP]
Das ist die Klasse. Ja, vielleicht wird der ein oder andere jetzt sagen, dass man das besser machen kann aber das ist mir auch bewusst. Aber es geht erstmal um das folgende Problemchen:
[PHP]$DB = new Database(‚localhost‘, ‚name‘, ‚pass‘, ‚database‘);
$result = $DB->select(‚SELECT name, author FROM article WHERE id = 4‘);
echo $result->name;[/PHP]
Hier wird die Klasse mit den Parametern für die Verbindung zum SQL-Server instanziert. Nachfolgend wird eine SELECT-Abfrage gemacht. Und diese funktioniert so auch vollkommen. ABER sie funktioniert nur, wenn ich nicht mehr als 1 Spalte zurückbekomme. Wenn ich also jetzt den Query bei WHERE zu „WHERE id = 4 AND id = 5“ abändere, dann funktioniert das nicht mehr. Ich bekomme einfach nen leeren String/Array zurück. Also das liegt daran, dass mehrere Zeilen abgefragt werden und die müssen ja irgendwie noch durch ne While-Schleife laufen etc.
Also könnte mir jetzt freundlicherweise jemand erklären, wie ich das am besten und am elegantesten hinbekomme das auch Abfragen, bei denen das Ergebnis mehr als 1 Spalte betrifft, funktionieren.
Erst einmal: Wozu mysql_real_escape_string() um $string? Das hat gar keinen Sinn.
Das macht man nur um einzeln gesendete Strings und nicht mit der kompletten Query.
Im Übrigen ist die Klasse sinnlos, weil du die globale MySQL-Connection benutzt und nicht die eigentliche Verbindung.
Ich rate dir daher an, mysql_* zugunsten mysqli oder besser noch PDO zu vergessen. Diese Funktionen werden sowieso wahrscheinlich in PHP5.5 als veraltet eingestuft sein und in PHP6 oder 5.6 gar nicht mehr erst existieren.
Da du diesen Sprung wahrscheinlich gar nicht machen willst, zeige ich dir eine Verbesserung mit mysql_* und dann mit PDO, damit du auch keine Ausrede hast, es nicht so zu tun.
[php]
class Database {
public $string;
}
class DatabaseResult {
private $result;
const FETCH_ASSOC = 1;
const FETCH_NUM = 2;
const FETCH_OBJECT = 3;
const FETCH_BOTH = 4;
public function __construct($result) {
$this->result = $result;
}
/**
*
* @param int $fetch_type
* @param int $class_name
* @return array|object
*/
public function fetch($fetch_type = self::FETCH_BOTH, $class_name = null) {
switch ($fetch_type) {
case self::FETCH_ASSOC: {
return mysql_fetch_assoc($this->result);
} break;
case self::FETCH_NUM: {
return mysql_fetch_row($this->result);
} break;
case self::FETCH_OBJECT: {
return mysql_fetch_object($this->result, $class_name);
} break;
case self::FETCH_BOTH: {
return mysql_fetch_array($this->result, MYSQL_BOTH);
} break;
default: {
throw new Exception('Unknow fetch type ’ . $fetch_type);
} break;
}
}
// Andere Methoden implementieren (zählen usw.)
public function __destruct() {
mysql_free_result($this->result);
}
}
[/php]
Hier kannst du nur Dinge wie Countable und Iterator anwenden.
Mit PDO ist es ganz einfach:
[php]
$db = new PDO(‚mysql:dbname=‘.$base.‚;host=‘.$host, $user, $pass);
$statement = $db->query(‚SELECT name, author FROM article WHERE id = 4 and id = 5‘);
foreach ($statement->fetch(PDO::FETCH_OBJ) as $row) {
echo $row->name;
}
[/php]
Ach Mist, dass ist natürlich völlig sinnlos, da habe ich wohl nicht richtig nachgedacht. Das ist mir schon klar, dass diese Funktion nicht um den kompletten Query kommt.
Das heißt jetzt was genau? Aber naja, es soll nur eine sehr einfache Klasse werden, nichts komplexes.
Also ich weiß ja nicht, aber soll das jetzt ne Unterstellung sein? Also Ausreden brauche ich schon mal garnicht. Ich bin hier, weil ich dachte, dass mir hier freundliche User bei einem Problem helfen könnten !? Naja, schauen wir mal weiter…
Habe ihn mir jetzt mal angeschaut aber richtig verstehen tue ich den Code jetzt nicht. Es soll nur eine ganz ganz einfache Klasse sein. Geht das nicht noch einfacher und kürzer?
Damit habe ich leider noch nicht gearbeitet und habe es auch noch nicht vor.
Ich habe dir gesagt, mysql_* ist veraltend und ziemlich sicher bald wirklich veraltet. PDO und mysqli sind die einzigen zukunftsorientierten Lösungen, um MySQL zu benutzen. Die OOP-Umsetzung und der Arbeitsstil mit PDO gefallen mir dabei am besten.
Das ist keine Ausrede! Ich habe wirklich noch nicht damit gearbeitet und habe es auch in Zukunft noch nicht vor. Muss ich mich jetzt hier etwa rechtfertigen? Das gibts doch nicht. Was ist das denn für ein Forum. Also wenn das so ist dann bin ich hier ganz schnell wieder weg.
Was PDO ist weiß ich nicht. Und mysqli ist wahrscheinlich der Nachfolger von mysql. Habe gerade mal im Manual geschaut aber das klingt sehr komplex. Aber da ich ja ne Klasse habe wird das ja wohl sicherlich kein Problem sein das später abzuändern. Denn wenn ich jetzt noch 3 neue Sachen dazulernen muss dann ist das auch nicht gut. Ich wollte erstmal nur wissen, wie ich ganz einfach auf dieses Ergebnis der Datenbank zugreifen kann.
Und falls du’s noch nicht gemerkt / gelesen hast, bin ich noch OOP-Anfänger. Vielleicht war es auch nicht ganz ersichtlich aber jetzt weißt du es.
Dann lies dir das mal durch. Was daran schwerer sein sollte, ist wohl ein Einschätzungsfehler.
Grundsätzlich ist der Unterschied, dass du statt [php]
$result = mysql_query(‚select…‘);
while ($row = mysql_fetch_assoc($result)) {
}[/php]
das schreibst
[ul]
[li]mysqli:[/li][php]
$result = $mysqli->query(‚select…‘);
while ($row = $result->fetch_assoc()) {
}
[/php]
[li]PDO:[/li]$result = $pdo->query(‚select…‘);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
}
[/ul]
In etwa ganz genau das, was du da selber mit deiner Database-Klasse versucht hast. Darauf, dass du nicht vorhattest, es zu benutzen, antworte ich: Planänderung. Und in ein paar Monaten wirst du mir sowieso unbewusst dankbar sein, wenn du jetzt über deinen Schatten springst und nicht davon ausgehst, dass ich dich gerade hier nur anmache, damit du vom Forum verschwindest.
Dann erklär mir mal, wie ich mit MySQLi die Verbindung aufbaue, ein Query ausführen kann und wie ich das Ergebnis ausgeben kann. Folgender Code geht nämlich nicht.
[PHP]$DB = @new mysqli(‚localhost‘, ‚x‘, ‚x‘, ‚x‘);
$result = $DB->query(‚SELECT name FROM article WHERE id = 4‘);
dass war Copy and Paste dieser Code. Habe es nun weg gemacht. Naja, die Fehlermeldung bzw. die Warnung bei folgendem Code:
[PHP]$DB = new mysqli(‚localhost‘, ‚Benutzer‘, ‚Passwort‘, ‚Database‘);
$result = $DB->query(‚SELECT name FROM article WHERE id = 4‘);
Ich denke, die Verbindung wird nicht erstellt. Hast du die richtigen Angaben gemacht? Die Reihenfolge der Parameter für den Konstruktor von mysqli ist: $host, $username, $passwd, $dbname
Nein nein, die Verbindung stimmt. Habe ja gesagt, dass ich mit var_dump(); das Array mit dem Ergebnis bekomme. Also die Abfrage findet statt. Nur das echo $row->name; funktioniert einfach nicht.
Gruß!
EDIT:
Also ich komm mir echt langsam blöd vor. Also, bei folgendem Code funktioniert die Abfrage jetzt wenn ich anstatt $row->name $row[‚name‘] mache.
[PHP]$result = $DB->query(‚SELECT name FROM article WHERE id = 4‘);
while($row = $result->fetch_assoc()) {
echo $row[‚name‘];
}[/PHP]
Wenn ich aber nun die WHERE-Klausel abändere undzwar so: WHERE id = 4 AND id = 7
Dann wird wieder garnichts ausgegeben. Also ganz ehrlich: Was’n das fürn Mist?
Und jetzt noch was: Bei diesem Code funktioniert das echo $row->name WENN ich aus $result->fetch_assoc() einfach $result->fetch_object() mache. Sobald ich aber wieder ein AND id = 7 in die WHERE-Klausel hänge geht auch das nicht mehr.
[PHP]$result = $DB->query(‚SELECT name FROM article WHERE id = 4‘);
while($row = $result->fetch_object()) {
echo $row->name;
}[/PHP]
Also entweder mache ich was falsch oder diese Klasse ist einfach nur bescheuert.
es sollte natürich OR lauten. Heute (gestern) Mittag hat mich jemand in nem anderen Forum drauf aufmerksam gemacht. Das war ein ganz blöder Logik-Fehler. Aber es funktioniert jetzt mit der MySQLi-Klasse.
Danke das Du mir geholfen hast. Und @Asterixus auch.