资源描述
由于时间仓促,答案中难免存在错误,不妥之处恳请读者批评指正!
第1章答案:
1.答案见教材1.2.3,1.2.4,1.2.5,1.2.6
2.答案见教材1.2.4,1.2.5
3.PHP,JSP,.NET,ASP等
4.答案如下:
打印明天的时间使用下面的程序:
<?php
date_default_timezone_set('PRC'); //设置中国时区
echo date("Y/m/d H:i:s", time()+24*3600); //打印明天的时间
?>
date ()函数中:
d: 几日,两位数字,若不足则补零;从"01"至"31"
D: 星期几,3个英文字母,如:"Fri"
F: 月份,英文全名,如:"January"
h: 12小时制的小时,从"01"至"12"
H: 24小时制的小时,从"00"至"23"
m: 月份,两位数字,从"01"至"12"
M: 月份,3个英文字母;如:"Jan"
s: 秒;从"00"至"59"
w: 数字型的星期几,从"0(星期天)"至"6(星期六)"
Y: 年,四位数字
y: 年,两位数字
z: 一年中的第几天;从"1"至"366"
time() 函数返回当前时间的 Unix 时间戳,即:自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
5. Apache服务器的配置文件名是httpd.conf文件,默认放在C:\wamp\bin\apache\Apache\conf目录下。MySQL服务器的配置文件名是my.ini,默认放在C:\wamp\bin\mysql\mysql目录下,PHP预处理器配置文件名是php.ini,默认放在C:\wamp\bin\apache\Apache\bin目录下。
6. 答案见教材1.3.5
第2章答案:
1. 答案见教材2.1.1
2. 答案见教材2.1.2
3. 答案见教材2.2.2
布尔型主要用于逻辑判断,整型和浮点型主要用于算术运算,字符串主要用于文字性描述,数组实际上是用于容纳若干变量的容器。当使用面向对象编程思想时,需要使用对象描述事物(属性及方法)。
4.
echo与print共同点:
它们都不是真正的函数,是一种语法结构,因为语句没有返回值,函数可以有返回值(即便没有用)(也有说print是函数,echo不是)。
echo和print 后面都可不用加(), 如: echo 'ok'; print 'ok';
运行速度echo稍快一些,因为echo并不返回值,print返回一个值int(1)。
echo与print区别:
一般用echo,除非三元运算时。$a=5; ($a==5) ? print '5': print 0;
echo 后不要跟()。
print只能有一个参数,所以不能不能用",",而echo可以。
echo -- 输出一个或者多个字符串
print_r是递归打印,主要用于打印复杂类型变量的值(如 数组,对象)
5. 答案见教材2.3
6. 答案见教材图2.3
7.
<?php
class Test{
function get_test($num){
$num=md5(md5($num));
return $num;
}
}
$test = new Test();
$password = $test->get_test("123");
echo $password;//输出字符串“123”两次md5加密结果:d9b1d7db4cd6e70935368a1efb10e377
?>
第3章答案:
选择题:
1:C
2:B
3:A
4:D(说明:PHP变量以一个美元符号为开头,后面跟上任意数量的数字、字母和下划线。 ${“MyVar”}是一个合法的变量名,它使用的是较松散的命名约定。&$something是对$something的引用。然而,变量名不能以数字为开头,$10_somethings是非法的,因此答案是D。)
5:D(说明:这又是一个考验debug能力的题。注意到了吗,在脚本的末尾,echo语句中的?$output变量拼错了!脚本不会输出任何东西,答案是D),
6:D(说明:%运算符表示取模,它返回两个操作数相除的余数。<< 是左移运算符,相当于乘以2的N次方。最后的答案乘以了一个浮点数,改变了它的数据类型。但是,由于小数点后是零,因此输出的结果不包含小数部分。答案是 256)
7:B(说明:全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回False。因此答案是B)
8:AC(说明:A选项中,pow函数计算2的平方,答案是4。C选项中,左移运算符将$a的值左移两位,相当于乘以4)
9:D
10:B
填空题:
逻辑异或(xor)运算符
0
2
程序阅读题
相等相等不相等
truetruetruetruetruefalsetruefalse
aaaaaa
41
hotdogok
is zero
4
问答题:
1.isset($str)用于测试变量是否设置(或者存在),empty($str)用于测试变量是否为空。
检测变量是否为空使用is_null()和empty()函数。is_null()和empty()函数的区别请参考下面的程序:
<?php
$a = 0;
var_dump(empty($a)); //输出:bool(true)
echo "<br/>";
var_dump(is_null($a)); //输出:bool(false)
?>
2. PHP垃圾回收机制是基于引用计数机制的垃圾回收,当一个变量的引用计数变为0时, PHP将在内存中销毁这个变量,此时启动垃圾回收机制。当一个变量被初始化或者赋值给另一个变量时引用计数会加1,当变量或者被赋值的变量被销毁或者被侦测到无用时引用计数会减一,当垃圾收集的进程运行时会释放掉引用计数为0的那些变量会被从内存中释放(垃圾回收期间程序会被中断)。当脚本执行完成时所有资源都会被释放。
3.
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
区别:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。
4.
<?php
if("0"==0){
echo "==";//输出“==”
}
if("0"===0){
echo "===";//没有任何输出
}
?>
5.
<?php
$var1 = 1;
$var2 = 7;
$var3 = 8;
$max=$var1>$var2?$var1:$var2;
$max=$max>$var3?$max:$var3;
echo $max;
?>
第4章答案:
选择题:
1. D(说明:根据条件式的逻辑,要想得到Hello, World!字符串,必须要在第一个if结构中满足else的条件。因此$a必须为False,然后$b也必须为False。最内层的条件语句的实现要求先前的两个变量($a和$b)是False,而$c必须是True)
2.C
3.A
4.E
编程题:
<?php
switch($a) {
case 'a':
somefunction();
break;
case 'b':
anotherfunction();
break;
case 'c':
dosomething();
break;
default:
donothing();
}
?>
第5章答案:
选择题:
1.D
2.B
3.B
4.A(说明:注意,$myarray的键值并没有打上引号。所以,正在访问的键不是myvalue字符串,而是常量myvalue的值。最终访问的是$myarray[10],值是Dog,答案是A。)
5.A(说明:5.通常情况下,foreach 语句是遍历数组的首选。但是,由于foreach语句是在数组的副本上进行操作,而我们需要给数组中每个元素重新赋值,所以在这里foreach就不适用了。尽管也可以用while循环和do…while循环,但由于数组是顺序索引的,最合适的语句还是for语句。因此答案是A。)
6.C
7.E
8.B(说明:foreach操作的是$array的副本,因此对原来的值没有影响)
9.B(说明:只有asort函数能在保留原有索引关系的前提下进行排序。答案是B)
10.A
11.B,D(说明:array_flip()只能把数组中每个元素的键和值进行交换。rsort()和array_reverse()则能把题目中的数组逆向排序为需要的形式(’d’,’c’,’b’,’a’)。答案是B和D。)
12.B
13.D
14.A
15.A
16.A
问答题:
1. sort(), asort()以及ksort()三个函数之间有什么区别?在什么情况下会使用他们?
答案参见教材5.4.7
2.
<?php
$arr = array('james', 'tom', 'symfony');
echo join(',',$arr);//方法1
echo "<br/>";
echo implode(',',$arr);//方法2
?>
编程题:
第一题:
说明:当$ip是合法IP地址时,程序运行结果是1。当$ip不是合法IP地址时,程序运行结果是空字符串。
<?php
$ip = "210.184.168.111";
$flag = false;//将标记flag初始化为false
$ips = explode(".",$ip);//使用“.”分割字符串,将分割后的字符串放到数组中
$count = count($ips);//获取数组的长度
if($count!=4){//如果数组的长度不是4,说明是非法IP地址,退出程序
exit($flag);
}
for($i =0 ; $i < $count ; $i++ ){
//IP地址的每一位必须是数字、并且在0--255区间取值
if(is_numeric($ips[$i]) && $ips[$i]>=0 && $ips[$i]<=255){
$flag = true;
}else{//如果某一位不是数字,或者没有在在0--255区间取值,说明是非法IP地址,退出for循环
$flag =false;
break;
}
}
exit($flag);
?>
第二题:
可用冒泡法进行排序。冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后, 如此继续,直至比较最后两个数,将小数放前,大数放后,此时第一趟结束,在最后的数必是所有数中的最大数。重复以上过程,仍从第一对数开始比较(因为可能 由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟 结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
<?php
$str = array(3,6,1,5,9,0,4,6,11);
for ($i=0;$i<count($str);$i++)
{
for ($j=count($str)-2;$j>=$i;$j--)
{
if($str[$j+1]<$str[$j])
{
$tmp = $str[$j+1];
$str[$j+1]=$str[$j];
$str[$j]=$tmp;
}
}
}
print_r($str);
?>
第三题:
说明:这里使用了字符串处理函数ucwords()。
<?php
$string = "make_by_id";
$str = "";
$array = explode('_', $string);
for($k=0;$k<count($array);$k++){
$str = $str.ucwords($array[$k]);
}
echo $str;
?>
第6章答案:
选择题:
A
B,D
C
问答题:
1. 答:get 是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息。区别如下:
a、 Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如 在 url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头 (header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理
b、 Get 方 式需要使用 $_GET 来取得变量的值;而 Post 方式通过 $_POST 来访问提交的内容
c、 Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待 服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。可在php.in中 对 post_max_size 进行设置。
建议:除 非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法
d、 Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其 他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题 是,该页面如果刷新的时候,会弹出一个对话框。
2.答案参见教材6.5.2
3.答案参见教材6.5.4
4.以上传文件只允许为”jpg”图片为例,只需要得到文件名的扩展名必须是”jpg”或者”JPG”,才可进行上传。
获得文件名扩展名的方法如下:
$extend = strtolower(end(explode("." , $myPictureName)));
说明:这里用到了字符串操作函数explode,数组指针函数end,和字符串操作函数strtolower
然后再使用if判断语句if($extend == “jpg”),条件成立时,再进行上传。
5.POST传输数据容量由php.in中post_max_size的值设置。GET传输数据容量由浏览器决定。
6.
<?php
$clientIP = $_SERVER['REMOTE_ADDR'];
$serverIP = $_SERVER['SERVER_ADDR'];
echo $clientIP;
echo "<br/>";
echo $serverIP;
?>
三、编程题
1.编写支持换皮肤的PHP程序。
程序说明,此题关键在于:
Ø 如何设置页面背景图片
Ø 如何使用相对路径访问图片资源
Ø 如何使用条件运算符初始化下拉选择框的选中状态
1.准备JPG皮肤图片,分别将其命名为1.jpg、2.jpg、3.jpg、4.jpg。
2.创建目录images,将所有皮肤图片文件置于该目录下。
3.创建skin.php文件,写入如下代码:
<?php
if(isset($_GET["source"])){
$source = $_GET["source"];
}else{
$source = "images/1.jpg";
}
?>
<body background="<?php echo $source ?>">
<form>
<select name="source">
<option value="images/1.jpg" <?php echo $source=="images/1.jpg" ? "selected" : "";?>>
皮肤1
</option>
<option value="images/2.jpg" <?php echo $source=="images/2.jpg" ? "selected" : "";?>>
皮肤2
</option>
<option value="images/3.jpg" <?php echo $source=="images/3.jpg" ? "selected" : "";?>>
皮肤3
</option>
<option value="images/4.jpg" <?php echo $source=="images/4.jpg" ? "selected" : "";?>>
皮肤4
</option>
</select>
<input type="submit" value="修改皮肤">
</form>
2.编写支持多文件上传的FORM表单程序以及PHP程序。
程序说明:此题关键在于文件上传框不确定,可以使用DOM+JavaScript,产生不确定个数的于文件上传框。步骤如下:
1.创建目录:uploads,所有上传文件置于该目录下。
2.创建upload.html文件,写入如下代码:
<form action="upload.php" method="post" name="form" enctype="multipart/form-data">
<!--每个文件上传框限制上传文件的大小为10K字节-->
<input type="hidden" name="MAX_FILE_SIZE" value="10240">
<div id="upload"></div>
<input type="button" value="添加附件" onclick="createUploader()"><br>
<input type="submit" value="上传">
</form>
<script>
function createUploader(){
var div= document.getElementById("upload");;
var uploader = document.createElement("input");
uploader.type = "file";
uploader.name = "myFile[]";
div.appendChild(uploader);
var br = document.createElement("br");
div.appendChild(br);
}
</script>
3.创建upload.php文件,写入如下代码:
<?php
if(empty($_POST)){
exit("您提交的表单数据超过post_max_size的配置!<br/>");
}
$count = count($_FILES['myFile']['name']);
for($i=0;$i<$count;$i++){
$myFile = $_FILES['myFile'];
$error = $myFile["error"][$i];
switch ($error){
case 0:
$fileName = $myFile['name'][$i];
echo "您上传的文件有:".$fileName. "<br/>";
$fileTemp = $myFile['tmp_name'][$i];
$destination = "uploads/".$fileName;
move_uploaded_file($fileTemp,$destination);
break;
case 1:
echo "上传的某些文件超过了php.ini 中upload_max_filesize选项限制的值!<br/>";
break;
case 2:
echo "上传的某些文件超过了FORM表单MAX_FILE_SIZE选项指定的值!<br/>";
break;
case 3:
echo "某些文件只有部分被上传!<br/>";
break;
case 4:
echo "没有选择上传文件!<br/>";
break;
}
}
?>
第7章答案:
选择题:
1.A
2.E
3.C
4.A
5.B
6.E(说明:在较新版本的PHP中,require(或requier_once())和include()(或include_once())只有一个区别——如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;而后者只会产生一个警告。因此答案E正确)
7.C(说明:当参数被声明为通过引用传递时,你不能给它赋默认值,此时解释器期望获得一个能在函数内部进行修改的变量。)
8.A(说明:一段脚本并不会在执行到文件末尾时终止,所以当前文件才能被其他脚本包含。至于PHP和Apache崩溃,这两个说法就太恶搞了)
9.
程序阅读题:
1. 501
2. 552
3. 12
问答题:
1.按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
2.
通过修改php.ini配置文件的选项allow_call_time_pass_reference(默认值为Off)决定是否开启函数调用时强制参数按照引用传递。
编程题:
1.
<?php
function($var1,$var2,$var3){
$max=$var1>$var2?$var1:$var2;
$max=$max>$var3?$max:$var3;
return $max;
}
?>
2.答案请参考第6章编程题的答案。
3.答案请参考第5章编程题的答案。
<?php
function BubbleSort($str)
{
for ($i=0;$i<count($str);$i++)
{
for ($j=count($str)-2;$j>=$i;$j--)
{
if($str[$j+1]<$str[$j])
{
$tmp = $str[$j+1];
$str[$j+1]=$str[$j];
$str[$j]=$tmp;
}
}
}
return $str;
}
$str = array(3,6,1,5,9,0,4,6,11);
print_r(BubbleSort($str));
?>
4.答案请参考第5章编程题的答案。
<?php
function convString($string){
$array = explode('_', $string);
$str = "";
for($k=0;$k<count($array);$k++){
$str = $str.ucwords($array[$k]);
}
return $str;
}
echo convString("make_by_id");
?>
5.答案请参考第4章编程题的答案。
第8章答案:
1.E
2.B
3.C
4.C
5.E
6.C
7.B,C(说明:在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。)
8.C(说明:本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID 非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。)
填空题:
1.事务
2.where
3.insert
4.auto_increment
5. 左连接表A和表B意味着取表A的全部记录按指定的连接条件与表B中满足连接条件的记录进行连接,若表B中没有满足连接条件的记录,则表A中相应字段填入NULL。
问答题:
1.答案参见图8-21(说明,父子关系是相对的)
2.答案参见8.1.2
3.满足唯一性约束的字段可以为NULL。
4.MEMORY,MyISAM,InnoDB
5. 答案参见8.3.3
6. Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取, 比char定长类型多了一个步骤,所以效率低一些。
7.忽略
8.说明:这里使用了MySQL的now()函数和DATE_FORMAT()函数。
INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','13254748547','高中','2007-05-06')
UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三'
DELETE FROM User WHERE Name='李四'
9.
SELECT username,count(*) as num FROM `members` group by username order by count(*) desc limit 10
数据库设计题:
该题只需设计ER图,ER图如下:
第9章答案:
选择题:
1.B,D(说明:用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。)
2.A
3.C
4.A(说明:mysql_fetch_field函数从结果集中取得列信息并作为对象返回)
5.C
填空题:
过滤特殊字符。
addslashes
问答题:
1.答案参见9.1.6
2.
创建printInfo.php文件,写入如下代码:
<?php
function printInfo($database,$tableName){
$host = 'localhost';
$userName = 'root';
$password = '';
mysql_connect($host,$userName,$password);
mysql_select_db($database);
mysql_query("set names 'gbk'");
//制作表格(边框宽度为1)
echo "<table border=1><tr>";
//制作表头(也就是表中拥有的字段)
$sql = "select * from $tableName limit 10";
$result = mysql_query($sql);
$fieldsNum = mysql_num_fields($result);
echo "<tr>";
for($i=0;$i<$fieldsNum;$i++){
echo "<td>".mysql_field_name($result,$i)."</td>";
}
echo "</tr>";
//导出10行记录
while($row = mysql_fetch_array($result)){
echo "<tr>";
for($i=0;$i<$fieldsNum;$i++){
echo "<td>".$row[$i]."</td>";
}
echo "</tr>";
}
echo "</table>";
}
printInfo('register','users');
?>
第10章答案:
任务1答案:
create table message
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title varchar(100),
content varchar(225),
category_id int,
hits int
)
任务2答案:
select a.id, a.title, a.hits, if(ifnull(b.id,false),count(*),0) as replay from message a left join comment b on a.id=b.id
group by a.id
order by replay desc
任务3答案:
function categoryList()
{
$result=mysql_query("select category_id,categroy_name from category")
or die("Invalid query: " . mysql_error());
print("<select name='category' value=''>"n");
while($rowArray=mysql_fetch_array($result))
{
print("<option value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>"n");
}
print("</select>");
}
第11章答案:
选择题:
C
B
B(说明:浏览器不允许来自某个域名的HTTP事务更改另一个域名下的cookie,否则这将造成严重的的安全问题。)
D
B
B,D(说明:B和D是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的cookie(不过有可能会阻止所有的cookie)。你首先应当检查浏览器是否被设置为阻止所有cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源——给cookie设置有效期时用得是GMT时间。可能会出现cookie在写入时就立刻过期,从而无法被脚本接收的情况。)
B(说明:session.gc_maxlifetime设置的是用户最后一次请求到session被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦session被回收,你将无法对此session进行访问。巧合的是,session.gc_maxlifetime的默认设置正好是1440秒,但这个数字是可以被系统管理员调整的。所以答案应该是B。)
问答题:
1.header函数和setcookie函数
2. 状态401代表未被授权,如果返回“找不到文件”的提示,则可用header("Location:www.xxx.php");
3.答案参见教材内容.
4.Cookie的内容如下:
Set-Cookie:PHPSESSID= btek48cklarn1m73eg2qkcsu12;
path = PATH;
domain= DOMAIN_NAME;
禁用Cookie后,Session还可以使用,请参考教材中的示例程序。
5.
设置Session的生存时间包括设置服务器端Session的生存时间和浏览器端的生存时间。
方法1:php.ini配置文件中有一组如下Session的配置选项,实现Session的设置。其中session.gc_maxlifetime = 1440:设置Session文件在服务器端的储存时间,如果超过这个时间,那么Session文件会自动删除。默认为1 440s(24min),表示1 440s无操作就会自动销毁该Session文件。session.cookie_lifetime = 0:表示浏览器一旦关闭Session ID立即失效(推荐使用)。
方法2:使用下面的程序设置
$savePath = "./session_save_dir/";
$lifeTime = 小时 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法3:使用函数setcookie()或session_set_cookie_params($lifeTime)设置
6.解决HTTP无状态本质,可以从以下几个方面入手。
(1)利用form表单的隐藏域hidden,在表单数据提交时传递参数,这种方法需要和form表单一起使用。
(2)利用超链接通过URL查询字符串传递参数。
(3)使用header()函数重定向功能或JavaScript重定向功能,通过URL查询字符串传递参数。
(4)使用Cookie将浏览器用户的个人资料存放在浏览器端主机
展开阅读全文