<?php
/**
 * 金戈企业建站系统：留言本
 *
 *
 * @name 
 * @author 烟鬼 QQ:460874 Email:460874@qq.com
 * @version 0.1  $id  book.php
 * @copyright Copyright (c) 2007 - 2008 烟鬼
 */
session_start();
require('header.php');
$action = $_GET['action'];

//如果是添加留言，将进入以下
if ($action == 'add')
{
	//获取表单数据
	$select = $_POST['select'];
	$name = $_POST['name'];
	$title = $_POST['title'];
	$email = $_POST['email'];
	$ms = $_POST['ms'];
	
	//对获取的数据进行格式化
	$select = my_yz($select);
	$name = my_yz($name);
	$title = my_yz($title);
	$email = my_yz($email);
	$ms = my_yz($ms);
	
	//对我们要求的数据进行判断
	try
	{
		//验证表单填写是否完整
		if (!filled_out($_POST)) 
		{
		     throw new Exception(NOFM);
		}
		
		//判断严整码填写是否正确
		if ($_SESSION['randcode'] != $_POST['capt']) 
		{
		     throw new Exception(NOCA);
		}
		
		//验证Email格式是否正确
		if (!valid_email($email)) 
		{
		     throw new Exception(NOME);
		}
		
		//判断留言的查看权限是管理员还是所有人
		if ($select == 'all') 
		{
		     $kz = 1;
		}
		if ($select == 'mst') 
		{
		     $kz = 0;
		}
		
		//判断留言者IP地址
		if (isset($_SERVER['HTTP_CLIENT_IP'])) 
		{
		     $ip = $_SERVER['HTTP_CLIENT_IP'];
		}
		else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
		{
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		}
		else 
		{
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		
		//获取留言时间
		$time = date('Y-m-d');
		
		//如果以上都没问题可以执行对数据的插入工作了
		$conn = db_connect();
		$result=$conn->query("set names 'gb2312'");  //gb2312编码形式，否则插入会失败
		$result = $conn->query("INSERT INTO book values (NULL,'$title','$ms','$time','$ip',
							'$kz','$name','$email')");
		if (!$result) 
		{
		     throw new Exception(DBEO);
		}
		else 
		{
			if ($kz == 1) 
			{
			     $ok = LYOK;
			}
			if ($kz == 0) 
			{
			     $ok = LYOKS;
			}
			alert($ok);
		}
	}
	catch (Exception $e)
	{
		$error = $e->getMessage();
	}
}

/**
 * 取回留言内容并做分页处理，在这里我们使用了数据库的左关联模式。因为抛弃了普通留言本的数据库结构，
 * 就是回复与留言在同一表中。这样极大的浪费空间。留言的内容在book表中而回复的内容在hbook表中
 */

//每页显示多少条留言
$page = 0;
$page=isset($_GET['page'])?intval($_GET['page']):1;
if ($web) 
 {
      $num = $web['w_lyb'];
 } 
else 
{
	$num = 10;
}
//从数据库取回内容，关键也是有点复杂的就在这个左关联模式。其实明白了其中的道理就觉得不那么复杂了
try
{
	$conn = db_connect();
	$result=$conn->query("set names 'gb2312'");
	//取出表中的所有主键条件是l_ckroot = 1 的因为这是控制字段 = 1 的所有人可见
	$result = $conn->query('SELECT l_id FROM book where l_ckroot = 1');
	//返回有多少条数据
	$total=$result->num_rows;
	if ($total <= 0) 
	 {
	      $total = 1;
	 } 
	//返回总页数 ceil()函数是取整的意思。用数据库的总条数/每页显示条数=多少分页
	$pagenum=ceil($total/$num);
	if ($page > $pagenum || $page == 0) 
	{
		//如果没有留言就抛出一个异常,下面的 catch会捕获一个异常并将异常内容传递给一个变量
		//然后将该变量传递至模板，如果模板获得该变量就会显示，否则不会显示。也说明没有异常
		//抛出的内容为一个常量在defines.php(常量包内定义)
		throw new Exception(NOLY);
	}
	// 获取limit的第一个参数的值，假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10
	//对offset初始化
	$offset = 0;
	$offset=($page-1)*$num;
	
	//验证需要在数据库操作的变量是否是数字类，如果不是停止脚本运行。
	//这里主要是防止SQL注入，这类变量是最危险的。比如下面的
	//$page我们根本就不需要去验证它，因为它根本接触不到数据库
	$offset = my_yz($offset);
	$num = my_yz($num);
	if (!is_numeric($offset) || !is_numeric($num)) 
	{
	     exit;
	}
	
	//典型的SQL左关联。
	$result = $conn->query('SELECT book.l_id,book.l_title,book.l_time,book.l_ip,book.l_mail,
							book.l_name,book.l_lynr,hbook.hf_nr
							FROM book left join hbook
							on book.l_id = hbook.l_id
							where book.l_ckroot = 1
							order by book.l_id desc
							limit '.$offset.','.$num);
	if (!$result) 
	{
	     throw new Exception(DBEO);
	}
	//为了方便在模板中处理，将取出的所有内容构造成一个二维数组setarray在myfun.php中定义
	$result = setarray($result);
}
//将捕获的异常付值给一个变量，在将变量传递给模板处理。当模板接受到这个变量就显示，否则不显示
catch (Exception $e)
{
	$error = $e->getMessage();
}

//将分页构造成一个二维数组。传递给模板后方便操作。本来用一维数组边足够用，可我在
//模板下调用一维数组10多次都失败，气急败坏之下用二维的算了
for($i=1;$i<=$pagenum;$i++)
{
   $pages[][]= ($i!=$page)?"<a href='book.php?page=".$i."'>$i</a>":"<a id='nourl'>$i</a>";
}


$smarty->assign('error',$error);
$smarty->assign('ok',$ok);
$smarty->assign('result',$result);
$smarty->assign('pages',$pages);
$smarty->assign('pagenum',$pagenum);
$smarty->display('book.html');
require('footer.php');
?>