php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.10.2011, 23:38  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

session_set_save_handler erwartet eine Reihe von Callbacks. Du bist also nicht gezwungen, Strings zu verwenden und alle Zugriffe noch einmal zu wrappen. Ein Objekt und seine Methode kann ebenfalls ein Callback sein. session_set_save_handler sollte so schlau sein und das SessionHandler-Objekt dabei zwischenspeichern. Bei anderen Funktionen, die Callbacks verarbeiten gehts jedenfalls auch (z.B. set_error_handler).
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.10.2011, 12:13  
Neuer Benutzer
 
Registriert seit: 19.10.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
TKing befindet sich auf einem aufstrebenden Ast
Standard

Sooo... nun habe ich es hinbekommen die session in die db zu schreiben, aber es klappt nicht, so wie ich es mir gedacht habe. Er schreibt immer wieder eine gleiche session in die db. wie bekomme ich es hin, dass es nur pro user eine session gibt?

Mein Code:

PHP-Code:
<?php 
$mysqli 
= new mysqli $_config ['DB_HOST'], $_config ['DB_USER'], $_config ['DB_PASS'], $_config ['DB_DBNAME'] );
    function 
sess_open($sess_path$sess_name) {
        return 
true;
    }

    function 
sess_close() {
        return 
true;
    }

    function 
sess_read($sess_id) {
        
        global 
$DBConnection;
        
        if (
$stmt $DBConnection->prepare "SELECT 
                                                                    session_data 
                                                                FROM
                                                                    session_handler
                                                                WHERE
                                                                    session_id = ?;" 
)) {
            
$stmt->bind_param "s"$sess_id );
            
$stmt->execute ();
            
$stmt->bind_result $ses_value );
            
            
            if (
$stmt->num_rows () === 0) {
                
                
$current_time time ();
                
                global 
$mysqli;
                
                if(
$stmt_insert $mysqli->prepare "INSERT INTO 
                                                                session_handler (session_id, session_expires) 
                                                            VALUES 
                                                                (?, ?);" 
)){
                
                    
/**
                     * Hier kann das session_expires noch hochgesetzt werden. Jetzt ist es
                     * nur das insert Datum.
                     */
                    
$stmt_insert->bind_param "si",$sess_id$current_time );
                    
$stmt_insert->execute ();
                }
                    
                
                return 
true;
            } else {
                
                global 
$mysqli;
                
                if (
$stmt_update $mysqli->prepare "UPDATE 
                                                            session_handler
                                                          SET
                                                              session_expires = ?
                                                          WHERE
                                                              session_id = ?;" 
)) {
                    
                    
$stmt_update->bind_param "is"$current_time$sess_id );
                    
$stmt_update->execute ();
                }
                return 
$ses_value;
            }
        }
        return 
'';
    }

    function 
sess_write($sess_id$data) {
        
        global 
$_config;
        
$mysqli = new mysqli $_config ['DB_HOST'], $_config ['DB_USER'], $_config ['DB_PASS'], $_config ['DB_DBNAME'] );
        
        
$current_time time ();
        
        if (
$stmt_update_second $mysqli->prepare "UPDATE 
                                                                        session_handler
                                                                      SET
                                                                          session_data = ?,
                                                                          session_expires = ?
                                                                      WHERE
                                                                          session_id = ?;" 
)) {
            
            
$stmt_update_second->bind_param "sis"$data$current_time$sess_id );
            
$stmt_update_second->execute ();
        }
        return 
true;
    }

    function 
sess_destroy($sess_id) {
        
        global 
$DBConnection;
        
        if (
$stmt_delete $mysqli->prepare "DELETE 
                                                    session_handler
                                               WHERE
                                                    session_id = ?;" 
)) {
            
            
$stmt_delete->bind_param "s"$sess_id );
            
$stmt_delete->execute ();
        }
        return 
true;
    }

    function 
sess_gc($sess_maxlifetime) {
        
        
$current_time time ();
        
        if (
$stmt_delete $mysqli->prepare "DELETE 
                                                    session_handler
                                               WHERE
                                                    session_expires + $sess_maxlifetime < ?;" 
)) {
            
            
$stmt_delete->bind_param "i"$current_time );
            
$stmt_delete->execute ();
        }
        return 
true;
    }

    
session_set_save_handler("sess_open""sess_close""sess_read""sess_write""sess_destroy""sess_gc");
    
session_start();

    
$_SESSION['irgendwas'] = "bar";
    
$_SESSION['foo'] = "bar";
    
$_SESSION['baz'] = "wombat";
?>
Sieht vllt ein bisschen tricky aus, aber wird noch aufgeräumt

Hier die Datenbank ausgabe:



Vor allem werden immer zwei zeilen nach einem reload geschreiben

Geändert von TKing (29.10.2011 um 12:18 Uhr).
TKing ist offline   Mit Zitat antworten
Alt 31.10.2011, 16:22  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

1) Du hast vergessen, das Ergebnis von Deinem SELECT auf die Session-Daten zu fetchen.

2) Dein Session-Handler ist anfällig für eine Racecondition, falls ein User mehrere Skripte gleichzeitig aufruft (das kann z.B. bei Frames und u.Umst. auch bei IFrames passieren.)

3) Du arbeitest noch immer viel zu viel mit globalen Variablen. Das solltest Du Dir abgewöhnen.

4) Du brauchst keinen Datenbankenbasierten Session-Handler.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 12.11.2011, 13:17  
Neuer Benutzer
 
Registriert seit: 19.10.2011
Beiträge: 12
PHP-Kenntnisse:
Fortgeschritten
TKing befindet sich auf einem aufstrebenden Ast
Standard

Ist es möglich mittels mysqli das Ergebnis eines Selects dynamisch zu gestalten? Also das man eine Abfrage macht und dieses dann als array fetcht,welches man zurück gibt? Irgendwie geht es nicht und die funktion fetch_array steht mir nicht zur verfügung... also wenn ich das mysqli objekt mir get_class_methods ausgebe dann habe ich nur folgendes:

PHP-Code:
array(20) {
  [
0]=>
  
string(11"__construct"
  
[1]=>
  
string(8"attr_get"
  
[2]=>
  
string(8"attr_set"
  
[3]=>
  
string(10"bind_param"
  
[4]=>
  
string(11"bind_result"
  
[5]=>
  
string(5"close"
  
[6]=>
  
string(9"data_seek"
  
[7]=>
  
string(7"execute"
  
[8]=>
  
string(5"fetch"
  
[9]=>
  
string(12"get_warnings"
  
[10]=>
  
string(15"result_metadata"
  
[11]=>
  
string(12"more_results"
  
[12]=>
  
string(11"next_result"
  
[13]=>
  
string(8"num_rows"
  
[14]=>
  
string(14"send_long_data"
  
[15]=>
  
string(11"free_result"
  
[16]=>
  
string(5"reset"
  
[17]=>
  
string(7"prepare"
  
[18]=>
  
string(12"store_result"
  
[19]=>
  
string(10"get_result"

wieso ist das so?

Eigentlich habe ich mysqli immer für Objekte genutzt, wobei ich bei Tabellen, welche des öfteren mal erweitert werden, dass ich dann einige funktionen (Select * from ...) bei den bind_results und den models anpassen muss.

Oder kann man hierbei nur eine gewöhnliche mysql verbindung nutzen?
TKing ist offline   Mit Zitat antworten
Alt 12.11.2011, 13:28  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von TKing Beitrag anzeigen
also wenn ich das mysqli objekt mir get_class_methods ausgebe dann habe ich nur folgendes:
Falsche Baustelle.
Sowas solltest du im Handbuch nachschlagen, anstatt dir die Methoden eines Objektes per Script ausgeben zu lassen.
Dann hätte dir recht schnell auffallen können, dass die MySQLi_Result-Klasse eine entsprechende Methode hat …
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Probleme mit Session Variablen Oliver24 PHP Einsteiger 11 08.07.2011 08:03
Übergeben von Variablen an in PHP eingebundenes Perl-Script shredder01 PHP Tipps 2008 3 04.04.2008 09:25
Datei mit Variablen so includen, dass Variablen nutzbar? BartTheDevil89 PHP Tipps 2008 6 22.01.2008 20:57
Problem mit globalen Variablen noBody PHP Tipps 2007 9 29.03.2007 12:35
Teil einer Variablen mit einer Variablen ersetzen ? simsalabim PHP Tipps 2007 11 20.03.2007 20:36
probleme mit globalen variablen PHP Tipps 2005-2 2 18.07.2005 17:33
Sehr seltsame Probleme mit "POST" und "$_POST PHP Tipps 2005-2 5 05.07.2005 10:57
variablen zusammensetzen...syntax probleme PHP Tipps 2005-2 2 08.06.2005 15:10
Probleme beim Variablen übergeben... PHP Tipps 2005 6 31.05.2005 13:14
Probleme mit Formular und Variablen PHP Tipps 2005 6 04.04.2005 14:58
Probleme mit include oder Variablen PHP Tipps 2005 11 16.03.2005 22:30
Variablen übergeben bzw. auslesen? PHP Tipps 2005 4 30.01.2005 03:56
Auswertung mit globalen Variablen duerov PHP Tipps 2004 4 07.09.2004 14:23
[Erledigt] Probleme mit isset() und globalen Arrays PHP Tipps 2004 5 24.08.2004 09:50
Variablen per adresse übergeben rocco PHP Tipps 2004 7 24.07.2004 12:03


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum