PHP Sessions tarafından bir giriş sistemi kurmak için

3 Cevap php

Ben sorun # 2 kaynağını buldu. Bu * session_register (foo) * kullanılmasıdır.

* Benim * handle_registration.php için aşağıdaki koydu.

session_register("foo");
session_register("foo2");

$foo2 = $_POST['email'];
$foo['email'] = $_POST['email']

Hiçbir değişken benim oturum çerezi saklanır beri sorun hala devam etmektedir.


Bu benim login script mantığıdır.

  1. Solved by Pascal Martin ve The Disintegrator: Which is the right place to put the function session_write_close giriş oturumlarını üreten
  2. Nasıl kullanıcı "oturumu" için kalıcı bir oturum almak yeni bir oturum her zaman index.php başlamış değildir böyle yüklenir?

Benim index.php başlangıcındaki session_start() vardır.

The very Beginning of my index.php

 session_start();       
 if($_SESSION['logged_in'] == false) {
     $random_number = rand(1,100000);                                                       
     session_id($random_number);
     session_id['email'] = '';
 }

iken benim index.php çok uç

<?php
session_write_close();        // Session code ends here!
?>

Birazdan oturum kodunun başından sonra sahip kullanıcının şifre ile bir doğrulama işlemi

 $dbconn = pg_connect("host=localhost port=5432 dbname=masi user=masi password=123");
 $result = pg_prepare($dbconn, "query22", "SELECT passhash_md5 FROM users
         WHERE email=$1;");

 $passhash_md5 = pg_execute($dbconn, "query22", array($_REQUEST['email']));     
 // users from registration/login form
 if ($passhash_md5 == md5($_REQUEST['password'])) {
     $_SESSION['logged_in'] = true;
     $_SESSION['email'] = $_REQUEST['email'];
     $_SESSION['passhash_md5'] = md5($_REQUEST['password']);
 }

 // this may be unnecessary if the passhash_md5 cannot be changed by the user 
 $passhash_md5_2 = pg_execute($dbconn, "query22", array($_SESSION['email']));  
 // users staying in the site
 if ($passhash_md5_2 == $_SESSION['passhash_md5'])) {
     $_SESSION['logged_in'] = true;
 }

The code generates me continuously random sessions such that no user's data is being saved for the user. I replaced each $_REQUEST after the login/registration handlers by $_SESSION in my code, since $_REQUEST does not include $_SESSION - still the same problem and I cannot see the username in the homepage after registration/login.

3 Cevap

Sizin kod şöyle görünür:

                             -- content cut --
</html>
<?php
session_regenerate_id(true);               // Session code ends here!
session_write_close();
?>

Sen kesinlikle session_regenerate_id denir önce bazı çıktı (sayfanızın tüm içeriği, aslında) var; dolayısıyla, hata.

Sorun "boş çizgiler" veya boşluklarla değil: output ile; ve HTML is output ;-)

Like the call to session_start, the call to session_regenerate_id should be done at the beginning of the script, before anything is sent to the browser.
So, here, in the block at the "top" of your index.php.


EDIT : more thoughts.

BTW? Ben aslında session_write_close aramak gerek emin değilim; Ben muhtemelen doc alıntı ... Ve inan, bu işlevi hiç kullanmadım:

Session data is usually stored after your script terminated without the need to call session_write_close()

Uzun hesaplamalar yapıyorsun eğer kendinizi bu fonksiyonu çağırmak gerekebilir tek durumdur:

session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

Eğer senaryonun sonunda bu arıyorsun Ama bu, senin durum görünmüyor.

Yani, bu işlev için (useless ?) çağrısını kaldırarak deneyebilirsiniz ...


And, about
session_regenerate_id : do you really need to call this function on each page ?

Ben kullanıcı açtığında doğru hatırlıyorum, o zaman imtiyaz seviyesi bu fonksiyonu çağırmak için güzel (güvenlik önlemleri için, onu aramak isteyebilirsiniz bile ... işe siteniz için yeterli olacağını arayarak asla varsayalım bir kullanıcı değişiklik)

Aynı yaklaşık session_id, arada: gerçekten her sayfada bu işlevini çağırmak gerekiyor?

Bunu önlemek için çıktı tamponlama kullanmalısınız

<?php
ob_start();
everything here
ob_end_flush();
?>

Normal çıkış gerçekleşir kez başlıklarını gönderemezsiniz.

session_regenerate_id - yeni oluşturulan biriyle Geçerli oturum kimliğini güncelleyin

Bunu sen yolunu kullanırsanız, tekrar yeni oturumları getirici olacaktır.

session_id - alın ve / veya geçerli oturum id set

Bir rasgele sayı ile yeni bir oturumuna her zaman ayarı vardır.

Aslında, oturumları kullanmak için gereken tek şey yazısının başında session_start () deyimi koymaktır.