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
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
session.class.php
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 {}
}
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();