Entwickler-Ecke

Programmiersprachen (Server) - Probleme mit Session-Funktionen (PHP)


JungerIslaender - So 30.08.09 23:14
Titel: Probleme mit Session-Funktionen (PHP)
Warum funktioniert das hier:

Quelltext
1:
2:
3:
  session_start();
  session_register('username');
        $username = $_POST['username'];


das hier aber nicht:


Quelltext
1:
2:
3:
4:
  session_start();
  session_register('useremail');
  $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'";
  $useremail = mysql_query($abfrage);


Moderiert von user profile iconNarses: Titel geändert, war: "Wo ist der Fehler(2)??? php".
Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am Mo 31.08.2009 um 20:20


BenBE - So 30.08.09 23:47

Schau mal genau hin ...

Schon mal die Fehlermeldungen von PHP auf E_ALL gesetzt?

Achja: Und nutz bitte entweder Escaping oder Prepared Statements für deine Abfragen.


JungerIslaender - Mo 31.08.09 15:55

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Schau mal genau hin ...

Schon mal die Fehlermeldungen von PHP auf E_ALL gesetzt?

Wie mache ich das??


user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:

Achja: Und nutz bitte entweder Escaping oder Prepared Statements für deine Abfragen.


Die brauche ich doch nur wenn der user eine Eingabe macht oder die Abfrage verändern kann. Wie soll er das machen wenns nur von mir im Quelltext benutzt wird.

Ich finde den Fehler einfach nicht. Wenn ich es wüsste hätte ich diesen für einen Menschen der sich mit php gut auskennt lächerlichen code, nicht gepostet.


andras - Mo 31.08.09 17:42

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Warum funktioniert das hier:


Quelltext
1:
2:
3:
4:
  session_start();
  session_register('useremail');
  $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'";
  $useremail = mysql_query($abfrage);


Weil deine Variable im string steht und somit nicht der Wert der Variable genommen wird sondern der Name, aber ganz sicher bin ich mir da nicht...
Hätte das ganze so gelöst:

Quelltext
1:
2:
3:
4:
  session_start();
  session_register('useremail');
  $abfrage = "SELECT email FROM konten WHERE user LIKE ".$username;
  $useremail = mysql_query($abfrage);


BenBE - Mo 31.08.09 18:53

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Schau mal genau hin ...

Schon mal die Fehlermeldungen von PHP auf E_ALL gesetzt?

Wie mache ich das??

http://php.net/error_reporting

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:

Achja: Und nutz bitte entweder Escaping oder Prepared Statements für deine Abfragen.


Die brauche ich doch nur wenn der user eine Eingabe macht oder die Abfrage verändern kann. Wie soll er das machen wenns nur von mir im Quelltext benutzt wird.

Wird er auch ... und der Benutzer hat Einfluss darauf ...

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Ich finde den Fehler einfach nicht. Wenn ich es wüsste hätte ich diesen für einen Menschen der sich mit php gut auskennt lächerlichen code, nicht gepostet.

hmmm, War das bei "PHP in 14 Tagen" im Vorwort oder der Einleitung schon behandelt??? Oder fällt das unter Esotherische Programmierweise, weil dann würde ich Sprachen wie Whitespace empfehlen - dann sieht wenigstens keiner den Code. ;-)

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Warum funktioniert das hier:


Quelltext
1:
2:
3:
4:
  session_start(); //Starte eine Session, oder nehme die aktuelle wieder auf
  session_register('useremail'); //Registriere die Variable $username in der Session (IIRC)
  $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'"; //Greife auf die undefinierte Variable $username zu
  $useremail = mysql_query($abfrage);
//Führe eine Abfrage nach einem leeren Username durch


Tut doch, was du ihm gesagt hast ...

Ich empfehle hier mal den vollständigen Verzicht auf die Nutzung von RegisterGlobals-Magic, oder anderen PHP-Convenience-Funktionen; die reißen mehr Probleme, als sie beheben ... $_SESSION ist hier die Antwort. Dann kann übrigens auch das session_register wegfallen.

user profile iconandras hat folgendes geschrieben Zum zitierten Posting springen:
Weil deine Variable im string steht und somit nicht der Wert der Variable genommen wird sondern der Name, aber ganz sicher bin ich mir da nicht...

Ach die Variable $username wird schon ausgewertet ... die ist nur undefiniert, weil RegisterGlobals auf ordentlich konfigurierten Servern abgeschlatet ist und damit die Session nicht automatisch entpackt wird.

user profile iconandras hat folgendes geschrieben Zum zitierten Posting springen:
Hätte das ganze so gelöst:

Quelltext
1:
2:
3:
4:
  session_start();
  session_register('useremail');
  $abfrage = "SELECT email FROM konten WHERE user LIKE ".$username;
  $useremail = mysql_query($abfrage);

http://xkcd.com/327/

Mal abgesehen davon, dass das so auch nicht gehen wird ...


Christian V. - Mo 31.08.09 20:33


Quelltext
1:
$useremail = mysql_query($abfrage);                    


ist vermutlich auch nicht was du willst...

http://php.net/mysql_query

Moderiert von user profile iconKlabautermann: Code- und Url-Tags hinzugefügt


jcp - Sa 24.10.09 19:23


Quelltext
1:
session_register('useremail');                    

ist veraltet und sollte nicht mehr genutzt werden!


Quelltext
1:
2:
3:
4:
5:
session_start();
global $useremail = false;
if (isset($_SESSION['useremail'])){
    $useremail = $_SESSION['useremail'];
}


Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.


JungerIslaender - Mi 28.10.09 23:09

Cool Danke werd ich sofort ausprobieren.


jcp - Do 29.10.09 12:55

Hidiho,
ein Tip möchte ich Dir noch geben. Du solltest niemals in deinen Quelltexten $_POST, $_GET, $_SESSION oder $_SERVER verwenden. Stattdessen solltest Du gegen Schnittstellen programmieren. Ich habe für Dich hier meine Session Klassen vereinfacht als eine Klasse dargestellt, vielleicht kannste damit was anfangen und weiter ausbauen, viel Glück!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
    // session temp path
    //ini_set('seesion.save_path', "n;/temp");

    // session no hang on URLs
    ini_set('seesion.use_trans_sid', "0");

    // sesion use only cookies
    ini_set('seesion.use_only_cookies', "0");
    ini_set('seesion.use_cookies', "1");

    // session no autostart
    ini_set('seesion.auto_start', "0");

    // session trash leeren ca. aller 100 Aufrufe
    //ini_set('session.gc_probability', "1");
    //ini_set('session.gc_divisor', "100");
  
class jcp_session
{

  static $expires = 120;
  private $crypt;
  private $session;
  private $userexpires;
  private $session_name;


  public function __construct( $name = false, $time = false, $crypt = null )
  {
    $this->session_name = $name;
    $this->userexpires  = $time;
    $this->crypt        = $crypt; 
    
    $this->session = array();

        if ($this->session_name){
            session_name( $this->session_name );
        }
        session_start();

    if (is_array($_SESSION) && !empty($_SESSION) && isset($_SESSION['verfall'])){

      if ($this->check()){
        $this->session = $_SESSION;
        $this->session['verfall'] = time();
        $_SESSION = array();
      }
    }

  }

  public function save()
    {
    $_SESSION = $this->session;
    return true;
  }

  public function add( $var, $value)
  {
    if ( ! is_string( $var )){
      return false;
    }
    $this->_add($var, $value);
    return true;
  }

  public function get( $offset )
  {
    if ( is_string( $offset )){
      return $this->_get($offset);
    }

    if (!is_array($offset) || empty( $offset )){
      return null;
    }

    $values = array();
    foreach ( $offset as $index){
      $values[$index] = $this->_get($index);
    }

    if ( empty($values)){
      return null;
    }

    return $values;
  }

  public function delete( $offset = null )
  {
    if ( is_null( $offset )){
      return $this->_delete();
    }
    elseif (is_string($offset)) {
      return $this->_del( $offset );
    }
    else {
      return false;
    }
  }

  private function _del( $offset )
  {
    if ( isset( $this->session[$offset] )){
      unset($this->session[$offset]);
    }
    return true;
  }

  private function _delete()
  {
    $_SESSION = array();
    $this->session = array();
        @setcookie(session_name(), '', 0, "/");
    session_destroy();
    return true;
  }

  private function _get( $offset )
  {
    if ( isset( $this->session[$offset] )){
      if (!is_null($this->crypt)){
        return $this->crypt->encrypt($this->session[$offset]);
      }
      return $this->session[$offset];
    }
    return null;
  }

  private function _add( $varname, $value )
  {
    if (!is_null($this->crypt)){
      $value = $this->crypt->encrypt($value);
    }
    $this->session['verfall'] = time();
    $this->session[$varname] = $value;
  }

  private function check()
  {
    $zeit_old = $_SESSION['verfall'];
    if ($this->userexpires){
      $zeit_new = strtotime( '-'.$this->userexpires.' minutes');
    } else {
      $zeit_new = strtotime( '-'.self::$expires.' minutes');
    }


    if ( $zeit_new < $zeit_old ) {
      return true;
    }
    else {
      $this->_delete();
      if ($this->session_name){
        session_name( $this->session_name );
      }
      session_start();
      session_regenerate_id(true);
            
      return false;
    }
  }

}// Class End



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
inferface jcp_crypt_interface 
{
  protected function encrypt( $plaintext );
  protected function decrypt( $crypttext );
}
class jcp_crypt implements jcp_crypt_interface
{
  static $cypher = 'blowfish';
  static $mode   = 'cfb';
  static $key    = 'JCP-Nice_27985_GirlsInBikiniOnMyPrivateBeach';

  protected function encrypt( $plaintext )
  {
    $td = mcrypt_module_open(self::$cypher, '', self::$mode, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, self::$key, $iv);
    $crypttext = mcrypt_generic($td, $plaintext);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $iv.$crypttext;
  }

  protected function decrypt( $crypttext )
  {
    $td = mcrypt_module_open(self::$cypher, '', self::$mode, '');
    $ivsze = mcrypt_enc_get_iv_size($td);
    $iv = substr($crypttext,0,$ivsze);
    $crypttext = substr($crypttext, $ivsze);
    $plaintext = '';
    if ($iv){
      mcrypt_generic_init($td, self::$key, $iv);
      $plaintext = mdecrypt_generic($td,$crypttext);
      mcrypt_generic_deinit($td);
    }
    mcrypt_module_close($td);
    return $plaintext;
  }

} //Class End


Aufruf

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
$session = new jcp_session('my_session',7900, new jcp_crypt());  
//hinzufügen
$session->add('var_a','mama');
$session->add('var_b','papa');

//auslesen
$var_a = $sesion->get('var_a');
$var_b = $sesion->get('var_b');

//löschen
$session->delete('var_a');
$session->delete('var_b');

//alle löschen
$session->delete();

//session am ende zurück schreiben
$session->save();