PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Gültigkeit einer ergebnis-Variablen nach mysql_free_result()



tschloss
28-05-2006, 16:44
Hi,
üblicherweise habe ich dieses Konstrukt

$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
...//do something with $record["xyz"]
mysql_free_result($ergebnis);
...//?????? do something with $record["xyz"]

Ist denn $record noch gültig, nach dem free_result oder ist $record eine Referenz in den Puffer, der mit dem free_result freigegeben wird und irgendwann überschrieben werden kann?
Oder handelt es sich bei der Zuweisung um eine Werte-Übertragung in eine Variable, die länger gilt?

Ach ja: ich arbeite parallel mit PHP 4.3 und 5.1 (apache2 mod)

Danke und Grüße

Romanday
28-05-2006, 18:28
Hi,
üblicherweise habe ich dieses Konstrukt

$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
...//do something with $record["xyz"]
mysql_free_result($ergebnis);
...//?????? do something with $record["xyz"]

Ist denn $record noch gültig, nach dem free_result oder ist $record eine Referenz in den Puffer, der mit dem free_result freigegeben wird und irgendwann überschrieben werden kann?
Oder handelt es sich bei der Zuweisung um eine Werte-Übertragung in eine Variable, die länger gilt?

Ach ja: ich arbeite parallel mit PHP 4.3 und 5.1 (apache2 mod)

Danke und Grüße

Wenn Du es genau wissen möchtest -> PHP source Code.
Ich vermute aber -> Referenz in den Puffer.
Am Ende eines Scriptes werden sowieso alle Variablen etc. gelöscht,
wenn Du nix anderes konfiguriert hast.

Ich versteh warum Du das wissen mußt?
Möchtest Du eine eigene PHP Funktion schreiben?

tschloss
28-05-2006, 21:10
Wenn Du es genau wissen möchtest -> PHP source Code.
Ich vermute aber -> Referenz in den Puffer.
Am Ende eines Scriptes werden sowieso alle Variablen etc. gelöscht,
wenn Du nix anderes konfiguriert hast.

Ich versteh warum Du das wissen mußt?
Möchtest Du eine eigene PHP Funktion schreiben?

Nein, ich habe nun überraschend noch einen Bedarf am Skriptende auf die Variable zuzugreifen. Aus optischen Gründen würde ich mein free_result lieber dort lassen, wo ich mit der Query arbeite und dann (fast) fertig bin.

Aber ich kann es auch hinter die letzte Nutzung der Variablen schieben oder eine Kopie anfertigen.
Interessierte mich auch.
(AFAIK hat sich da auch was geändert von PHP4 nach PHP5, werde nochmal Bücher wälzen).

Greetz & Thx
Thomas

Romanday
28-05-2006, 22:35
Interessierte mich auch.
(AFAIK hat sich da auch was geändert von PHP4 nach PHP5, werde nochmal Bücher wälzen).

Greetz & Thx
Thomas

Da wirst Du nix finden, Du must dich bei so einer Frage bei den
PHP Entwicklern rumtreiben. Ist ja C++)

Gaert
29-05-2006, 08:55
Hi,
üblicherweise habe ich dieses Konstrukt

$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
...//do something with $record["xyz"]
mysql_free_result($ergebnis);
...//?????? do something with $record["xyz"]
Ist denn $record noch gültig, nach dem free_result oder ist $record eine Referenz in den Puffer, der mit dem free_result freigegeben wird und irgendwann überschrieben werden kann?
Oder handelt es sich bei der Zuweisung um eine Werte-Übertragung in eine Variable, die länger gilt?

Ach ja: ich arbeite parallel mit PHP 4.3 und 5.1 (apache2 mod)

Danke und Grüße Hallo,

am besten probierst du das ganze einfach mal aus, anstatt lange Fragen zu formulieren.

$ergebnis ist eine lokale Variable in deinem Skript, die ein MySQL RessourceID enthält (im Prinzip ein String der intern mit einem Speicherbereich gemappt wird).
$result ist eine lokale Variable in deinem Skript die mit einer "byValue" Zuweisung aus dem referenzierten Speicherbereich befüllt wird (also eine Kopie des Originals).

Wenn du mysql_free_result() aufrufst wird der intern vorgehaltene Speicherbereich (Original) freigegeben... auf die Kopie hat das keinen Einfluss.

Ein Unterschied zwischen PHP4 und PHP5 ist dass Objekte (nicht normale Variablen) immer "by Reference" übergeben werden, d.h. löscht man das Original ist die Zugewiesene Variable ebenfalls leer... das könnte u.U. bei der mysqli Schnittstelle so sein... müsste ich jetzt aber ausprobieren.

Gruß,

Gaert

tschloss
29-05-2006, 12:21
Hallo,

am besten probierst du das ganze einfach mal aus, anstatt lange Fragen zu formulieren.[
Sooo lange war das ja nicht....
Und ehrlich gesagt, weiss ich nicht, wie ich es testen sollte. Wenn die Variable noch ihre Werte hat, kann das Zufall sein. Weiss ja nicht, wie dir Garbage-Collection tut.





$ergebnis ist eine lokale Variable in deinem Skript, die ein MySQL RessourceID enthält (im Prinzip ein String der intern mit einem Speicherbereich gemappt wird).
$result ist eine lokale Variable in deinem Skript die mit einer "byValue" Zuweisung aus dem referenzierten Speicherbereich befüllt wird (also eine Kopie des Originals).

Wenn du mysql_free_result() aufrufst wird der intern vorgehaltene Speicherbereich (Original) freigegeben... auf die Kopie hat das keinen Einfluss.

Gruß,

Gaert

Thx, das heisst, dass meine Variable weiterhin gilt und ich kann alles so lassen wie es ist.

Grüße
Thomas

tschloss
29-05-2006, 12:37
Da wirst Du nix finden, Du must dich bei so einer Frage bei den
PHP Entwicklern rumtreiben. Ist ja C++)

Naja, wenn geklärt ist das "$record" ein Array ist und Arrays prinzipiell per Value als Funktionsergebnis zurückgegeben werden, dann ist das die Antwort, die ich auch in einem "Buch" gesucht hätte. Soetwas ist normalerweise auch dukumentiert, oder?

Greetz
Thomas

undefined
29-05-2006, 15:54
Hi,
üblicherweise habe ich dieses Konstrukt

$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
...//do something with $record["xyz"]
mysql_free_result($ergebnis);
...//?????? do something with $record["xyz"]

Ist denn $record noch gültig, nach dem free_result oder ist $record eine Referenz in den Puffer, der mit dem free_result freigegeben wird und irgendwann überschrieben werden kann?
Oder handelt es sich bei der Zuweisung um eine Werte-Übertragung in eine Variable, die länger gilt?

Ach ja: ich arbeite parallel mit PHP 4.3 und 5.1 (apache2 mod)

Danke und Grüße
Nein - Die variable $record ist natürlich nicht mehr nach mysql_free_result gültig. So soll es auch sein ;) Alles andere ist schlechte Programierung und Speicher verbraterei.
Du kannst auch keine Referenz auf Record setzten dies würde ebenfalls nicht gehen. Im Prinzip ist bei dir die Variable Record ein Zeiger auf deinen Datensatz. Der so lange Existent ist bis der Speicher wieder mit mysql_free_result frei gegeben wird. Unter mysqli ist diese Art wesentlich verbessert worden. Wenn du also weiterhin mit den Werten arbeiten möchtest kannst du sie in ein Array schreiben und den SQL Speicher freigeben.


$Puffer = array();
$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
$Puffer = $record;
mysql_free_result($ergebnis);
var_dump( "<pre>", $Puffer, $record, "</pre>");

Gaert
30-05-2006, 12:14
Nein - Die variable $record ist natürlich nicht mehr nach mysql_free_result gültig. So soll es auch sein ;) Alles andere ist schlechte Programierung und Speicher verbraterei.
Du kannst auch keine Referenz auf Record setzten dies würde ebenfalls nicht gehen. Im Prinzip ist bei dir die Variable Record ein Zeiger auf deinen Datensatz. Der so lange Existent ist bis der Speicher wieder mit mysql_free_result frei gegeben wird. Unter mysqli ist diese Art wesentlich verbessert worden. Wenn du also weiterhin mit den Werten arbeiten möchtest kannst du sie in ein Array schreiben und den SQL Speicher freigeben.


$Puffer = array();
$ergebnis=mysql_query($qs);
$record=mysql_fetch_assoc($ergebnis);
$Puffer = $record;
mysql_free_result($ergebnis);
var_dump( "<pre>", $Puffer, $record, "</pre>");

Hallo undefined,

sorry, aber das was du da schreibst stimmt einfach nicht - selbstverständlich ist $record noch gültig (übrigens auch bei deinem Beispiel).

Zitat aus dem PHP Manual:


bool mysql_free_result ( resource Ergebnis-Kennung )

mysql_free_result() gibt den Speicher frei, der mit der Ergebnis-Kennung assoziert ist.

In deinem Beispiel wird $ergebnis invalidiert und das Ergebnis der Abfrage im Speicher freigegeben. Der Inhalt von $record liegt natürlich in einem anderen Speicherbereich, da das Ergebnis der Abfrage ja zuvor mit mysql_fetch_assoc in arrayform aufbereitet und in einen anderen Speicherbereich (den von $record) kopiert wurde.

Gruß,

Gaert

undefined
30-05-2006, 16:48
@gaert
Dann teste das mal, und nicht wundern warum $r false ist ;)


$c = mysql_connect("localhost:3306", "benutzer", "pass" );
mysql_select_db("test");
$p = array();
$q = mysql_query("SELECT * FROM `Adressenbuch` ORDER BY `Nr`", $c);
while ( $r = mysql_fetch_assoc($q) ) {
$p[] = $r;
}
mysql_free_result($q);
var_dump( "<pre>Puffer:", $p, " Im Nirvana:", $r, "</pre>");
mysql_close($c);

Gaert
30-05-2006, 17:04
@gaert
Dann teste das mal, und nicht wundern warum $r false ist ;)
Das brauch ich nicht mal zu testen, denn ich weiß warum $r false ist!
Was glaubst du denn wohl was die Abbruchbedingung für deine while schleife ist?

Antwort: mysql_fetch_assoc() gibt als Wert false zurück wenn der letzte Wert bereits gelesen wurde...


Liefert ein assoziatives Array, das den geholten entprechenden Datensatz enthält. Sind keine weiteren Datensätze vorhanden gibt diese Funktion FALSE zurück.

Also nochmal: mysql_free_result() ändert nichts an $r - teste einfach dein Beispiel von oben.

Gruß,

Gaert