PEAR kullanarak Hata

4 Cevap php

I am learning PHP PEAR and testing the following code. However when I login, I get the following error.

Herkes koduyla yanlış ne olduğunu bana söyleyebilir misiniz?

+ + + + + + + + + + + + + + + +

Uyarı: session_regenerate_id () [function.session-yenilenme-id]: session id yeniden olamaz - zaten C gönderilen başlıklar: \ xampp \ php \ ARMUT \ Auth.php on line 830

Uyarı: başlık bilgileri değiştirilemiyor - zaten tarafından gönderilen başlıklar (çıkış C'de başladı: \ xampp \ htdocs \ php5adv \ Ch04 \ login.php: 50) C: \ xampp \ php \ ARMUT \ Auth.php on line 858

+ + + + + + + + + + + + + + + +

<?php # Script 4.3 - login.php

/*  This page uses PEAR Auth to control access.
 *  This assumes a database called "auth",
 *  accessible to a MySQL user of "username@localhost" 
 *  with a password of "password".
 *  Table definition:

    CREATE TABLE auth (
    username VARCHAR(50) default '' NOT NULL,
    password VARCHAR(32) default '' NOT NULL,
    PRIMARY KEY (username),
    KEY (password)
    )
 *  MD5() is used to encrypt the passwords.
 */

// Need the PEAR class:
require_once "Auth.php";

// Function for showing a login form:
function show_login_form() {

    echo '<form method="post" action="login.php">
<p>Username <input type="text" name="username" /></p>
<p>Password <input type="password" name="password" /></p>
<input type="submit" value="Login" />
</form><br />
';

} // End of show_login_form() function.

// Connect to the database: 
$options = array('dsn' => 'mysql://username:password@localhost/auth');

// Create the Auth object:
$auth = new Auth('DB', $options, 'show_login_form');

// Add a new user:
$auth->addUser('me', 'mypass');

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <title>Restricted Page</title>
</head>
<body>
<?php

// Start the authorization:
$auth->start();

// Confirm authorization:
if ($auth->checkAuth()) {

    echo '<p>You are logged in and can read this. How cool is that?</p>';

} else { // Unauthorized.

    echo '<p>You must be logged in to access this page.</p>';

}

?>
<a href="logout.php>Logout</a>
</body>
</html>

4 Cevap

"headers already sent" hataları başlıkları (cookies are HTTP headers, and sessions in PHP use cookies for the session identifier) bazı çıktı gönderildi zaten var olmuştur süre göndermeye çalıştığınız anlamına gelir.

Bazı çıktıya (even one white space is enough !) gönderdi olduğunda, PHP otomatik başlıklarını gönderir; olanlar zaten gönderildikten sonra ve başka bir başlık set cannont.

Yani: session_regenerate_id çağrısı önce gönderilen herhangi bir çıktı çıkarmak zorunda

Her şeyden önce, <?php etiketinin önce veya ofter ?> hiçbir beyaz-boşluk olup olmadığını kontrol edin - Bu genellikle sorunu çözer ...


Here, considering the "output started at C:\xampp\htdocs\php5adv\Ch04\login.php:50" message, I'd check in you login.php, arround line 50 ;-)

Yalnızca sonra, yapıyoruz, bazı HTML çıktısı (html, head, ... Madde) gönderiyor, ve vardır

// Start the authorization:
$auth->start();

Ben bu başlangıç ​​yöntem oturumu başlatır, ve zaten bazı HTML çıktı, başlıklar zaten gönderildi olmuştur gibi dolayısıyla, ... çerez göndermek tryies ve yenilerini gönderemezsiniz biri olduğunu tahmin ediyorum.

Bu, muhtemelen herhangi bir çıkış yapmadan önce, dosyanızın üstüne $auth->start için çağrı taşımak zorunda olacak demektir; Örneğin, Auth örneğini oluşturur PHP kod bloğunda - yani başlıklar zaten gönderilmedi.

Script ile başlamalıdır

<?php

ve sahip olduğu açıklama bloğu ve bazı yeni hatlar sonra.

Ondan önce her şey basılır ve PHP şey yazdırır eğer oturum kimlikleri sayfa içeriğine önce gönderilmesi gerekir çerezleri saklanır çünkü session id yeniden imkansız.

Her zaman komut değil, hatta bir beyaz karakterleri <?php önce bir şey var emin olun.

Eğer PHP başlamadan önce bazı metin çıktısı konum gibi görünüyor.

Sadece boşluk olsa bile, bu şeyleri kıracak.

Bu soruna bir çözüm hızlı bir sayfanın çıktısını tampon etmektir. Bu sayfa çıkış başlamadan tarafından üretilen herhangi bir başlık çıktı $auth->start meydana sağlayacaktır.

Sağ (herhangi bir boşluk önce) sayfanızın en üstünde aşağıdaki kodu yerleştirerek bunu:

<?php ob_start(); ?>

Ve altındaki bu kodu:

<?php ob_end_flush(); ?>

ob "çıktı tamponlama" anlamına gelir.