Objekt nach Aktualisierung
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
aufruf
code
dank
datenbank
glauben
http
instanz
klasse
objekt
ordnung
packen
problem
programm
sagen
session
stehen
test
url
verbindung
-
Hallo liebe Community,
erneut eine vermutlich dumme Frage, doch google konnte mir aufgrund schlecht formulierter Anfragen nicht helfen. Hier meine Frage, wie kann ich in php die Instanz einer Klasse nach einer Seitenaktualisierung behalten? Mein Code sieht wir folgt aus:
if(!isset($pagination)) $pagination = new Pagination($dbh);
Leider wird $pagination nach jeder Aktualisierung durch beispielsweise
genullt und somit neu erzeugt. Wie kann ich mein Objekt das Leben retten?<td><input type = "submit" name = "ID" value ="ID"></td>
Beste Grüße und Danke im Voraus! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Im Wesentlichen habe ich ein Objekt für die Verbindung und die Verwaltung einer Datenbank und eine Klasse um eine Pagination für die Anzeige. Beide Objekte sollten dabei natürlich nicht neu aufgesetzt werden müssen, wenn ein Button geklickt wurde. Leider ist der sich von google bietende Umfang bzgl. Sessions und Unique key's inssbesondere was deren Wirkung und Verwendung angeht sehr groß. Könnte das bitte noch einmal näher erklärt werden?
-
Ok in dem Fall macht das keinen Sinn.
Noch eine andere Idee:
Speichere deine Klasse doch in einer Session?
$_SESSION['klasse'] = new Klasse();
Ich glaube aber, dass PHP für sowas normalerweise nicht zu gebrauchen ist ;)
Aber ich habe hier Lesestoff gefunden:
http://www.developers-guide.net/c/87-objekt-persistenz.html
Auch interessant:
http://www.php-faq.de/q-sessions-objekte.html
Was auch eine Idee wäre, per GET oder POST, dann mit:
http://de2.php.net/serialize
http://de3.php.net/unserialize
Beitrag zuletzt geändert: 10.3.2011 11:55:21 von sneppa -
Danke für den Stoff, den habe ich gebraucht ^^. Dummerweise wurde mir ausschließlich PHP von der Firma vorgegeben, obwohl ich das wesentlich besser, komfortabler und einfacher in Java geschafft hätte. Aber danke für deine Hilfe.
-
klatsch das ganze in ne session. ich erklärs kurz:
das muss an den anfang jeder datei:
session_start();
damit gelangst du zugriff auf sessions mit dem aktuellen nutzer. solange der besucher auf deiner seite mit seinem browser bleibt, ist diese session eine sitzung mit einem bestimmten user.
in dieser sitzungkannst du besondere sitzungsvariablen benutzen, das $_SESSION[] array. ein assoziaties array in welchem du auch deine objekte packen kannst:
class test { public $var='test'; } if ( !isset($_SESSION['test']) ) { $_SESSION['test'] = new test; } echo $_SESSION['test']->var;
dieser code enthält die klasse erfunktioniert IMMER! aber achtung: bevor du die variable mit der instanz benutzen kannst, musst du die klasse deklariert haben! ein weiterer code erläutert das ganze:
class test { public $var; } if ( !isset($_SESSION['testt']) ) { $_SESSION['testt'] = new test; $_SESSION['testt']->var = 'tata'; } echo $_SESSION['testt']->var;
dieser code wird jedesmal "tata" rausschmeißen. wichtig ist dass die klasse vor dem ersten benutzen des ganzen eingebunde wrid!! der prototyp muss bekannt sein.
wenn ich mich nich vertan habe müsste das alles wunderbar gehen. alle infos zu einer session an sich findest du hier:
http://tut.php-q.net/de/sessions.html
find ich gut erklärt -
ggamee, wie schon geschrieben funktioniert das nicht mit Methoden!
Nicht etwa, weil es nicht könnte, sondern einfach, weil PHPs Architektur es nicht hergibt.
Keine Probleme bereiten Objekte aus internen Klassen wie stdClass oder dir. Doch
Objekte in PHP geschriebener Klassen kann das SessionManagement nicht wieder
herstellen. Die Objekte degenerieren hierbei zu "unvollständigen Klassen", die
zwar wie eine stdClass alle Eigenschaften behalten haben, aber um jegliche Methoden
beraubt sind.
http://www.developers-guide.net/c/87-objekt-persistenz.html
Beitrag zuletzt geändert: 10.3.2011 17:27:47 von sneppa -
Die Umstellung hat erstaunlich gut funktioniert, allerdings bin ich immernoch damit beschäftigt ein paar unverständliche Krankheiten auszulöschen.
function GetTotalAmount() { $query = "SELECT Count(*) FROM steuertabelle"; $resource = mysql_query($query); $array = mysql_fetch_array($resource); return $array[0]; }
In diesem Block wirft er die Exception:
mysql_fetch_array() expects parameter 1 to be resource, boolean given
Ich würde mal vermuten, dass er die Datenbankverbindung verloren hat, aber wie kann ich das verhindern? Oder irre ich mich in der Diagnose und es liegt an etwas anderm? Der Code hat bis weilen ohne zu murren geackert, also vermute ich ein externes Problem.
<?php require_once('Source/Database/DatabaseHandler.php'); require_once('Source/PHP/GUI/Pagination.php'); session_start(); if(!isset($_SESSION['dbh'])) $_SESSION['dbh'] = new DatabaseHandler(); ?> <!-- Creates the GUI Elements and Combines them to the majorsite --> <?php include("Source/PHP/GUI/NavigationTree.htm"); ?> <?php include("Source/PHP/GUI/DatabaseTable.htm"); ?> <?php include("Source/PHP/GUI/CommandEditor.htm"); ?>
//DatabaseTable
if(!isset($_SESSION['pagination'])) $_SESSION['pagination'] = new Pagination($_SESSION['dbh']); $totalAmount = floor($_SESSION['dbh']->GetTotalAmount()/$_SESSION['pagination']->GetPaginationSize())+1;
-
Könnte ich mir gut vorstellen, dass du mit keiner Datenbank verbunden bist, da die Verbindung nicht zwangsläufig direkt was mit der Klasse zu tun hat.
Hast du vor dem Aufruf der Klasse ein mysql_connect? -
Bei
sollte glaube ich als zweiter Parameter das Connection-Objekt mitgegeben werden.$resource = mysql_query($query);
-
@sneppa: Eigentlich sollte eine __PHP_Incomplete_Class nur entstehen, wenn die Klasse zum Zeitpunkt des unserializens nicht verfügbar ist. Um das Problem von Klassen-Autoloading zu lösen wird die ini-Option unserialize_callback_func geboten, damit Klassen vor dem unserializen noch geladen werden können.
@wagerm: Das ist ein optionales Argument. Wenn du es nicht angibst, wird die letzte über mysql_connect erstellte Datenbank-Instanz erstellt.
@all: Man kann Resources generell nicht cachen. Eine MySQL-Connection in einer Session zu speichern ist technisch nicht möglich.
@pantherstyle: Ich habe die Befürchtung, dass du gerade etwas in die falsche Richtung denkst (ich bin mir aber nicht ganz sicher). Möchtest du die Datenbankverbindung / Pagination-Klasse Seiten übergreifend machen, damit du einen Performance Gewinn bekommst? Wenn das deine Absicht ist, dann vergiss das mit der Session lieber wieder ;) PHP ist nicht so langsam, dass das erstellen eines Objekts oder das Verbinden zu einer Datenbank irgendeinen Einfluss auf deine Performance nehmen könnte. Was du aber vielleicht machen möchtest, ist, eine persistente Datenbankverbindung zu erstellen (ich glaube mysql_ bietet dies noch nicht, aber mysqli und PDO MySQL können dies in jedem Fall). Dabei wird die Datenbankverbindung in einem Connection Pool gecacht und immer wieder verwendet. (Bedenke aber, dass dies je nach genauem Nutzungszweck auch Komplikationen schaffen kann. Transactions, Locks oder direkte Handler-Zugriffe könnten dabei problematisch werden.)
Also, könntest du nochmal genauer sagen, was du damit bewirken willst? Ich habe die Vermutung, dass du da versuchst ein Problem zu beheben, dass gar nicht existiert.
Beitrag zuletzt geändert: 10.3.2011 16:19:41 von nikic -
Ich habe mir gleich gedacht, dass das Problem mit dem in der Session gespeicherten Objekt, das nicht wieder herstellbar ist, nur dann auftritt, wenn die Klasse zur Neuinitialisierung nicht verfügbar ist. Und genau das steht auch auf der Seite, die Sneppa verlinkt hat:
Die Lösung des Problems ist eigentlich sehr simpel. Die Klassen müssen inkludiert werden, bevor session_start() aufgerufen wird.
Das ganze funktioniert aber nur in PHP, in anderen Sprachen, in denen Objekte nicht in Variablen, sondern nur Verweise auf sie in Variablen gespeichert werden können, funktioniert das ganze nicht. In PHP ist das ganze ziemlich verzwickt, was man spätestens dann feststellen muss, wenn man gleichzeitig einen Klon eines Objekts und einen Verweis auf ein Objekt gleichzeitig handhaben und auch noch irgendwie speichern muss.
Ob die von Nikic genannte Vorgehensweise auf Lima funktioniert, weiß ich gerade nicht. -
stimmt, resoucen in die session packen geht nich so einfach bzw ne connection zur DB garnicht. mit Objekten an sich gehts schon. (hab dir den code geschickt sneppa). und wenn du oben das gelesen hast dann bestätigt deine seite das, ebenso wie drafed-map das sagt. der prototyp muss vor dem nutzen des objektes auch geladen sein, dann kannst du objekte ohne probleme in sessions packen.
mit mysql_pconnect aknnst du persistente verbindungen zu MYSQL aufbauen
http://www.php.net/manual/de/function.mysql-pconnect.php
da muss ich nikic recht gehen: für performance holst du da nichts raus. mach jedesmal wieder ne verbindung, das ist leichter und genau so performant. außerdem hat drafed-map recht: es wird verzwickt, und das wolln wa nich das ist sonst blöd.
mach es einfach, das ist meist der beste weg -
Performancezwecke stehen bei mir zwar imer im Vordergrund, aber in diesem Fall versuche ich wie immer erst mal effektiv das zu erreichen, was in meiner Aufgabenstellung steht. Erst danach kommt das Effizienzgerechte Feintuning dran. Im Wesentlichen besteht die momentane Teilaufgabe daraus Daten aus einer Datenbank zu lesen und in eine Tabelle zu packen (was vor der Session funktioniert hat). Weil große Datenmengen aber nicht so hübsch sind habe ich mir gedacht, das eine Pagination, also ein Zugriff über mehrere Einzelseiten der Übersichtlichkeit gütlich täte. Als nächster Punkt stehen noch ein Filter und eine Ordnung auf dem Plan, aber die dürften kein Problem werden.
Viele der Probleme ergeben sich vermutlich daraus, dass ich aus dem Javabereich / C# stamme und nicht an schwach typisierte und nach dem Aktualisieren verschwindende Variablen gewohnt bin und daher wahrscheinlich schwer nachzuvollziehende Wege gehe^^
Das mit dem mySQLi werde ich mal testen, wenn es noch keine Rückmeldung gegeben haben wird (Futur 2 ist meine Lieblingszeitform) hat es vermutlich noch nicht geklappt. Zusammengefasst möchte ich eigentlich nur ein paar nicht Verlustbehaftete Objekte wie ich sie aus Java gewohnt bin, Alles andere ist noch uninteressanter.
Beste Grüße und Danke bisher.
Edit: Ich arbeite mit mehreren geschachtelten Seiten, da ich ein Freund von Abstraktion und der durch sie geschaffenen Ordnung bin. Demnach werden auch die Einzelseiten in ihrem logischen Rahmen eingebunden und ihrer Aufgabe entsprechend getrennt.
Edit2: Teilproblem Pagination wurde durch die Session gelöst. Der Code funktioniert wie geplant. mySQL COnnection bleibt weiterhin verschollen...
Beitrag zuletzt geändert: 11.3.2011 8:59:17 von pantherstyle -
pantherstyle schrieb:
Naja, in Java gibt es auch schwach typisierte Variablen. Das mit dem Verschwinden der Variablen musst du etwas anders betrachten: Sagen wir, das PHP-Script sei ein Programm auf deinem Rechner. Du rufst es auf und es rechnet. Am Ende des Codes wird eine Variable deklariert. Zu Beginn des Codes wird geprüft, ob diese Variable existiert und dann entsprechend reagiert. Sagen wir, dass das Programm die Ausgabe 1 in die Konsole schreibt, wenn die Variable deklariert wurde und 0 ausgibt, wenn nicht. Du compilierst das Programm und rufst es 2 Mal auf. Wunderst du dich, dass du 2 Mal eine 0 bekommst? Bestimmt nicht.
Viele der Probleme ergeben sich vermutlich daraus, dass ich aus dem Javabereich / C# stamme und nicht an schwach typisierte und nach dem Aktualisieren verschwindende Variablen gewohnt bin und daher wahrscheinlich schwer nachzuvollziehende Wege gehe^^
So ist das auch in PHP: Bei jedem Aufruf wird das Script geladen und Zeile für Zeile interpretiert (deswegen muss es nicht kompiliert werden). Dann läuft das Script ab. Das Script besteht nur aus diesem Code:
Das ist zwar jetzt technisch nicht korrekt, weil das Programm für PHP schon läuft, und auch bis zu seiner Beendigung laufen wird, aber betrachte jeden Scriptaufruf als Programmaufruf, dann können solche Fehler nicht mehr so leicht passieren.<?php if(isset($var)) { echo '1'; } else { echo '0'; } $var = 'Ein beliebiger Text'; ?>
-
Das Grundprinzip sitzt ja mittlerweile ein bissel besser um nicht sogar gut zu sagen, aber gegen die angeblich Schwache Typisierung von Java muss ich Wiederspruch einlegen, da es afaik eine stark typisierte statische Sprache ist. Den ABlauf von PHP habe ich mir im Kopf aber eher wie mit den Listenern verglichen, die lediglich das Komplette Panel noch einmal Konstruieren müssen bevor sie ihr eigenes Signal verarbeiten können.
-
@pantherstyle: Ja, das ist genau das Problem. Du denkst zu sehr Java. In PHP packst du deine persistenten Daten in die Datenbank. Und rufst sie von dort jedes Mal ab. Variablen wirklich persistent zu machen, ist nur in den seltensten Fällen sinnvoll und in solchen Fällen benutzt du dann einen Memory-basierten Cache wie APC.
Ich zumindest habe nachwievor nicht verstanden, was dir persistente Variablen bei deinem Programm bringen. Wo liegt das Problem, wenn du die Datenbankverbindung jedes Mal neu erstellst? Oder wenn du die Pagination Klasse jedes mal neu instanziierst? Aus deiner aktuellen Beschreibung geht nicht wirklich hervor, was da nicht geht. (Auch wenn ich eine blasse Ahnung habe, dass du gerade ohne Front-Controller arbeitest und das eventuell dein Problem sein könnte...) -
Mich jedes mal aufs neue mit der Datenbank zu verbinden ist nicht das Problem, da das ja innerhalb eines atomaren Prozesses stattfindet. Die Datenbankverbindung wird auch in jeder Objektmethode neu erzeugt und danach wieder geschlossen. Das eigentliche Problem ist, dass die Variablen zu einloggen und manch andere Information ja ausgewählt werden müssen. Hier meldet sich ja der User z.B. in der DB mit Namen und Passwort an, aber die soll er ja nicht bei jedem Seitenaufruf neu eingeben müssen... (Auf den Trichter wie ich diese Variablen erhalten kann bin ich noch nicht gekommen). Wie ließen sich denn diese dynamischen Daten temporär in einer Datenbank oÄ halten?
Bei der Pagination gilt das ganz ähnlich. Hier wird beispielsweise festgehalten, auf welcher Seite sich der User befindet, welchen Filter er gesetzt hat und welche Ordnung besteht. Diese soll er ja auch nicht immer wieder neu einsetzen müssen. Ich hoffe, dass die Sache langsam etwas klarer wird.
PS. Persistent sollen die Daten ja gar nicht sein, sondern nur zur Verfügung stehen während der User das Programm bedient.
Beitrag zuletzt geändert: 11.3.2011 9:28:59 von pantherstyle -
pantherstyle schrieb:
Ich habe
aber gegen die angeblich Schwache Typisierung von Java muss ich Wiederspruch einlegen, da es afaik eine stark typisierte statische Sprache ist.Naja, in Java gibt es auch schwach typisierte Variablen.
geschrieben, das soll sagen, dass es in Java mitunter schwach typisierte Variablen gibt. In eine Variable vom Typ Object kann man so weit ich weiß alles rein packen, mit Gewalt sogar einen primitiven Wert. Wenn du dir dann den String noch als eine Einheit vorstellst, bist du schon fast bei den PHP-Variablen. Zumindest bei den Variablen, in denen keine Objekte gespeichert werden.
Und wehe es kommt jetzt jemand damit, wie man die Zeichen eines Strings ansprechen kann .
pantherstyle schrieb:
Das regelt man mit einer Session. Eine gute Anleitung gibt es hier.
Das eigentliche Problem ist, dass die Variablen zu einloggen und manch andere Information ja ausgewählt werden müssen. Hier meldet sich ja der User z.B. in der DB mit Namen und Passwort an, aber die soll er ja nicht bei jedem Seitenaufruf neu eingeben müssen... (Auf den Trichter wie ich diese Variablen erhalten kann bin ich noch nicht gekommen). Wie ließen sich denn diese dynamischen Daten temporär in einer Datenbank oÄ halten?
Bei der Pagination gilt das ganz ähnlich. Hier wird beispielsweise festgehalten, auf welcher Seite sich der User befindet, welchen Filter er gesetzt hat und welche Ordnung besteht. Diese soll er ja auch nicht immer wieder neu einsetzen müssen. Ich hoffe, dass die Sache langsam etwas klarer wird. -
Meinst du mit den schwach typisierten Variablen zufällig Mutterklassen oder implizit cast-bare Typen? Denn für Java ist das Casten von Typen zwischen Klassen prinzipiell vorgegeben. Dies trifft als einzges nicht zu, wenn eine Konvertierung verlustfrei (int nach float) oder in eine Mutterklasse erfolg (beliebige Klasse nach Object). Strings sind in dem sinne tatsächlich auch Objekte da sie nicht wie die Primitiven aus nur einer Speichereinheit bestehen, sondern auf dem besagten Array beruhen^^
Das Tutorial werde ich mir sogleich durchlesen, ich wollte nur noch mal die schach-typisierte Java Diskussion anheizen ^^
Update: Vorhandenes Problem lag nicht an der Datenbank oder Session, sondern nur an Ermangelung deutscher Gründlichkeit, da ich in einer eingebundenen Datei die Umstellung auf Session veräumt habe, wodurch der nachfolgende Code simpel nicht ausgeführt wurde.
Vielen Dank also an die zahlreichen hilfreichen Antworten!
Leider muss ich prognostizieren, dass dies nicht das letzte Problem gewesen sein wird.
PS. Wie werte ich diesen Beitrag als Gelöst / Geschlossen?
€dit by nikic: Geschlossen.
Beitrag zuletzt geändert: 11.3.2011 16:57:21 von nikic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage