Localhost WAMPServer 2.0 ile sayfa yükleri arasında kaybolan PHP OTURUM veri

5 Cevap php

Ben $ _SESSION değişkeni kullanarak benim web sitesinde bir PHP kimlik doğrulama sistemi var.

Bir form dosyası "login.php" için bir kullanıcı adı ve şifre gönderir. Bu gibi işlenir:

<?php include '../includes/sessionstart.inc.php'; ?>
<?php ob_start(); ?>

if($_POST){
    $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
    if(mysql_num_rows($q) >= 1){
        $f = mysql_fetch_Array($q);
        $_SESSION['company'] = $f['company'];
        $_SESSION['id'] = $f['id'];
        $_SESSION['logedin'] = true;
        session_write_close();

        ob_clean();
        header("Location: index.php");

}

Daha sonra, index.php yüklenen ve 'logedin' doğru olup olmadığını denetler edilir.

<?php include '../includes/sessionstart.inc.php'; ?>
<?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>

Benim üretim sunucusunda, o devam ediyor, ama benim WAMPServer üzerinde, geri login.php döner. Ben WAMPServer sayfa yükleme çok yavaş olduğunu fark, bu onunla bir şeyler yapmak zorunda kalabilirsiniz. Ben session_write_close dahil yüzden sayfalar açılır önce emin oturum verileri kaydedilir yapmak için, ama yardımcı olmuyor.

Session_start.inc.php içeriği sadece bulunmaktadır:

<?php
    session_start();
?>

Ben orada daha fazla kod için kullanılan, ancak şu anda sadece bu var. Ben bir içerme dosyası kullanmaya başlamadan önce sorun da var.

Herkes ben ne yapıyorum yanlış bir fikir var mı? Neden WAMPServer sonraki PHP dosyası benim OTURUM veri iletimi değil mi?

5 Cevap

Uzun bir süre sonra nihayet bu hata sabit.

Benim localhost WAMP üzerine, oturum verileri oturum verileri bir tanımlama saklanır çünkü, sayfa yükler arasında kaydedilir ve localhost için ayarlanmış olması için herhangi bir çerez alanı değil orada.

Çözüm:

'Session.cookie_domain', tüm yerel alan adları için boş dize ayarlanması gerekir, sadece 'localhost' (ama yerel IP adresleri için boş olmamalı) için:

<?php
ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>

Marcin Wiazowski sayesinde who posted it here.

Öncelikle: index logedin oturum olan bir kullanıcının izleyebilmek için garip görünüyor bu SO sadece bir yazım hatası, ya da gerçekten bir kod yazım hatası mı?

İkinci (istenen davranışa bağlı olarak), sayfaları giriş-korumalı yapmak için başka bir yaklaşım deneyin. Sayfanız gibi görünmelidir

<?php
  include 'login.inc.php';

  if(authorized()) {
    // put some more script here, if needed
    ?>
    // put some plain HTML here  
    <?php
  }
?>

login.inc.php, çerezleri oturumu kolları nerede. Bir istemci zaten bir müşteri kaydedilir değilse, bu eylem $_SERVER['PHP_SELF'] ile bir formu görüntülemek ve YANLIŞ dönmelidir oturum ise, özellikle authorized işlev TRUE dönmelidir. Eğer login_submit, sen login.inc.php doğrulama ele sağlayabilirsiniz gibi teslim-girişini şey isim eğer.

Bu şekilde, size özel bir oturum açma sayfasına kullanıcıları başvurmak gerekmez, ve giriş yaptıktan sonra, kullanıcı doğrudan istenen sayfayı gösterilir. Siz de giriş aracılığıyla sorgu dizeleri kalıcı kılmak için bu biraz çimdik.

WAMP sunucu 2 - ayarları $_SESSION var varsayılan olarak ayarlı değildir.

PHP.ini requires the following settings

C:\wamp\bin\apache\apache2.4.2\bin\php.ini
session.cookie_domain =
session.use_cookies = 1
session.save_path = "c:\wamp\tmp"   ;ensure the \ is used not /

Session testing - load.php -- load $_SESSION var.

<?PHP
session_start();
$_SESSION['SESS_MEMBER_ID'] = 'stored variable';
session_write_close();
header("location:print.php");
?>

print.php - print $ _SESSION var.

<?PHP
session_start();
var_dump($_SESSION);
?>

var_dump() sonuçlar üretmesi gerektiğini tarayıcınızda komut dosyasını çalıştırın

oturum verileri burada görünecektir içeren c:\wamp\tmp Dosyalara gidin.

Değiştirmek için çalışın

if($_POST){...}

ile

if( isset($_POST['username']) && isset($_POST['password']) ){...}

... En az hata ayıklama amaçlı. Bazı farklı ayarlar beklenen değil boş olmayan bir $ _POST dizi neden olduğunu mümkündür.

Ayrıca, kod eksik görünüyor exit() header() yönlendirmeler sonra çağırır. HTTP gönderme Location başlık otomatik komut durmuyor.

I / localhost üzerinde geliştirme için WAMPServer kullanarak bu sorunu vardı. I-session.use_only_cookies-line olarak ya da php.ini ayarını değiştirmek için gereken ya da

session.use_only_cookies = 1

karşı

session.use_only_cookies = 0

Explanation

Varsayılan çerez tabanlı oturumları kullanarak beklendiği gibi çalışıyor ama ben bir çerez daha az çözüm gerekiyordu. Bir test başlangıç ​​sayfası:

<?php
// page1.php

ini_set('session.use_cookies', '0');
session_start();

$_SESSION['time'] = time();

echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

The session data was created and skarşıred successfully in the WAMPSERVER temp direckarşıry, e.g., C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16. The link generated by the above code looks similar karşı (note the UID matches the session data file name):

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

But the destination page2.php was throwing undefined errors for the variable 'time' whilst attempting karşı retrieve the session data:

<?php
// page2.php

ini_set('session.use_cookies', '0');
session_start();

echo date('Y m d H:i:s', $_SESSION['time']);

echo '<br /><a href="page1.php?' . SID . '">page 1</a>';
?>

Önce komut biriyle session.use_only_cookies YANLIŞ ayarlayarak session_start();:

ini_set('session.use_only_cookies', '0');

veya küresel olarak değişen php.ini:

; This option forces PHP karşı fetch and use a cookie for skarşıring and maintaining
; the session id. We encourage this operation as it's very helpful in combatting
; session hijacking when not specifying and managing your own session id. It is
; not the end all be all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 0

sorunu çözüldü.