• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

mit javascript bestimmte PHP-funktion aus Klasse aufrufen

Kizetsu

Neues Mitglied
Hi,

erstmal: Da ein anderer Forenthread, in dem von 2009 noch steht, dass es nicht möglich wäre via javascript eine php-funktion aufzurufen, immernoch unter den ersten Google-Einträgen steht bei einer Suche nach "php funktion mit javascript ausführen" hoffe ich, dass dieser Thread bei den Suchergebnissen etwas nach oben gepushed wird. Ich hätte in diesem Thema ja eine Aktuallisierung gepostet aber durch das Alter ist dieses Thema verständlicherweise geschlossen.

So, zu meinem eigentlichen Vorhaben:
Ich habe aktuell zu Testzwecken eine pgsql-basierte Sessionverwaltung mit einer php-klasse gebastelt. Soweit funktioniert es optimal. Ich kann auch problemlos die Daten auslesen, ABER: Ich möchte gern jederzeit die SessionData ändern können, wie es mir grade passt. Um zum Beispiel relevante Daten über die gesammte Sessionlaufzeit mit dem User mit zu führen und überall nutzen zu können.

Ich will nun aus meiner index.php (standard content) die Funktion write aus meiner session.class.php aufrufen. Hier übergebe ich erst mal einen simplen String durch Usereingabe. Jetzt taucht das Problem auf:
Die PHP Klasse baut sich wie folgt auf
PHP:
<?php
class session {
    public function open {}
    public function close {}
    public function read {}
    public function write {}
    public function destroy {}
    public function gc {}
}
Die funktionen in der Klasse referenzieren sich gegenseitig. (Den genauen Code gibt es unten)
Wenn ich nun über ein jQuery-post versuche die wirte-Funktion aufzurufen läuft er nicht diese an sondern das gesamte Skript. Das ist unpraktisch, denn dadurch werden die Variablen, die ich mit dem Post mitliefere bis zur write-Funktion überschrieben.

Nun ist also die Frage: Wie rufe ich eine bestimmte Funktion aus dieser Klasse auf?


nachfolgend der Code:

index.php
PHP:
<!DOCTYPE html>
<?php include_once ('session.class.php'); ?>

<style type="text/css">
    div            { display: block; }
    div.hidden     { display: none;  }
    .twelve        { width: 100%;    }
    .red           { color: red;     }
    .green         { color: green;   }
</style>

<script type="text/javascript" src="jquery-ui-1.9.1.custom.min.js"></script>
<script type="text/javascript">

    $(document).ready(function() {
        add_events();
    });
    
    function add_events()
    {
        $('#send').click(function(e) {
            $('#send').toggleClass("green");
            $('#send').toggleClass("red");
            $.post("http://meinedoma.in/session.class.php/write", {
                sessID:   '<?= $_COOKIE['PHPSESSID'] ?>',
                sessData: $('#sessdata').val()
            }, function(data) {
                e.preventDefault();
            });
            $('#send').toggleClass("red");
            $('#send').toggleClass("green");
        });
    };

</script>

<p>Your Cookie looks like:</p>
<table border="1px" class="twelve">
    <tr>
        <th>ID</th>
        <th>DATA</th>
        <th>EXPIRATION</th>
    </tr>
        <?= $ses_id ? '<td style="color: green;">' . $ses_id : '<td style="color: red;">$ses_id = null'; ?></td>
        <?= $ses_data ? '<td style="color: green;">' . $ses_data : '<td style="color: red;">$ses_data = null'; ?></td>
        <?= $ses_expiration ? '<td style="color: green;">' . $ses_expiration : '<td style="color: red;">$ses_expiration = null'; ?></td>
    </tr>
</table>
<input id="sessdata" type="text" placeholder="SESSDATA" />
<label id="send" class="green">Senden</label>
<br />

session.class.php
PHP:
<?php
class session {

    public function open($savePath, $sessName) {

        $this->PG_HOST = 'meinedoma.in';
        $this->PG_USER = 'user';
        $this->PG_PASS = 'passwort';
        $this->PG_DATA = 'mydatabase';


        // Connecting, selektiere database
        $dbconn = pg_connect("host = " . $this->PG_HOST . " dbname = " . $this->PG_DATA . " user = " . $this->PG_USER . " password = " . $this->PG_PASS)
                or die('Could not connect: ' . pg_last_error());

        return true;
    }

    public function close() {

        return true;
    }

    public function read($sessID) {


        // fetch session-data
        $sql = "SELECT *
                FROM Sessions
                WHERE session_id = '" . $sessID . "'";
        $result = pg_query($sql) or die('Query failed: ' . pg_last_error());

        // Fehler im Query, return leeren String
        if (!$result) {
            return '';
        } else {
            $row = pg_fetch_assoc($result);

            $this->ses_id = $row['session_id'];
            $this->ses_data = $row['session_data'];
            $this->ses_expiration = $row['session_expiration'];


            print_r("| SES_ID = " . $this->ses_id . " |");
            print_r("| SES_DATA = " . $this->ses_data . " |");
            print_r("| SES_EXPIRATION = " . $this->ses_expiration . " |");

            print_r("<b>| CONTENT => </b>");
            return $row["session_data"];
        }
    }

    public function write($sessID, $sessData) {
        print_r("<b> <= CONTENT || WRITE |</b>");

        // session-lifetime
        $lifeTime = 3600;

        // new session-expire-time
        $newExp = time() + $lifeTime;

        // wird eine Session mit dieser ID in der Datenbank gefunden?

        print_r("| SESSION_ID = " . $sessID . " |");
        print_r("| SESSION_DATA = " . $sessData . " |");
        print_r("| SESSION_EXPIRATION = " . $newExp . " |");

        $sql = "SELECT *
                FROM Sessions
                WHERE session_id = '" . $sessID . "'";
        $result = pg_query($sql) or die('Query failed: ' . pg_last_error());
        $check = pg_fetch_assoc($result);

        if (!$check) {
            /* Wenn keine passende Zeile in der Datenbank gefunden werden kann */
            $sql = "INSERT INTO sessions (session_id, session_expiration, session_data)
                    VALUES ('" . $sessID . "', " . time() . ", '" . $sessData . "')";
            $result2 = pg_query($sql) or die('Query failed: ' . pg_last_error());
            ;
        } else {
            /* Wenn ein passender Eintrag in der Datenbenk gefunden wird */
            $sql = "UPDATE sessions SET
                session_expiration = '" . time() . "',
                    session_data = '" . $sessData . "'
                WHERE session_id = '" . $sessID . "'";

            $result3 = pg_query($sql) or die('Query failed: ' . pg_last_error());
            ;
        }
        return (bool) @pg_query($sql);
    }

    public function destroy($sessID) {
        // delete session-data

        $sql = "DELETE FROM Sessions
                WHERE session_id = '" . $sessID . "'";
        return (bool) @pg_query($sql);
    }

    public function gc($sessMaxLifeTime) {
        // delete old sessions

        // session-lifetime
        $lifeTime = 3600;

        $sessMaxLifeTime = time() - $lifeTime;

        $sql = "DELETE FROM Sessions
                WHERE session_expiration < " . $sessMaxLifeTime;
        return (bool) @pgsql_query($sql);
    }

}

$session = new session();
session_set_save_handler(array(&$session, "open"), array(&$session, "close"), array(&$session, "read"), array(&$session, "write"), array(&$session, "destroy"), array(&$session, "gc"));
session_start();
 
Ohne mir das jetzt alles durchgelesen zu haben, aber mein erster Gedanke dazu ist:

Wäre es denn nicht möglich, aus write() einen Konstruktor zu bauen, der beim instanzieren der Klasse automatisch ausgeführt wird?
 
Hi Tronjer und danke für deine Antwort.

Auf die Idee war ich noch gar nicht gekommen...

Ärgerlich aber ich hab einen anderen Lösungsansatz gefunden: Die Session-Klasse wird bei jedem Seitenaufruf abgearbeitet und aktuallisiert eigentlich nur die expiration time der session bzw. löscht die session wenn eine bestimmte zeit nichts passiert ist. Da ich nun in meinen Seiten mit Actions und Templates arbeite habe ich mich dazu entschlossen das ganze so umzusetzen, dass jede action, sofern dies nötig ist, eine write-Funktion ausführt und den Wert von sessData entsprechend in der Datenbank ändert. Somit bin ich auch in der Lage jeder Action genau fest zu setzen was sie ändern darf und was nicht.
Das ist für mich sehr praktisch, da die session später evtl. noch weitere Werte bekommt aber das bleibt abzuwarten.

LG
 
Zurück
Oben