连接SQL Server:
sqlsvr_conn.php
1 <?php 2 header("Content-type: text/html; charset=utf-8"); 3 $serverName = "localhost"; //数据库服务器地址 4 $uid = "sa"; //数据库用户名 5 $pwd = "123"; //数据库密码 6 $connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>"BookSys","CharacterSet" => "UTF-8"); 7 $conn = sqlsrv_connect( $serverName, $connectionInfo); 8 if( $conn == false) 9 { 10 echo "连接失败!"; 11 die( print_r( sqlsrv_errors(), true)); 12 }else{ 13 //echo "连接成功!"; 14 } 15 ?>
用户登录系统:login.php:
<!--内置css设置页面的样式-->
<body style="background: #e9f9d8;color: #33abab">
<?php
session_start();
//启动session会话,目的是传递登录用户的id
require "sqlsvr_conn.php";
//将连接数据库的文件包含进来
//若是登录表单中有传递进来的变量
if(isset($_POST[\'username\']) and isset($_POST[\'password\']))
{
$userid=$_POST[\'username\']; //存储传过来的变量
$password=$_POST[\'password\'];//存储传过来的变量
$sql="select * from Guest where Gid=\'$userid\' and Pwd=\'$password\'";
$fr=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\'));//执行查询语句并将结果(资源型结果集)存储在变量里
if ($fobj = sqlsrv_fetch_object( $fr)) {
//在Guest数据库中查找,若存在该用户则登录成功,并将当前获得的userid写入session
$_SESSION[\'valid_user\']=$userid;
}
}
if (isset($_SESSION[\'valid_user\']))
{
//若存在valid_user信息,即登录成功,插入一段js,以提示用户登录成功,并实现跳转(跳转到buyT.php即售票页面)
?>
<script type="text/javascript">
alert(\'登录成功,即将进入售票页!\');
window.location.href=\'buyT.php\';
</script>
<?php
}
else
{
//否不存在valid_user信息,登录失败或者未登录,显示登录表单,以让用户登录
//根据有无表单提交,分为两种情况
if (isset($_POST[\'username\']))
//1、有表单提交数据,登录失败
echo "<p>登录失败,请检查用户名和密码后重试!</p>";
else
//2、没有表单提交数据,未登录
echo "<p>未登录</p>";
?>
<form action="login.php" method="POST"><!--打印登录表单-->
<fieldset>
<legend>请输入您的个人信息!</legend>
<p><label for="username">账号:</label>
<input type="username" name="username" size="30"/></p>
<p><label for="password">密码:</label>
<input type="password" name="password" size="30"/></p>
</fieldset>
<!--内置css设置button的样式,其实没啥用,就是好看点-->
<button type="submit" name="login" id="back_botton" style="background: #79cdcd;
color: #fff!important;
line-height: 36px;
padding: 0 20px;
font-weight: normal;
font-size: 16px;
font-family: tahoma, arial, \'Hiragino Sans GB\',幼圆, sans-serif;
border: 0;
border-radius: 30px;">Login</button>
</form>
<?php
}
?>
<!--内置css设置页脚的样式-->
<font style=\'position:absolute;bottom:0;width:100%;\'>
Copyright LZU ©2020
</body>
售票页:buyT.php
<html>
<head>
<title>飞机订票系统</title>
</head>
<!--css样式表,分别设置表单、按钮、页面整体的样式-->
<style type="text/css">
.form-item .form-label-b {
font-weight: 700;
}
#back_botton{
background: #79cdcd;
color: #fff!important;
padding: 0 20px;
font-weight: normal;
font-size: 16px;
font-family: tahoma, arial, "Hiragino Sans GB",幼圆, sans-serif;
border: 0;
border-radius: 30px;
}
body{
background: #e9f9d8;
color: #33abab;
}
</style>
<body>
<?php
//启动session会话,目的是传递登录用户的id
session_start();
//从session中取得登录用户的id
$Gid=$_SESSION[\'valid_user\'];
?>
<!--打印页头、注销连接、查看历史订单连接、搜索表单-->
<h3 style="position: absolute;top: 0px;right: 0px;">编号为<?php echo $Gid;?>的旅客朋友,你好!</h3>
<p><a style="position: absolute;top: 50px;right: 20px;color: #33abab;" href="logout.php">注销</a></p>
<p><a href=\'HistoryOrder.php\'>查看历史订单</a></p>
<form method="get" action="buyT.php">
输入航班编号以搜索:<input type="text" name="key">
<input type="submit" name="sub" id=\'back_botton\'>
</form>
<?php
//将连接数据库的文件包含进来
require "sqlsvr_conn.php";
//若是用户点击了搜索按钮进行搜索
if(!empty($_GET[\'key\'])){
//将搜索条件设为Fid等于用户要搜索的内容
$key=$_GET[\'key\'];
$k=" where Fid=\'$key\'";
}
//若是用户未点击了搜索按钮进行搜索
else{
//将搜索条件设为空
$k=\'\';
$key="";
}
$sql="select * from Flight $k";
$result=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\'));//执行查询语句并将结果(资源型结果集)存储在变量里
$num=sqlsrv_num_rows($result);//取出记录条数
//利用循环,以表格的形式打印每个航班的信息
while( $obj = sqlsrv_fetch_object( $result)) {
//为了得到航班的出发地和目的地,额外查询Route表
$sql="select * from Route where Rid=\'$obj->Rid\'";
$rr=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\'));
$robj = sqlsrv_fetch_object( $rr);
?>
<table border="2" width="100%" cellspacng="0">
<form>
<div class="form-group">
<div class="form-item">
<span class="form-label-b">航班号:</span>
<span><?php echo $obj->Fid;?></span>
</div>
</div>
<div>
<span>路线号:</span>
<span><?php echo $obj->Rid;?></span>
</div>
<div>
<span>票价:</span>
<span><?php echo $obj->Price;?></span>
</div>
<div>
<span>起飞时间:<?php echo $obj->DepTime->format(\'Y-m-d H:i:s\') ;?></span>
<span>降落时间:<?php echo $obj->LandTime->format(\'Y-m-d H:i:s\') ;?></span>
</div>
<div>
<span>出发地:<?php echo $robj->Depart;?></span>
<span>目的地:<?php echo $robj->Dest;?></span>
</div>
<div>
<a href=insert.php?Fid=<?php echo $obj->Fid; ?>>购票</a>
</div>
</form>
</table>
<?php
}
echo \'<br>共\'.$num.\'条记录\';
?>
</body>
</html>
买票功能:insert.php
1 <?php 2 session_start(); 3 //启动session会话 4 require "sqlsvr_conn.php"; 5 //将连接数据库的文件包含进来 6 if(!empty($_GET[\'Fid\'])){ 7 $Fid=$_GET[\'Fid\'];//将buyT.php页面传递进来的变量赋给$Fid 8 $Gid=$_SESSION[\'valid_user\'];//登录用户的id 9 $sql="insert into Ticket(Gid,Fid) values(\'$Gid\',\'$Fid\');"; 10 $result=sqlsrv_query($conn, $sql); 11 //由于数据库中已建立了相关的触发器,所以航班剩余票数,用户里程数,会员制信息,账单记录信息均由触发器控制,这里只需要进行简单的插入即可 12 //插入一段js,以提示用户购票成功,并实现跳转 13 if($result){ 14 ?> 15 <script type="text/javascript"> 16 alert(\'购票成功!即将返回\'); 17 window.location.href=\'buyT.php\'; 18 </script> 19 <?php 20 } 21 else{ 22 echo "插入失败!"; 23 } 24 } 25 else { 26 echo \'信息缺失!\'; 27 } 28 ?>
退票功能:del.php
1 <?php 2 session_start(); 3 4 if(!empty($_GET)){ 5 $Tid=$_GET[\'Tid\']; 6 require "sqlsvr_conn.php"; 7 $sql="delete from ticket where Tid=\'$Tid\'"; 8 $result=sqlsrv_query($conn, $sql); 9 //由于数据库中已经建立了相关的触发器,所以航班剩余票数,用户里程数,会员制信息,账单记录信息均由触发器控制,这里只需要进行简单的删除即可 10 if($result){ 11 //插入一段js,以提示用户退票成功,并实现跳转 12 ?> 13 <script type="text/javascript"> 14 alert(\'退票成功,即将返回!\'); 15 window.location.href=\'HistoryOrder.php\'; 16 </script> 17 18 <?php 19 } 20 else{ 21 echo "退票失败!<a href=HistoryOrder.php>返回售票页"; 22 } 23 24 } 25 ?>
查看订单:HistoryOrder.php
1 <?php 2 //启动session会话,目的是传递登录用户的id 3 session_start(); 4 //登录用户的id 5 $Gid=$_SESSION[\'valid_user\']; 6 //打印页头 7 ?> 8 <h3 style="position: absolute;top: 0px;right: 0px;">编号为<?php echo $Gid;?>的旅客朋友,你好!</h3> 9 <p><a style="position: absolute;top: 50px;right: 20px;" href="logout.php">注销</a></p> 10 <p><a href=\'buyT.php\'>返回购票页</a></p> 11 <?php 12 echo "<h1 align=left>您的历史订单</h1><br>"; 13 ?> 14 <!--css样式表,分别设置表单、页面整体的样式--> 15 <style type="text/css"> 16 .form-item .form-label-b { 17 font-weight: 700; 18 } 19 body{ 20 background: #e9f9d8; 21 color: #33abab; 22 } 23 </style> 24 <body> 25 <?php 26 require "sqlsvr_conn.php"; 27 28 $sql="select * from Ticket where Gid=\'$Gid\'"; 29 $result=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\')); 30 31 $num=sqlsrv_num_rows($result);//取出记录条数,是一个属性 32 //利用循环,以表格的形式打印历史订单的信息 33 while( $obj = sqlsrv_fetch_object( $result)) { 34 //为了得到航班的出发时间、降落时间、出发地和目的地,额外查询Fight、Route表 35 $sql="select * from Flight where Fid=\'$obj->Fid\'"; 36 $fr=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\')); 37 $fobj = sqlsrv_fetch_object( $fr); 38 $sql="select * from Route where Rid=\'$fobj->Rid\'"; 39 $rr=sqlsrv_query($conn, $sql, array(), array( "Scrollable" => \'static\')); 40 $robj = sqlsrv_fetch_object( $rr); 41 ?> 42 <table border="2" width="100%" cellspacng="0"> 43 <form> 44 <div class="form-group"> 45 <div class="form-item"> 46 <span class="form-label-b">机票号:</span> 47 <span><?php echo $obj->Tid;?></span> 48 </div> 49 </div> 50 51 <div> 52 <span>航班号:</span> 53 <span><?php echo $obj->Fid;?></span> 54 </div> 55 <div> 56 <span>座位号:</span> 57 <span><?php echo $obj->SeatNum;?></span> 58 </div> 59 <div> 60 <span>票价:</span> 61 <span><?php echo number_format($obj->Price, 2);?></span> 62 </div> 63 <div> 64 <span>折扣后票价:</span> 65 <span><?php echo number_format($obj->DiscPrice, 2);?></span> 66 </div> 67 <div> 68 <span>起飞时间:<?php echo $fobj->DepTime->format(\'Y-m-d H:i:s\') ;?></span> 69 <span>降落时间:<?php echo $fobj->LandTime->format(\'Y-m-d H:i:s\') ;?></span> 70 </div> 71 <div> 72 <span>出发地:<?php echo $robj->Depart;?></span> 73 <span>目的地:<?php echo $robj->Dest;?></span> 74 </div> 75 <div> 76 <a href=del.php?Tid=<?php echo $obj->Tid; ?>>退票</a> 77 </div> 78 </form> 79 </table> 80 <?php 81 } 82 echo \'<br>共\'.$num.\'条记录\'; 83 ?>
注销功能:logout.php
1 <?php 2 //因为要注销,所以把session给销毁 3 session_start(); 4 unset($_SESSION[\'valid_user\']); 5 session_destroy(); 6 //插入一段js,以提示用户注销成功,并实现跳转 7 ?> 8 <script type="text/javascript"> 9 alert(\'注销成功,即将返回登录页!\'); 10 window.location.href=\'login.php\'; 11 </script>
数据库:
BookSys
tables:
1 --建立公司表 2 create table Company 3 ( 4 CName varchar(20) NOT NULL, 5 Addr varchar(40), 6 Hotline varchar(12), 7 BLRN char(4) PRIMARY KEY --工商注册号 8 ); 9 --建立飞机表 10 create table Plane 11 ( 12 Pid char(4) PRIMARY KEY, 13 BLRN char(4) NOT NULL REFERENCES Company(BLRN), 14 Seating int check(Seating>=0),--座位数为正 15 ); 16 --建立航线表 17 create table Route 18 ( 19 Rid char(4) PRIMARY KEY, 20 BLRN char(4) NOT NULL REFERENCES Company(BLRN), 21 Depart varchar(20), --起点 22 Dest varchar(20), --终点 23 RMile float --里程 24 ); 25 --建立机场表 26 create table Airport 27 ( 28 Aid char(4) PRIMARY KEY, 29 AName varchar(20), 30 Addr varchar(20) 31 ); 32 --建立航班表 33 create table Flight 34 ( 35 Fid char(4) PRIMARY KEY, 36 Pid char(4) NOT NULL REFERENCES Plane(Pid), 37 Rid char(4) NOT NULL REFERENCES Route(Rid), 38 Aid char(4) NOT NULL REFERENCES Airport(Aid), 39 Price money, 40 DepTime datetime, 41 LandTime datetime, 42 Seated int default 0,--航班上已经售出的座位 43 IsDelay bit default 0,--是否延误,默认不延误 44 unique(Rid,Pid)--一个航班由航线和飞机唯一确定 45 ); 46 --建立客户表 47 create table Guest 48 ( 49 Gid char(4) PRIMARY KEY , 50 Pwd varchar(10), 51 GName varchar(20), 52 Addr varchar(20), 53 Tel varchar(11), 54 Gender char(2) check(Gender = \'F\' or Gender = \'M\'), 55 GMile float default(0), 56 Discount float check(Discount between 0 and 1) default(1), 57 ); 58 --建立机票表 59 create table Ticket 60 ( 61 --Tid int identity(1,1) PRIMARY KEY, 62 Tid varchar(10)PRIMARY KEY, 63 Gid char(4) NOT NULL REFERENCES Guest(Gid), 64 Fid char(4) NOT NULL REFERENCES Flight(Fid), 65 Aid char(4) NOT NULL REFERENCES Airport(Aid), 66 SeatNum char(20), 67 Price money default 0, 68 DiscPrice money default 0, 69 unique(Gid,Fid) --一个人的id只能买一张一个航班的机票 70 ); 71 --建立账单表 72 create table Bill 73 ( 74 Tid varchar(10) PRIMARY KEY, 75 Gid char(4) NOT NULL, 76 Time datetime default (getdate()) 77 ); 78 79 /* 80 drop table Bill 81 drop table Ticket 82 drop table Guest 83 drop table Flight 84 drop table Airport 85 drop table Route 86 drop table Plane 87 drop table Company 88 */
trigger:
1 --旅客折扣触发器 2 create trigger GuestDiscount 3 on guest 4 after UPDATE 5 as 6 begin 7 declare @GMile float,@Gid char(10),@isspecial bit; 8 select @GMile=GMile,@Gid=Gid from inserted; --获取乘客里程、id(主键) 9 if(@GMile>1000 and @GMile<=5000) 10 begin 11 update guest set discount=0.98 where Gid=@Gid; 12 end 13 else if(@GMile>5000 and @GMile<10000) 14 begin 15 update guest set discount=0.95 where Gid=@Gid; 16 end 17 else if(@GMile>10000) 18 begin 19 update guest set discount=0.90 where Gid=@Gid; 20 end 21 end 22 --select * from guest 23 --update guest set GMile=8000 where Gid=\'G001\' 24 --drop trigger GuestDiscount 25 go 26 --买票触发器BuyTicket 27 create trigger BuyTicket--当买票时判断是否有座,增加顾客里程数,判断顾客经过折扣后的票价 28 on Ticket 29 instead of insert 30 as 31 begin 32 declare @char varchar(5),@Tid varchar(10),@Gid char(4),@Fid char(4),@Aid char(4), 33 @Price money,@DisPrice money,@Discount float,@Seating int,@Seated int,@Pid char(10),@RMile float; 34 select @Gid=Gid,@Fid=Fid from inserted; --买票的旅客id、航班号 35 select @Seating=Plane.Seating,@Pid=Plane.Pid from Plane,Flight where Flight.Fid=@Fid and Plane.Pid=Flight.Pid;--飞机座位数 36 select @Seated=Seated from Flight where Fid=@Fid; --航班已售出座位数 37 /*判断:若航班已售出座位数等于飞机总座位数,则不能出票,提示售罄;否则正常出票*/ 38 if @Seated = @Seating 39 print \'出票失败:该航班的机票已售罄,请选择其余航班!\'; 40 else 41 begin 42 set @Seated=@Seated+1; --已售出座位数加一 43 set @char=convert(varchar,@Seated); 44 set @Tid=@Fid+\'T\'+@char; --生成机票id(航班id加上座位号) 45 select @Aid=Aid,@Price=Price from Flight where Flight.Fid=@Fid; --航班所属机场、机票售价 46 select @Discount=Discount from Guest where Gid=@Gid; --旅客的机票折扣 47 select @DisPrice=@Price*@Discount; --优惠后机票价格 48 select @RMile=Route.RMile from Flight,Route where Flight.Fid=@Fid and Route.Rid=Flight.Rid; --航线的里程 49 update Guest set GMile=GMile+@RMile where Gid=@Gid; --更新乘客里程(加上本次航线的里程) 50 update Flight set Seated=@Seated where Fid=@Fid; --更新航班已售出票数(座位数) 51 insert into Ticket values(@Tid,@Gid,@Fid,@Aid,@Seated,@Price,@DisPrice); --生成车票 52 insert into Bill(Tid,Gid) values(@Tid,@Gid); --生成账单 53 print \'订票成功!您的车票详情如下:\'; 54 print \'车票id:\'+@Tid; 55 print \'应收票价:\'+convert(varchar,@Price); 56 print \'您的购票折扣为:\'+convert(varchar,@Discount); 57 print \'实收票价:\'+convert(varchar,@Disprice); 58 print \'座位号:\'+convert(varchar,@Seated); 59 end 60 end 61 insert into Ticket(Gid,Fid) values(\'G002\',\'F004\'); 62 --drop trigger BuyTicket 63 go 64 --退票触发器RefoundTicket 65 create trigger RefoundTicket--退票操作,飞机座加一,用户里程数减少,账单表记录删除 66 on Ticket 67 after DELETE 68 as 69 begin 70 declare @Tid varchar(10),@Gid char(4),@Fid char(4),@DisPrice money,@Seated int,@RMile float; 71 select @Tid=Tid ,@Gid=Gid,@Fid=Fid,@DisPrice=DiscPrice from deleted;--获取机票id、旅客id 72 select @Seated=Flight.Seated from Flight where Flight.Fid=@Fid;--该航班的已售出座位数 73 select @RMile=Route.RMile from Flight,Route where Flight.Fid=@Fid and Route.Rid=Flight.Rid; --航线的里程 74 update Guest set GMile=GMile-@RMile where Gid=@Gid; --更新乘客里程(减去本次航线的里程) 75 --select * from flight where Fid=@Fid; 76 update Flight set Seated=@Seated-1 where Fid=@Fid; --更新飞机售出座位数(减一) 77 --select * from flight where Fid=@Fid; 78 delete from Bill where @Tid=Tid; --删除该账单 79 print \'退票成功!\'+char(13)+char(10)+\'退票信息如下:\'; 80 print \'车票id:\'+@Tid; 81 print \'实收金额:\'+convert(varchar,@Disprice); 82 print \'收取手续费:\'+convert(varchar,@DisPrice)+\'*0.05=\'+convert(varchar,convert(money,@DisPrice*0.05)); 83 print \'实际退款金额:\'+convert(varchar,convert(money,@DisPrice-@DisPrice*0.05)); 84 print \'感谢使用!\' 85 end 86 --delete from ticket where Tid=\'F006T1\' 87 --drop trigger RefoundTicket 88 go 89 --航班延误触发器 90 create trigger FlightDelay 91 on Flight 92 after UPDATE 93 as 94 begin 95 declare @DepTimeOld datetime,@DepTimeNew datetime; 96 declare @IsDelay bit,@Fid char(4); 97 select @DepTimeOld=DepTime from deleted; 98 select @DepTimeNew=DepTime,@Fid=Fid from inserted; 99 if @DepTimeOld<@DepTimeNew /*若更新航班出发时间比原来时间晚,则表示延误*/ 100 begin 101 update Flight set IsDelay=1 where Fid=@Fid; 102 print \'乘坐\'+@Fid+\'号航班的旅客飞机已结晚点,非常抱歉本次航班为您带来的不便!\' 103 end 104 else if @DepTimeOld>@DepTimeNew/*若更新航班出发时间比原来时间早,则表示飞机提前(一般不应发生这种情况)*/ 105 begin 106 update Flight set IsDelay=0 where Fid=@Fid; 107 print \'乘坐\'+@Fid+\'号航班的旅客飞机由于某些原因提前,非常抱歉本次航班为您带来的不便!\' 108 end 109 end 110 --update flight set DepTime=\'2020-12-25 21:10\' where Fid=\'F001\'; 111 --select * from flight 112 --drop trigger FlightDelay;