Post a E-mail with attached file ( error ) 2
edward@ita.org.mo
edward@ita.org.mo
Mon, 12 Nov 2001 18:42:38 +0800
---------------------- multipart/mixed attachment
Dear all,
Can you help help me about the error result :
Warning: Cannot add more header information - the header was already
sent (header information may be added only before any output is
generated from the script - check for text or whitespace outside PHP
tags, or calls to functions that output text) in session.inc on line 448
Warning: Cannot add more header information - the header was already
sent (header information may be added only before any output is
generated from the script - check for text or whitespace outside PHP
tags, or calls to functions that output text) in session.inc on line 449
Warning: Cannot add more header information - the header was already
sent (header information may be added only before any output is
generated from the script - check for text or whitespace outside PHP
tags, or calls to functions that output text) in session.inc on line 450
---------------------- multipart/mixed attachment
<?php
/*
* Session Management for PHP3
*
* Copyright (c) 1998,1999 NetUSE GmbH
* Boris Erdmann, Kristian Koehntopp
*
* $Id: session.inc,v 1.1.2.17 2001/03/23 14:45:52 bjn Exp $
*
*/
class Session {
var $classname = "Session"; // Needed for object serialization.
// Define the parameters of your session by either overwriting
// these values or by subclassing session (recommended).
var $magic = ""; // Some string you should change.
var $mode = "cookie"; // We propagate session IDs with cookies
var $fallback_mode; // If this doesn't work, fall back...
var $lifetime = 0; // 0 = do session cookies, else minutes
var $cookie_domain = ""; // If set, the domain for which the
// session cookie is set.
var $gc_time = 1440; // Purge all session data older than 1440 minutes.
var $gc_probability = 1; // Garbage collect probability in percent
var $auto_init = ""; // Name of the autoinit-File, if any.
var $secure_auto_init = 1; // Set to 0 only, if all pages call
// page_close() guaranteed.
var $allowcache = "no"; // Set this to 'private' to allow private
// caching; set this to 'public' to allow
// public caching; set this to 'no' to
// never cache the page.
var $allowcache_expire = 1440; // If you allowcache, data expires in this
// many minutes.
var $that_class = ""; // Name of data storage container
//
// End of parameters.
//
var $name; // Session name
var $id; // Unique Session ID
var $that;
var $pt = array(); // This Array contains the registered things
var $in = false; // Marker: Did we already include the autoinit file?
// register($things):
//
// call this function to register the things that should become persistent
function register($things) {
$things = explode(",",$things);
reset($things);
while ( list(,$thing) = each($things) ) {
$thing=trim($thing);
if ( $thing ) {
$this->pt[$thing] = true;
}
}
}
function is_registered($name) {
if ($this->pt[$name] == true)
return true;
return false;
}
function unregister($things) {
$things = explode(",", $things);
reset($things);
while (list(,$thing) = each($things)) {
$thing = trim($thing);
if ($thing) {
unset($this->pt[$thing]);
}
}
}
// get_id():
//
// Propagate the session id according to mode and lifetime.
// Will create a new id if necessary. To take over abandoned sessions,
// one may provide the new session id as a parameter (not recommended).
function get_id ($id = '') {
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $QUERY_STRING;
$newid=true;
$this->name = $this->cookiename==""?$this->classname:$this->cookiename;
if ('' == $id) {
$newid = false;
switch ($this->mode) {
case 'get':
if ('' == ($id = isset($HTTP_GET_VARS[$this->name]) ? $HTTP_GET_VARS[$this->name] : ""))
$id = isset($HTTP_POST_VARS[$this->name]) ? $HTTP_POST_VARS[$this->name] : "";
break;
case 'cookie':
$id = isset($HTTP_COOKIE_VARS[$this->name]) ? $HTTP_COOKIE_VARS[$this->name] : "";
break;
default:
break;
}
}
if (empty($id) || strlen($id) < 32 || preg_match('|[^0-9a-fA-F_]|', $id)) {
$newid = true;
srand((double)microtime() * 1000000);
$id = $this->that->ac_newid(md5(uniqid($this->magic . rand() . @posix_getpid(), true)), $this->name);
}
switch ($this->mode) {
case 'cookie':
if ($newid && (0 == $this->lifetime)) {
SetCookie($this->name, $id, 0, "/", $this->cookie_domain);
}
if ( 0 < $this->lifetime ) {
SetCookie($this->name, $id, time()+$this->lifetime*60, "/", $this->cookie_domain);
}
break;
case 'get':
if (isset($QUERY_STRING)) {
$QUERY_STRING = ereg_replace(
"(^|&)".quotemeta(urlencode($this->name))."=".$id."(&|$)",
"\\1", $QUERY_STRING);
}
break;
default:
;
break;
}
$this->id = $id;
}
// put_id():
//
// Stop using the current session id (unset cookie, ...) and
// abandon a session.
function put_id() {
switch ($this->mode) {
case "cookie":
global $HTTP_COOKIE_VARS;
$this->name = $this->cookiename == '' ? $this->classname : $this->cookiename;
SetCookie($this->name, '', 0, '/', $this->cookie_domain);
$HTTP_COOKIE_VARS[$this->name] = '';
break;
default:
// do nothing. We don't need to die for modes other than cookie here.
break;
}
}
// delete():
//
// Delete the current session record and put the session id.
function delete() {
$this->that->ac_delete($this->id, $this->name);
$this->put_id();
}
// url($url):
//
// Helper function: returns $url concatenated with the current
// session $id.
function url($url){
$url=ereg_replace("[&?]+$", "", $url);
switch ($this->mode) {
case "get":
$url .= ( strpos($url, "?") != false ? "&" : "?" ).
urlencode($this->name)."=".$this->id;
break;
default:
;
break;
}
return $url;
}
function purl($url) {
print $this->url($url);
}
function self_url() {
global $PHP_SELF, $QUERY_STRING;
return $this->url($PHP_SELF.
((isset($QUERY_STRING) && ("" != $QUERY_STRING)) ? "?".$QUERY_STRING : ""));
}
function pself_url() {
print $this->self_url();
}
function get_hidden_session() {
return sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\">\n",
$this->name,
$this->id);
}
function hidden_session() {
print $this->get_hidden_session();
}
function get_hidden_id() {
switch($this->mode) {
case "get":
return $this->hidden_session();
break;
}
}
function hidden_id() {
print $this->get_hidden_id();
}
function add_query($qarray) {
global $PHP_SELF;
global $QUERY_STRING;
if ((isset($QUERY_STRING) && ("" != $QUERY_STRING))
|| ($this->mode == "get")) {
$sep_char = "&";
} else {
$sep_char = "?";
}
$qstring = "";
while (list($k, $v) = each($qarray)) {
$qstring .= $sep_char . urlencode($k) . "=" . urlencode($v);
$sep_char = "&";
}
return $qstring;
}
function padd_query($qarray) {
print $this->add_query($qarray);
}
// serialize($prefix,&$str):
//
// appends a serialized representation of $$prefix
// at the end of $str.
//
// To be able to serialize an object, the object must implement
// a variable $classname (containing the name of the class as string)
// and a variable $persistent_slots (containing the names of the slots
// to be saved as an array of strings).
//
// You don't need to know...
function serialize($prefix, &$str) {
static $t,$l,$k;
// Determine the type of $$prefix
eval("\$t = gettype(\$$prefix);");
switch ( $t ) {
case "array":
// $$prefix is an array. Enumerate the elements and serialize them.
eval("reset(\$$prefix); \$l = gettype(list(\$k)=each(\$$prefix));");
$str .= "\$$prefix = array(); ";
while ( "array" == $l ) {
// Structural recursion
$this->serialize($prefix."['".ereg_replace("([\\'])", "\\\\1", $k)."']", $str);
eval("\$l = gettype(list(\$k)=each(\$$prefix));");
}
break;
case "object":
// $$prefix is an object. Enumerate the slots and serialize them.
eval("\$k = \$${prefix}->classname; \$l = reset(\$${prefix}->persistent_slots);");
$str.="\$$prefix = new $k; ";
while ( $l ) {
// Structural recursion.
$this->serialize($prefix."->".$l,$str);
eval("\$l = next(\$${prefix}->persistent_slots);");
}
break;
default:
// $$prefix is an atom. Extract it to $l, then generate code.
eval("\$l = \$$prefix;");
$str.="\$$prefix = '".ereg_replace("([\\'])", "\\\\1", $l)."'; ";
break;
}
}
function get_lock() {
$this->that->ac_get_lock();
}
function release_lock() {
$this->that->ac_release_lock();
}
// freeze():
//
// freezes all registered things ( scalar variables, arrays, objects ) into
// a database table
function freeze() {
$str="";
$this->serialize("this->in", $str);
$this->serialize("this->pt", $str);
reset($this->pt);
while ( list($thing) = each($this->pt) ) {
$thing=trim($thing);
if ( $thing ) {
$this->serialize("GLOBALS['".$thing."']", $str);
}
}
$r = $this->that->ac_store($this->id, $this->name, $str);
$this->release_lock();
if(!$r) $this->that->ac_halt("Session: freeze() failed.");
}
// thaw:
//
// Reload frozen variables from the database and microwave them.
function thaw() {
$this->get_lock();
$vals = $this->that->ac_get_value($this->id, $this->name);
eval(sprintf(";%s",$vals));
}
//
// Garbage collection
//
// Destroy all session data older than this
//
function gc() {
$this->that->ac_gc($this->gc_time, $this->name);
}
//
// Variable precedence functions
//
function reimport_get_vars() {
$this->reimport_any_vars("HTTP_GET_VARS");
}
function reimport_post_vars() {
$this->reimport_any_vars("HTTP_POST_VARS");
}
function reimport_cookie_vars() {
$this->reimport_any_vars("HTTP_COOKIE_VARS");
}
function reimport_any_vars($arrayname) {
global $$arrayname;
if (!is_array($$arrayname))
return;
reset($$arrayname);
while(list($key, $val) = each($$arrayname)) {
$GLOBALS[$key] = $val;
}
}
//
// All this is support infrastructure for the start() method
//
function set_container(){
$name = $this->that_class;
$this->that = new $name;
$this->that->ac_start();
}
function set_tokenname(){
$this->name = $this->cookiename==""?$this->classname:$this->cookiename;
}
function release_token ($sid = '') {
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $HTTP_HOST, $HTTPS;
if (isset($this->fallback_mode)
&& ('get' == $this->fallback_mode)
&& ('cookie' == $this->mode)
&& (!isset($HTTP_COOKIE_VARS[$this->name]))
&& (!isset($HTTP_COOKIE_VARS['chuckmIMPlang']))) {
if (isset($HTTP_GET_VARS[$this->name])) {
$this->mode = $this->fallback_mode;
} else {
header("Status: 302 Moved Temporarily");
$this->get_id($sid);
$this->mode = $this->fallback_mode;
if (isset($HTTPS) && $HTTPS == 'on'){
// You will need to fix suexec as well, if you use Apache and CGI PHP
$PROTOCOL='https';
} else {
$PROTOCOL='http';
}
header("Location: ". $PROTOCOL. "://".$HTTP_HOST.$this->self_url());
exit;
}
}
}
function put_headers() {
// Allowing a limited amount of caching, as suggested by
// Padraic Renaghan on phplib@lists.netuse.de.
// Note that in HTTP/1.1 the Cache-Control headers override the Expires
// headers and HTTP/1.0 ignores headers it does not recognize (e.g,
// Cache-Control). Mulitple Cache-Control directives are split into
// mulitple headers to better support MSIE 4.x.
$mod_gmt = gmdate('D, d M Y H:i:s', getlastmod()) . ' GMT';
switch ($this->allowcache) {
case 'public':
header('Last-Modified: ' . $mod_gmt);
header('Cache-Control: public, max-age=' . $this->allowcache_expire * 60);
break;
case 'private':
header('Last-Modified: ' . $mod_gmt);
header('Cache-Control: private, max-age=' . $this->allowcache_expire * 60);
break;
case 'downloadable':
header('Last-Modified: ' . $mod_gmt);
break;
default:
header('Expires: -1');
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
break;
}
}
//
// Garbage collection
//
// Destroy all session data older than this
//
function gc() {
srand(time());
if ((rand()%100) < $this->gc_probability) {
$this->that->ac_gc($this->gc_time, $this->name);
}
}
//
// Initialization
//
function start($sid = '') {
$this->set_container();
$this->set_tokenname();
$this->release_token($sid);
$this->put_headers();
$this->get_id($sid);
$this->thaw();
$this->gc();
}
}
?>
---------------------- multipart/mixed attachment--