Hi All,
I am running Apache with PHP4 as a module. I have also written a script
(template.php) that sets up the default envrionment, like the CSS and navigation etc.
The script also reads in a file, as defined by the ?path= of the URL. The file it
reads in must have the sections (includes, header and body, as defined by /*** ***/
and /*** end ***/ pairs). The file is the split into these sections and along with
the templated bits of the page compile into a single string which is the executed
using the eval(). Now this all works fine, but I also want to use sessions. The
first session from the index.html file, which is first acessed as a login page, stores
the player class fine, but when I go to the next page (player_login.html) I seem to
loose the session.
You might ask why I don't just use an existing templating system, well it's because I
think that you should only have to write the template once and not have to touch it
again. The templating systems I have come across force you to include a file at the
top and bottom of the code you are writing. The one down side to the way I am doing
it is that I have had to force the other file into a include, header and body section,
but this is a trivial formatting issue.
Is there something I'm missing? I have included the code for the three scripts below.
--------
template.php
--------
<?PHP
/*
* This script is the basis for a templaing engine. The engine uses the
* rewrite feature of the web server to capture the Virtual URL that the
* user wants and maps it to this script with a paraeter. This script
* then sets up the template and includes the content from the file
* indicated by the user.
*
* A directory structure containing tall of the content is required, and
* with Apache a directory to map from.
*/
/* Put setup here */
require_once("site-config.php");
require_once("html_header.php");
require_once("html_footer.php");
require_once("misc_function.php");
/* Set up some defaults */
$title = "";
$body = "";
$page = "";
$file_read = false;
$file_content = "";
unset($content_header);
/* Read the contents of a file into a string */
function read_file($filename)
{
global $file_read;
global $file_content;
$file_content = "";
$file_read = false;
//print "$filename\n\n<br><br>";
if(file_exists($filename))
{
$page_code = file($filename);
foreach ($page_code as $line)
{
$file_content .= $line;
}
//print "$file_content";
$file_read = true;
}
else
{
$file_content = '
<h1>File Not Found</h1>
<p>Could not find <?=$filename?>, please let the Web
Administrator
know</p>
';
}
}
/* Get the index information */
read_file($NAV_COLUMN);
$navigation = $file_content;
/*
* garentee that if the user gives no file name then they will get the
* index file
*/
if(strcmp(basename($path), "") == 0)
{
if(!preg_match("/\/$/", $path))
{
$path .= "/";
}
$path .= "index.html";
}
/* Get the Header information and the content of the body */
$file_name = "$CONTENT_PATH/$path";
read_file($file_name);
if($file_read)
{
//print "$file_name";
/* Grab the HTTP header stuff from the file. This includes any
* session information.
*
* The header section is defined by
* <*** header ***> and <*** end header ***> at the start of the
* file.
*/
$section = preg_split("/\s*<\*{3}\s*end\s*header\s*\*{3}>\s*/im",
$file_content,
2
);
if(count($section) == 2)
{
$content_header = $section[0];
$content_header = preg_replace("/<\*{3}\s*header\s*\*{3}>/im",
"",
$content_header,
1
);
$body = $section[1];
/* get the includes section */
$section = preg_split("/\s*<\*{3}\s*end\s*includes\s*\*{3}>\s*/im",
$content_header,
2
);
if(count($section) == 2)
{
$include_files = $section[0];
$include_files = preg_replace("/<\*{3}\s*includes\s*\*{3}>/im",
"",
$include_files,
1
);
$content_header = $section[1];
}
}
else
{
$body = $section[0];
}
}
else
{
$body = $file_content;
}
if(isset($include_files))
{
$page .= $include_files."\n";
}
$page .= '<?PHP
/*
* Start of Template code
*/
/* include state management here in an if to see if it is wanted */
if(defined($KEEP_STATE) && $KEEP_STATE)
{
session_start();
}
/* Set up the headers and footers */
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
/* keep state = '.$KEEP_STATE.' */
?>
';
if(isset($content_header))
{
$page .= $content_header."\n";
}
$page .= '
<?PHP
/*
* Start of Template code section
*/
$header = new html_header($title);
$footer = new html_footer();
$header->display()
?>'."\n";
//$header->display();
//print "<h1>:$title</h1>";
/*
print "<br><stong>header</strong>";
highlight_string($content_header);
*/
$page .= '<table summary="naigation" width="100%" height="100%">'."\n";
$page .= '<tr>'."\n";
$page .= ' <td width="83" class="index">'."\n";
$page .= $navigation;
//$page .= "<span class=\"index\">fred </span>\n";
$page .= ' </td>'."\n";
$page .= ' <td>'."\n";
/*
$page .= "<br><strong>body<strong><BR>";
highlight_string($body);
*/
$page .= $body."\n";
$page .= '<?$test = session_id();print "session_id = $test";?>';
$page .= '<?print "phpid = $PHPSESSID";?>';
$page .= ' </td>'."\n";
$page .= '</tr>'."\n";
$page .= '</table>'."\n";
$page .= '<?$footer->display();?>'."\n";
print eval("?>".$page);
if($DEBUG)
{
?><h1>Debuging Information Follows</h1>
<table width="100%"><TR><TD width="83"> </TD><TD>
<?
//print "<h2>Base Name = ".basename($path)."</h2>";
/*
* This section adds line numbers to the string so you can make
* sense out of the eval line numbers when an error is produced.
*
* IT WOULD BE A VERY GOOD IDEA TO TURN THIS INTO A FUCTION FOR
* FUTURE USE.
*/
flush();
ob_start();
highlight_string($page);
$page = ob_get_contents();
ob_end_clean();
$new_page = preg_split('/<br\s*\/>/s', $page, -1);
$i = 0;
$page = "";
while($i < count($new_page))
{
$line_no = $i + 1;
$page .= "<font color=\"black\">$line_no: </font>
".$new_page[$i]."<br \/>";
$i++;
}
/* End line number section */
print $page;
?>
</TD></tr></table>
<?
}
?>
--------
index.html
--------
<*** includes ***>
<?PHP
/*
* Put any include or require statments here
*/
require_once("modules/login_box.php");
require_once("database.php");
require_once("player.php");
require_once("modules/new_user.php");
?>
<*** end includes ***>
<*** header ***>
<?PHP
/* Put any session information here and other code which must be run
* before the HTML is actually sent.
*/
global $db;
global $player;
global $nick_name;
$login_failed = TRUE;
$login_box = new login_box($LOGIN_ACTION);
$title = "";
if(isset($nick_name))
{
/* The user has attempted to login */
if(isset($new_user) && $new_user)
{
$title = "New User Registration";
}
else
{
if(isset($register) && $register)
{
/* The user is submitting their details */
// Check if the user id already exists.
$query = "SELECT id FROM player WHERE nickname = '$nick_name'";
$result = $db->query($query);
if(DB::isError($result))
{
die("Checking id: ".$result->getMessage());
}
if($result->numRows() > 0)
{
error_message("This nick name/login already exists,
please try another");
}
// Add the user.
if(isset($nick_name) && (strlen($nick_name) > 0)
&& !preg_match("/^\s*$/", $nick_name))
{
$column = "nickname";
$values = "'".trim($nick_name)."'";
}
if(isset($password) && (strlen($password) > 0)
&& !preg_match("/^\s*$/", $password))
{
$password = md5(trim($password));
$password2 = md5(trim($password2));
if(strcmp($password, $password2) == 0)
{
$column .= ", password";
$values .= ", '".$password."'";
}
else
{
error_message("Your passwords don't match
please"
. " entre them again :$password:$password2:");
}
}
if(isset($first_name) && (strlen($first_name) > 0)
&& !preg_match("/^\s*$/", $first_name))
{
$column .= ", firstname";
$values .= ", '".trim($first_name)."'";
}
if(isset($last_name) && (strlen($last_name) > 0)
&& !preg_match("/^\s*$/", $last_name))
{
$column .= ", lastname";
$values .= ", '". trim($last_name)."'";
}
if(isset($email) && (strlen($email) > 0)
&& preg_match("/^[^@]+@[^.]+\..*$/", $eamil))
{
$column .= ", email";
$values .= ", '".trim($email)."'";
}
if(isset($street) && (strlen($street) > 0)
&& !preg_match("/^\s*$/", $street))
{
$column .= ", street";
$values .= ", '".trim($street)."'";
}
if(isset($suburb) && (strlen($suburb) > 0)
&& !preg_match("/^\s*$/", $suburb))
{
$column .= ", suburb";
$values .= ", '".trim($suburb)."'";
}
if(isset($state) && (strlen($state) > 0)
&& !preg_match("/^\s*$/", $state))
{
$column .= ", state";
$values .= ", '".trim($state)."'";
}
if(isset($postcode) && (strlen($postcode) > 0)
&& !preg_match("/^\s*$/", $postcode))
{
$column .= ", postcode";
$values .= ", ".trim($postcode);
}
$column .= ", preferedname";
if(isset($prefered_name))
{
if(strcmp($prefered_name, "nick_name") == 0)
{
$values .= ", true";
}
else
{
$values .= ", false";
}
}
else
{
$values .= ", false";
}
if(isset($list))
{
if(strcmp($list, "true"))
{
// Send an email to the list
}
}
//Get a valid Id
// This needs work so it won't break if we get more than
max(int2)
// users
$query = "SELECT id FROM player ORDER BY id DESC";
$result = $db->query($query);
if(DB::isError($result))
{
die("Getting valid id: ".$result->getMessage());
}
$row = $result->fetchRow();
$id = $row[0] + 1;
$column .= ", id";
$values .= ", $id";
// Set the user active
$column .= ", active";
$values .= ", true";
$query = "INSERT INTO player ($column) VALUES ($values)";
//print $query;
$result = $db->query($query);
if(DB::isError($result))
{
print "$query<br>";
die("Inserting new player: ".$result->getMessage());
}
}
else
{
/*
* We only need to calculate the password if the user is
* an existing user
*/
$password = md5(trim($password));
}
// Check the database for this user
//session_register_var("nick_name", $nick_name);
session_register("nick_name");
$GLOBALS["nick_name"] = $nick_name;
$title = $nick_name;
$query = "SELECT id "
."FROM player "
."WHERE nickname = '".trim($nick_name)."' "
." and password = '$password'";
$result = $db->query($query);
if(DB::isError($result))
{
die("Geting registered user: ".$result->getMessage());
}
if($result->numRows() != 0)
{
$row = $result->fetchRow();
// print "<br>$password<br>$row[0]<br>";
$player = new player($row[0], $db);
session_register_var("player", $player);
// Yeah! The user loged in sussessfully and we can give them
their
// useable page.
$login_failed = FALSE;
}
if($login_failed)
{
$title = "Login Failed";
}
else
{
$title = "Welcome";
}
}
}
else
{
/* The user has not attempted to login */
$title = "Login";
}
?>
<*** end header ***>
<?PHP
/* This section is where your HTML code goes and any code which can run
* in the HTML
*/
if(isset($nick_name))
{
/* The user has attempted to login */
if(isset($new_user) && $new_user)
{
if(isset($password))
{
new_user_form($nick_name, $password);
}
else
{
new_user_form($nick_name);
}
}
else
{
if($login_failed)
{
?>
<p>Please try loging in again. You may have mispelled
your
nick name or password</p>
<?PHP
$login_box->display($nick_name);
}
else
{
?>
<p>Welcome to Maric's Place</p>
<?PHP
session_register_var("player", $player);
}
}
}
else
{
/* The user has not attempted to login */
$login_box->display();
}
?>
------
player_list.html
------
<*** includes ***>
<?PHP
/* Put any session information here and other code which must be run
* before the HTML is actually sent.
*/
require_once('database.php');
require_once('player.php');
?>
<*** end includes ***>
<*** header ***>
<?PHP
global $db;
global $player;
$title = "Player List";
$i;
?>
<*** end header ***>
<?PHP
/* This section is where your HTML code goes and any code which can run
* in the HTML
*/
$query = "SELECT firstname, lastname, nickname FROM player";
$result = $db->query($query);
if(DB::isError($result))
{
die("Couldn't list Players: ".$result->getMessage());
}
?>
<table summary="Player List" border="1" align="center" cellpadding="2">
<tr>
<td><strong>First Name</strong></td>
<td><strong>Last Name</strong></td>
<td><strong>Alias</strong></td>
</tr>
<?PHP
//print $player->first_name();
$i = 0;
while($i < $result->numRows())
{
$row = $result->fetchRow();
print "<tr>\n";
foreach ($row as $cell)
{
print "<td>".htmlentities($cell) ."</td>\n";
}
print "</tr>\n";
$i++;
}
?>
</table>
<?PHP
print $player.":<br>\n";
print $nick_name."+<br>\n";
print session_id()."-<br>\n";
?>
--
Justin 'Doychi' Deutsch
[EMAIL PROTECTED]
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php