mysql_fetch_object

D-LuX

Erfahrenes Mitglied
Da ich mich momentan mit mysql_fetch_object auseinandersetze, stellt sich mir jetzt die Frage, was für einen Vorteil bzw. Nachteil ich habe, wenn ich mysql_fetch_object z.B. mysql_fetch_array oder auch mysql_fetch_row vorziehe ...

Außer, dass ich die Werte verschieden aufrufe?

mysql_fetch_object:
PHP:
echo $row->Feldname
mysql_fetch_array:
PHP:
$row['Feldname']
mysql_fetch_row:
PHP:
$row['0']

Was bringt es mir, wenn ich ein Object anstelle eines Array´s habe?

Geht es nur darum, den Code durch das Object besser lesen zu können..
Die Handhabung zu vereinfachen, für den Fall, dass man seine Datenbank nicht genau kennt und die dazugehörigen Array-Werte?

Ich sehe irgendwie keinen Unterschied.
Habe auch schon in der Doku nachgeschaut, aber da steht ja nur, wie ich dann drauf zugreife ...

Danke im voraus ...

D-LuX
 
Zuletzt bearbeitet:
fetch_object: Erhaltung der "Objektorientierung". Erzeugt ein Objekt der Klasse stdObject, in dem lediglich public Properties existieren, jedoch keine Methoden. Erzeugt einigermaßen viel Overhead, was jedoch nicht ins Gewicht fallen sollte.

fetch_row: Implementiert fetch_array mit MYSQL_NUM, ist durch die native Implementierung ein wenig schneller. Des Weiteren produzieren numerische Array-Indizies unsignifikant weniger Last, sind jedoch schwerer auszuwerten.

fetch_array: Kann sowohl numerische als auch assoziative als auch numerisch-assoziative Arrays erzeugen (letzer Parameter). Ersteres ist ähnlich zu fetch_row, jedoch durch zusätzliche Routinen ein wenig langsamer. Assoziative Array-Indizies produzieren ein wenig mehr Last auf dem Speicher, und die duplizierung der Ergebnisse via MYSQL_BOTH letzendlich produziert eine abzusehende, doppelte Last, da alle Arrayelemente "dupliziert" existieren.

Im Grunde ist es einfach nur eine Sache des Komforts und der Flexibilität, die die Funktionen abdecken sollen. Letztenendes muss der Entwickler entscheiden, womit er am besten zurechtkommt.
 
fetch_object: Erhaltung der "Objektorientierung". Erzeugt ein Objekt der Klasse stdObject, in dem lediglich public Properties existieren, jedoch keine Methoden. Erzeugt einigermaßen viel Overhead, was jedoch nicht ins Gewicht fallen sollte.

Was versteh ich unter:
- stdObject
- public Properties
- viel Overhead

Danke schonmal für die erste Antwort ;)


Blick immernoch nicht, warum ich fetch_object benutzen sollte ...
Oder nur, wenn ich OOP programmiere? Damit z.B. mein "Nachfolger", der weiter programmiert & entwickelt, durch die vorhandenen Feldnamen besser zurecht kommt, als mit einem numerischen Array?
 
stdClass ist ein seitens PHP implementiertes Standardobjekt, welches, wenn man es so erzeugt:
PHP:
$stdObject = new stdClass();
leer ist. Es besitzt zu diesem Zeitpunkt keine Eigenschaften und keine Methoden. Es ist sozusagen auf jedes andere Objekt ohne weiteres vererbbar ;) Warum das ganze? Sicherlich hast du schonmal was von type casting, also der expliziten Typenumwandlung gehört:
PHP:
$array = array();
$object = (object) $array;
Dies überträgt sämtliche Array-Schlüssel als Eigenschaften auf eine Instanz der Klasse stdClass. Die Werte werden den Eigenschaften dann letztendlich zugewiesen.

Public Properties (allgegenwärtig sichtbare Eigenschaften) sind in der objektorientierten Programmierung Eigenschaften von Objekten, die sowohl intern als auch extern zu sehen sind, und auf die man auch von außerhalb der Objektinstanz / Klasse zugreifen kann. Mehr dazu hier.

Was den Begriff "Overhead" betrifft, kann man das am besten auf zB Wikipedia nachlesen.

Ob und wann du fetch_object verwendest, ist dir überlassen. Es erhält, wie du bereits selbst bemerktest, das OOP-Paradigma (sofern in PHP wirklich vorhanden...) und ist eventuell verständlicher, wenn es um die Wartung geht, für andere Entwickler. Was es nicht ist: performant. Die Erzeugung einer Objektinstanz und die dynamische Zuweisung von Eigenschaften bedarf mehr Speicheraufwand und Rechenzeit als die Erzeugung eines "primitiven" Arrays.
 
Okay, das hilft mir schonmal weiter ;)

Jetzt nochmal eine andere Frage:

Folgendes Beispiel:

PHP:
$abfrage = mysql_query ("SELECT * FROM personen");
$row = mysql_fetch_object($abfrage);  
echo $row->Name;
echo $row->Gehalt;

In der Spalte Name stehen jetzt 1.Hans und 2.Peter.

Werden die Werte überschrieben?
Wie lese ich jetzt die einzelnen Werte aus?

Als letztes wird mir ja Peter angezeigt ...
wie komme ich an den Datensatz Hans dran, wenn ich kein numerisches Indizes habe?
Normal würde es ja mit $row[0] klappen ..

aber beim object?
 
Mit
PHP:
$abfrage = mysql_query ("SELECT * FROM personen");
while ($row = mysql_fetch_object($abfrage)) {
     echo $row->Name;
     echo $row->Gehalt;
     echo "<br>";
}
Kannst du alle Zeilen der Tabelle nacheinander bearbeiten/ausgeben.
 
mit jedem mysql_fetch_object oder den anderen funktionen holst du genau EINEN Datensatz ab. Das ist bei fetch_row aber nicht anderst.

Wenn du die Funktion einmal aufrufst, genau den ersten. Um alle zu bekommen verwendet man eine while schleife:
PHP:
$abfrage = mysql_query ("SELECT * FROM personen");
while($row = mysql_fetch_object($abfrage)){  
    echo $row->Name;
    echo $row->Gehalt;
    echo "<br>";
}
 
Okay, ich habe es über eine for-schleife gemacht, was ja keinen unterschied machen sollte:

PHP:
for ($i=1; $i<=$max; $i++)
 {
 $row = mysql_fetch_object($abfrage);
 echo $row->Name;     
 echo $row->Gehalt;
 echo $row->Alter;    
 echo $row->Geschlecht;      
 }

Soo..aber worauf ich hinauswill ...
Wenn ich ja jetzt nach Name frage und da stehen 10 Personen in der Spalte!

$row->Name; (da steht drin: Hans, Peter, Franz, Heinz, Dieter, Hugo...)
Wie lese ich jetzt z.B. die 5. Person aus, also Dieter?

4
Heinz
35000 €
38
männlich

5
Dieter
20000 €
43
männlich

6
Hugo
25000 €
50
männlich

als letztes wird mir der Datensatz 10 angezeigt ...aber wie erhalte ich jetzt den Datensatz vom Dieter?
Weil in $row->Name steht ja jetzt die 10. Person (letzte geholter Wert) und nicht er 5. ..
Klar, die Schleife gibt mir alle Daten aus ..aber überschreibt doch dann wieder alle anderen vorhergeholten Daten oder?
Ich kann ja nicht über $row->Name[4] (5.Eintrag) auf die Daten zugreifen ..

Versteht einer was ich meine :p:-)
 
Zuletzt bearbeitet:
Warum auch immer du das so möchtest, dann wirst du die Dateien auch speichern müssen die in der Query rauskommen. Und richtig, sie werdenbei jedem Durchlauf überschrieben.

PHP:
$data = new stdClass();

$abfrage = mysql_query ("SELECT * FROM personen");
while($row = mysql_fetch_object($abfrage)){  
    $data->Name[] = $row->Name;
    $data->Gehalt[]= $row->Gehalt;
}


dann kannst du auf $data->Name[2] zugreifen... Und könntest auch das Array zur ausgabe wieder durchgehen.
 
Was auch immer du mit dem Namen machen willst, du musst ihn innerhalb der Schleife verarbeiten.

Wenn du jetzt speziell nur was mit Peter machen willst und die anderen egal sind, dann halt so in der Schleife
PHP:
if ($row->Name=="Peter") //mach was mit Peter
Wenn du genau den fünften (oder x-ten) Datensatz auswerten willst, dann eben so in der Schleife:
PHP:
if ($i==5) //mach was mit dem fünften

Oder wo ist das Problem?
Wenn du alles außerhalt der Schleife machen willst, weil du immer auf alle zugreifen möchtest kannst du es in der Schleife so machen
PHP:
$alle[$i] = $row;
Dann kannst du nachher mit $alle[5]->Name drauf zugreifen
 
Zurück