第一章搭建项目开发环境
1.简述PHP的发展历史。
略
2.简述PHP的特性。
略
3.如果Apache的网站主目录是C:\eshop,并且没有建立任何虚拟目录,则在浏览器中输入http://localhost/admin/admin.php,则打开的文件是(B )
A. C:\localhost\admin\admin.php B.C:\eshop\admin\admin.php
C.C:\eshop\admin.php D.C:\eshop\localhost\admin\admin.php
4.在MySQL数据库中创建一个名为“super”的用户,并为其授予操作mysql数据库的所有权限。
CREATE USER super@localhost IDENTIFIED BY '123456'; --插入用户super
GRANT ALL PRIVILEGES ON *.* TO super@localhost; --授权
FLUSH PRIVILEGES; --权限生效
select * from mysql.user where user='super' \G; --登录后,查看权限
5.使用NetBeans集成开发工具编写、运行如下程序,并写出运行结果。
9
6. 默认情况下,Apache服务器的配置文件名、MySQL服务器的配置文件名以及PHP的配置文件名分别是什么?WAMPServer采用默认方式安装成功后,这些配置文件放在哪个目录下?
Apache服务器的配置文件名: httpd.conf
MySQL服务器的配置文件名: my.ini
PHP的配置文件名:php.ini
WAMPServer采用默认方式安装成功后,这些配置文件放在:c:\wamp\bin
7.按照1.1.4中的方式对下述电子商务网站系统的功能描述进行需求分析。
略
第二章 诚信管理论坛数据库设计与实现
1.INSERT语句和REPLACE语句有何不同,请设计相关试验。
使用INSERT语句除了可以向表中插入一行数据外,也可以插入多行数据,但如果要插入的记录中含有与原有记录中PRIMARY KEY或UNNIQUE KEY相同的列值,则INSERT语句就无法插入。
REPLACE语句,可以使用户再次插入含有与原有记录中PRIMARY KEY或UNNIQUE KEY相同的列值数据
create database dbTest; --新建数据库
use dbTest; --使用数据库
create table tblData( --创建表
id int primary key,
msg varchar(200)
);
insert into tblData values(1,'1'); --插入数据,成功
insert into tblData values(1,'1'); --插入数据,失败,因为主键相同
replace tblData values(1,'2'); --替换数据,成功
2.简述DELETE语句和TRUNCATE语句的区别。
TRUNCATE语句在功能上与不带WHERE子句的DELETE语句相同,二者均删除表中的全部记录,但TRUNCATE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一条记录,都需在事务日志中记录。而TRUCATE语句通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录释放操作。使用TRUNCATE语句,AUTO_INCREMENT计数器将被重新设置为初始值。
3.说明SELECT各子句的作用。
略
4. 简述视图的作用与特点。
视图是一个虚拟表,其内容由查询定义,视图可以包含一系列带有名称的列和行数据。但是,视图所查询的数据并不在数据库中以存储的数据值集形式存在,而是来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
视图的特点:(1)简化操作;(2)屏蔽数据库的复杂性;(3)定制数据、利于共享;(4)简化用户权限的管理,提高安全性
5. 可以使用( D )语句创建数据库。
A.NEW DATABASE
B.BUILD DATABASE
C.INSERT DATABASE
D.CREATE DATABASE
6.使用SQL语句进行分组检索时,为了去掉不满足条件的分组,应当( B )。
A.使用WHERE子句
B.在GROUP BY后面使用HAVING子句
C.先使用WHERE子句,再使用HAVING子句
D.先使用HAVING子句,再使用WHERE子句
7.假定有以下企业管理的员工管理数据库,数据库名为YGGL,其中主要有如表2.3.2~表2.3.7所示的表及其样本数据。
7.1创建数据库YGGL
create database YGGL DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
7.2创建员工信息表、部门表和薪水表
--创建部门表
use YGGL;
create table Departments(
DepartmentID char(3) not null primary key,
DepartmentName char(20) not null,
Note Text
);
--创建员工信息表
create table Employees(
EmployeeID char(6) not null primary key,
Name char(10) not null,
Education char(4) not null,
Birthday date not null,
Sex char(2) not null,
WorkYear tinyint ,
Address varchar(20),
PhoneNumber char(10) ,
DepartmentID char(3) not null ,
FOREIGN KEY(DepartmentID ) REFERENCES Departments(DepartmentID )
)ENGINE=innodb ;
--创建薪水表
create table Salary(
EmployeeID char(6) not null primary key,
Income float not null,
Outcome float not null
)ENGINE=innodb ;
7.3插入各表的样本数据。
--插入部门表样本数据
insert into Departments values(1,'财务部',null);
insert into Departments values(2,'人力资源部',null);
insert into Departments values(3,'经理办公室',null);
insert into Departments values(4,'研发部',null);
insert into Departments values(5,'市场部',null);
select * from Departments;
--插入员工信息表样本数据
insert into Employees values('000001','王林','大专','1966-01-23','1',8,'五一路32-1-508','83355668',2);
insert into Employees values('010002','李健','本科','1976-03-28','1',3,'中山路100-2','82124612',1);
insert into Employees values('020013','张兵','硕士','1982-12-09','1',2,'八一路166-4-102','83414282',1);
insert into Employees values('020018','李丽','大专','1960-07-30','0',6,'中山西路102-4','84232283',1);
insert into Employees values('102201','刘明','本科','1972-10-18','1',3,'解放路5-3-102','82423521',5);
insert into Employees values('102208','朱俊','硕士','1965-09-28','1',2,'中山西路102-4','84232283',5);
insert into Employees values('108991','钟敏','硕士','1979-08-10','0',4,'黄兴路206-2','87622342',3);
insert into Employees values('111006','张勇','本科','1974-10-01','1',1,'解放路10-113','82345687',5);
insert into Employees values('210678','林珏','大专','1977-04-02','1',2,'黄兴南路126-4','84523462',3);
insert into Employees values('302566','陈平','本科','1968-09-20','1',3,'劳动路422-5','82412354',4);
insert into Employees values('504209','王芳','大专','1969-09-03','0',5,'韶山路120-4-12','84456234',4);
--插入薪水表数据
insert into Salary values('000001',2100.8,123.09);
insert into Salary values('010008',1582.62,88.03);
insert into Salary values('102201',2569.88,185.65);
insert into Salary values('111006',1987.01,79.58);
insert into Salary values('108991',3259.98,281.52);
insert into Salary values('020010',2860.0,198.0);
insert into Salary values('020018',2347.68,180.0);
insert into Salary values('308759',2531.98,199.08);
insert into Salary values('504209',2066.15,108.0);
insert into Salary values('203566',2980.7,210.2);
insert into Salary values('210678',2240.0,121.0);
insert into Salary values('102208',1980.0,100.0);
7.4 在员工信息表和薪水表中,删除员工编号为“000001”的数据。
delete from Employees where EmployeeID='000001';
delete from Salary where EmployeeID='000001';
7.5将员工编号为“020018”的记录的部门号改为4。
update Employees set DepartmentID=4 where EmployeeID='020018';
7.6根据员工信息样本数据表和薪水样本数据表,重新插入员工编号为“000001”的数据。
insert into Employees values('000001','王林','大专','1966-01-23','1',8,'五一路32-1-508','83355668',2);
insert into Salary values('000001',2100.8,123.09);
7.7使用REPLACE语句向部门插入一条数据,其部门号为“1”,名称为“广告部”,备注为“负责广告业务”。
replace Departments values(1,'广告部', '负责广告业务'); --在该记录被引用的情况下无法执行
如需执行,需先删除引用数据
delete from Employees where EmployeeID=1
replace Departments values(1,'广告部', '负责广告业务');
7.8将员工号为011112的职工收入改为2890。
--该语句执行无效果,因表中无对应记录
update Salary set Income=2890 where EmployeeID='011112';
7.9将所有职工收入增加100。
update Salary set Income=Income+100;
7.10删除所有收入大于2500的员工信息。
delete from Employees
where EmployeeID in(
select EmployeeID from Salary
where Income>2500
);
7.11 查询员工表中的全部记录。
select * from Employees;
7.12查询每个员工的地址和电话。
select Name,Address,PhoneNumber from Employees;
7.13查询员工编号为“000001”的员工地址和电话。
select Name,Address,PhoneNumber from Employees
where EmployeeID='000001';
7.14查询月收入高于2000的员工号码。
select EmployeeID from Salary
where Income>2000;
7.15查询1970年以后出生的员工姓名和地址。
select Name,Address from Employees
where Birthday>='1970-01-01';
7.16查询财务部所有的员工编号和姓名。
select EmployeeID,Name
from Employees e,Departments d
where e.departmentID=d.departmentID
and d.departmentName='财务部';
7.17查询所有女员工的地址和电话,需指定显示的列标题为姓名、地址、电话。
select Name as '姓名',Address as '地址',PhoneNumber as '电话'
from Employees where Sex='0';
7.18查询所有男员工的姓名和出生日期,要求各标题用中文表示。
select Name as '姓名',Birthday as '出生日期'
from Employees where Sex='1';
7.19获得员工总数。
select count(*) from Employees;
7.20计算所有员工收入的平均数。
select avg(income) from Salary;
7.21获得员工信息表中最大的员工编号。
select max(EmployeeID) from Employees;
7.22计算所有员工的总支出。
select sum(outcome) from Salary;
7.23找出所有姓王的员工的部门编号。
select Name,DepartmentID from Employees
where Name like '王%';
7.24找出员工编号中倒数第2个数字为0的员工的姓名、地址和学历。
select EmployeeID,Name,Address,Education from Employees
where EmployeeID like '%0_';
7.25找出所有收入在2000~3000的员工编号。
select EmployeeID from Salary
where income between 2000 and 3000;
7.26找出所有在部门编号为“1”或“2”中工作的员工编号。
select EmployeeID from Employees
where DepartmentID in (1,2);
7.27查找在财务部工作的员工信息。
select e.*
from Employees e,Departments d
where e.departmentID=d.departmentID
and d.departmentName='财务部';
7.28查找所有收入在2500以下的员工信息。
select e.* from Employees e,Salary s
where e.EmployeeID=s.EmployeeID and
s.Income<2500;
7.29查找财务部中比所有研发部员工年龄都大的员工信息。
select e.*
from Employees e,Departments d
where e.departmentID=d.departmentID and
d.departmentName='财务部' and
e.birthday<(
select min(birthday)
from Employees ie inner join Departments id
on ie.departmentid=id.departmentid
where id.DepartmentName='研发部');
7.30查找研发部中比所有财务部员工收入都高的员工信息
select e.*
from Employees e,Salary s,Departments d
where e.EmployeeID=s.EmployeeID and
e.departmentID=d.departmentID and
d.departmentName='研发部' and
s.income>(
select max(ins.income)
from Employees ie,Salary ins,Departments id
where ie.EmployeeID=ins.EmployeeID and
ie.departmentID=id.departmentID and
id.departmentName='财务部'
);
7.31显示所有员工的基本信息和薪水情况。
select * from Employees e,Salary s
where e.EmployeeID=s.EmployeeID;
7.32显示每个员工的基本信息及其工作的部门信息。
select e.*,d.departmentName from Employees e,Departments d
where e.departmentID=d.departmentid;
7.33显示“王林”所在的部门名称。
select departmentName from departments
where departmentID=(
select DepartmentID
from Employees
where Name='王林');
7.34统计员工信息表中男性和女性的人数。
select case when sex='0' then '女'
when sex='1' then '男'
end '性别',count(*) as '数量'
from employees
group by sex;
7.35按部门列出部门的员工人数。
select departmentName,count(*)
from Employees e,Departments d
where e.departmentID=d.departmentID
group by d.departmentName;
7.36按员工学历分组,列出本科、大专和硕士的人数。
select education,count(*)
from Employees e
group by education;
7.37显示员工数超过2人的部门名称和部门人数。
select departmentName,count(*)
from Employees e,Departments d
where e.departmentID=d.departmentID
group by d.departmentName
having count(*)>2;
7.38按员工收入从多到少显示员工的基本信息和收入。
select *
from Employees e inner join Salary s on e.EmployeeID=s.EmployeeID
order by income desc;
7.39按员工的出生日期从小到大显示员工信息。
select * from Employees
order by birthday ;
7.40显示收入最高的5位员工的基本信息和收入。
select *
from Employees e inner join Salary s on e.EmployeeID=s.EmployeeID
order by income desc
limit 5;
7.41创建存储过程,要求当一个员工的工作年份大于6年时,将其转到经理办公室工作。
略
7.42创建触发器,要求当员工信息表中删除一个员工信息时,同时删除员工薪水表中对应的薪水信息。
略
第三章 诚信管理论坛数据库设计与实现
1.请找出下述程序的错误。
<?php
$3test="df"; //3test不是一个有效的变量名,不能以数字开头
print 'How are you?';
print 'I'm fine.'; //I’m 不能直接输出,需要使用转义符
//结束语句多了一个?
??>
//正确代码如下所示
<?php
$test="df";
print 'How are you?';
print 'I\'m fine.';
?>
2.运行下述程序,给出相应答案。
(1) world
<?php
$a = "hello";
$b = &$a;
$b = "world";
echo $a;
?>
(2)12
<?php
$a = 1;
$x = &$a;
$b = $a++;
echo $b,$x;
?>
(3)2
<?php
$a = 8%(-3);
echo $a;
?>
3.编写程序统计1~1000中的素数个数。
<?php
function isPrime($n){//判断是否素数
for($i=2,$sqrt=sqrt($n);$i<=$sqrt;$i++){ //只用判定当前数的平方根
if($n%$i==0){
return 0; //如果不是素数,则返回0
}
}
return 1;//如果是素数,返回1
}
function countPrime($n){//求素数个数
$cnt=0;
for($i=2;$i<=$n;$i++){
if(isPrime($i)==1){
$cnt++;
}
}
return $cnt;
}
$cnt=countPrime(1000);//求1000以内的素数个诉
echo "1000以内的素数共有:$cnt 个";
?>
4.编程实现求Fibonacci数列的前30个数。这个数列有如下特点:第1、2个数为1、1,从第3个数开始,每个数是其前面两个数之和。即:
F1 = 1 (n = 1)
F2 = 1 (n = 2)
F3 = F1 + F2 = 2 (n = 3)
Fn = Fn - 1 + Fn – 2 (n >3)
<?php
function Fibonacci($n){//输出指定数量的Fibonacci 数列
$f0=1;$f1=1;//设初始值
if($n<=0) {//如果<0,则输出0
echo "0";
return 0;
}
if($n==1) {//如果是第1项,则输出1
echo "1";
return 1;
}
if($n==2) {如果是第2项,则输出1 1
echo "1 1";
return 1;
}
$fn=0;
echo "1 1 ";输出前2项
for($i=3;$i<=$n;$i++){//从第3项开始输出数列
$fn=$f0+$f1;//计算第$i项
$f0=$f1; //递推
$f1=$fn;
print "$fn ";//输出
}
}
Fibonacci(30);
?>
5.编程将一个数组中的值按逆序重新存放。假定原来的顺序为4、1、3、5、9、2、1。要求改为1、2、9、5、3、1、4。
<?php
function reverse($array){//数组逆序
$count=count($array)-1;
for($i=0;$i<=$count/2;$i++){
$tmp=$array[$i];
$array[$i]=$array[$count-$i];
$array[$count-$i]=$tmp;
}
return $array;
}
$array=array(4,1,3,5,9,2,1);
$array=reverse($array);
print_r($array);
?>
实现方式2
<?php
$arr = array(4,1,3,5,9,2,1);
$arr = array_reverse($arr);
print_r($arr);
?>
6.定义两个数组,首先将第一个数组中的元素复制到第二个数组中,然后将第二个数组从大到小排序,最后将两个数组中的对应元素进行比较,试统计两个数组中对应位置上相同元素的个数。
<?php
//复制数组
function arrayCopy($array){
$arrRet=array();
foreach ($array as $i => $value) {
$arrRet[$i]=$value;
}
return $arrRet;
}
//排序(冒泡)
function arraySort($array){
$count=count($array);
for($i=0;$i<$count;$i++){
for($j=$i;$j<$count;$j++){
if($array[$i]<$array[$j]){
$tmp=$array[$i];
$array[$i]=$array[$j];
$array[$j]=$tmp;
}
}
}
return $array;
}
//统计对位相等的元素个数
function countSameItem($arr1,$arr2){
$count=count($arr1);
$ret=0;
for($i=0;$i<$count;$i++){
if($arr1[$i]==$arr2[$i]){
$ret++;
}
}
return $ret;
}
$arrOrigin = array(4,1,3,5,9,2,1);
$arrCopy=arrayCopy($arrOrigin);
$arrCopy=arraySort($arrCopy);
$count=countSameItem($arrOrigin,$arrCopy);
print_r($arrOrigin); echo "</br>"; print_r($arrCopy); echo "</br>";
echo "对位相同元素的个数为:$count 个";
?>
第四章 诚信管理论坛数据库设计与实现
1.在PHP中,实现文件上传功能,通常分为哪几个步骤?
(1)在php.ini配置文件中对上传的选项进行设置。
(2)对表单标签进行设置。
(3)通过$_FILES对上传文件进行一些限制和判断。
(4)使用move_upload_file函数实现上传。
2.请思考如何使用文件操作函数为诚信论坛系统增加操作日志记录功能。
略
3.请简述表单的作用,并列出所有的Input控件。
表单在Web页中用来给访问者填写信息,从而获取用户信息,使网页具有交互的功能。
type属性取值 | 输入区域类型 |
<INPUT type="text" size="" maxlength=""> | 单行文本框 |
<INPUT type="submit"> | 提交按钮, |
<INPUT type="reset"> | 重置按钮 |
<INPUT type="checkbox" checked> | 复选框 |
<INPUT type="hidden"> | 隐藏区域, |
<INPUT type="image" src="URL"> | 图像按钮 |
<INPUT type="password"> | 密码框 |
<INPUT type="radio"> | 单选按钮 |
4.请使用表单控件,编写以下页面。
略
5.请简述GET方法和POST方法的区别。
使用GET方法传递数据时,把表单中的变量名和值附加到ACTION属性中指定的URL后,并使用“?”分隔。
POST方法比GET方法更安全,它不会把表单数据显示在URL中;而且,可以传递更多的数据内容。
6.请使用GET方法或POST方法,分别实现以下页面功能的提交功能。
略
7.什么是会话,在PHP中使用会话一般分为几个步骤。
会话是指来自于同一浏览器的与服务器交互的一系列操作。
在PHP中会话的使用一般分为启动会话、保存会话变量、使用会话变量和注销会话4个阶段。
8.创建一个用户登录和注册系统,其中数据库表结构如表4.2.3所示。要求用Session存储用户姓名,用文件存储在线人数和总人数。要求是首先进入登录界面,如登录成功转成功显示页面要求显示在线人数和总人数,否则转入注册页面。
8.1 创建数据库和数据表
create database members;
use members;
create table users(
UserName varchar(10) not null primary key,
UserPwd varchar(10) not null,
UserSex varchar(2) not null,
UserBirthday datetime not null,
UserAddress varchar(10)
)engine=innodb;
8.2 创建登录页面login.php
<html>
<head>
<title>会员系统</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<H1><p align="center">欢迎登录</p></H1>
<form name="form1" method="post" action="doLogin.php">
<table width="300" border="0" align="center" cellpadding="0" cellspacing= "0">
<tr>
<td>用户名</td>
<td><input name="name" type="text" id="name" style="width:200"></td>
</tr>
<tr>
<td>密码</td>
<td><input name="password" type="password" id="password" style="width:200"></td>
</tr>
</table>
<p align="center">
<input type="submit" value="提交">
<input type="reset" value="重填">
<a href="register.php">注册</a>
</p>
</form>
</body>
</html>
8.3登录处理页面doLogin.php
略
8.4通用库页面 common.php
略
8.5 注册页面 register.php
略
8.6注册处理页面doRegister.php
略
8.7错误处理页面 error.php
略
8.8 用户操作类 user.dao.php
略
第五章 诚信管理论坛数据库设计与实现
1. 简述分页技术的原理与实现方式。
分页是一种将所有信息分段展示给浏览器用户的技术,浏览器用户每次看到的不是全部信息,而是其中的一部分信息,如果没有找到需要的内容,用户可以通过跳转到指定页面或翻页的方式切换显示内容。
方法1:在客户端浏览器中使用JS实现分页
浏览器端可以使用JavaScript脚本实现分页功能,但前提是从数据库中查询出满足需要的全部记录,将结果集通过WEB服务器发送到客户端浏览器,然后在浏览器中通过JavaScript脚本实现分页功能。特点:实现了数据的离线访问,用户切换分页速度快,体验较好,但初次等待时间长,消耗了大量的服务器资源和网络带宽,效率低,且在数据量过大时,易造成系统性能急剧下降。
方法2:在服务端中使用PHP实现分页
WEB服务器端也可以使用PHP等动态脚本语言实现分页功能,但同样需要从数据库中查询出满足需要的全部记录,并传输到WEB服务器端,然后由应用程序过滤结果集,仅将满足条件的记录发送到客户端浏览器。该方法一方面减少了从服务器端到用户端的大量数据传输,但却增加了WEB服务器的运算量,并降低了用户切换分页的极速体验,是一种典型的折中方案。
方法3:在数据库端中使用SQL实现分页
数据库服务器可以使用SQL语句实现分页功能,直接在数据库端进行过滤,将用户所需记录集发送到WEB服务器端,再转发到客户端浏览器,无需进行二次过滤。该方法效率较高,对服务器资源和网络带宽均较为节省,是最为常见的分页技术,又称为”真分页“
2. 简述KindEditor在线编辑器的使用步骤。
(1)从KindEditor网站下载组件包(kindeditor-4.0.5.zip)后解压,然后将相关的文件和文件夹复制到项目工程中。
(2)在页面中使用引入组件
<script charset="utf-8" src="kindeditor/kindeditor.js"></script>
<script charset="utf-8" src="kindeditor/lang/zh_CN.js"></script>
(3)关联组件
<script type="text/javascript">
//初始化文件编辑器
var editor;//编辑器
//创建文本编辑器
KindEditor.ready(function(K) {
editor = K.create('textarea[name="content"]', {
cssPath : 'kindeditor/plugins/code/prettify.css',
allowImageUpload:false,allowFlashUpload:false,
allowMediaUpload:false});
prettyPrint();
});
</script>
(4)使用editor.html()来获取内容。
str = editor.html();//获取编辑框中的内容
或
editor.sync();// 同步数据后可以直接取得textarea的value
html = document.getElementById(' content ').value; // 获取编辑框中的内容
第六章 诚信管理论坛数据库设计与实现
1.在模块四所创建的用户登录和注册系统上,增加以下功能。
(1)为登录功能添加记住密码功能。
(2)为注册和登录功能,添加密码动态加密功能。
(3)为登录功能添加验证码功能。
(4)将系统打包并部署。
略