一、选择题 1. 有如下代码,数据库关闭指令将关闭的连接标识是______
<?php
$link1=mysq1_connect("localhost","root","");
Slink2=mysq1_connect("localhost","root","");
mysq1_close();
?>
A.$link1 B.$link2 C.全部关闭 D.报错
A B C D
B
[解析] 当数据库连接时,默认使用最后被mysql_connect()打开的连接。如果没有找到该连接,那么函数会尝试调用mysql_connect()建立连接并使用它。如果发生意外,没有找到连接或无法建立连接,那么系统会发出E_WARNING级别的警告信息。选项B正确。 所以,本题的答案为B。
二、填空题 3. 程序echo getservbyname('ftp','TCP')输出的是______。
21。
[解析] getservbyname()函数可以获取互联网服务协议对应的端口。而这里获取的是TCP服务器指定的“FTP”协议中对应的端口,默认值是21,所以输出得到21。
4. 一个字节占______bit,一个IPv4地址占______字节,一个IPv6地占______字节。
5. 面向对象的特征是______、______、______。
封装、继承、多态。
[解析] 面向对象的特征只有封装、继承、多态三个特征。
三、简答题 1. 请简述数据库设计的范式及应用。
对于表结构的优化,一般划分到第三范式,因为这样可以避免应用过于复杂和SQL语句过于冗长造成系统执行效率低下的问题。 范式按规范可以划分为以下几种。 第一范式:若关系模式R的每一个属性是不可再分解的,则为第一范式。 第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。 第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式。
2. 请简要描述你对Memcache的理解,它的优点有哪些?
Memcache是一个高性能的分布式内存对象缓存系统,主要通过在内存里维护一个巨大的hash表进行数据缓存。它主要是将数据调用到内存中,然后从内存中读取数据,从而提高读取速度。它主要通过key-value的形式存储各种数据,包括图像、视频、文件等。 它具有以下优点: 1)支持多台服务器使用Memcache。由于Memcache的存储数据大小必须小于内存的大小,所以可以将Memcache使用在多台服务器上,增加缓存容量。 2)支持均衡请求。当使用多台Memcache服务器时,可以均衡请求,避免所有请求都进入一台Memcache服务器中,导致服务器挂掉。 3)支持分布式。可以解决缓存本身水平线性扩展的问题和缓存大并发下的本身性能问题,避免缓存的单点故障问题。 4)支持部分容灾问题。即如果多台服务器存储了Memcache数据,那么其中一台Memcache服务器挂掉,部分请求还是可以在Memcache中命中,为修复挂掉的服务器争取一些时间。
3. 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)。
MyISAM、InnoDBDBD(Berkeley DB)、Merge、Memory(Heap)、Example、Federated等。以下为4种常用数据库存储引擎的简单介绍。 MyISAM:默认的MySQL插件式存储引擎。如果应用是以读写和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么可选用此种存储引擎。 InnoDB:用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么。InnoDB比较合适。InnoDB存储引擎除了能有效地降低由于删除和更新操作导致的锁定,还可以确保事务的完整提交和回滚。 Memory:将所有的数据保存在RAM中,在需要快速定位记录和其他类似数据的环境下,可提供极快的访问。Memory的缺陷首先是对表的大小有限制,太大的表无法缓存在内存中,其次要确保表数据可以恢复,数据库异常终止后表中的数据是可以恢复的。Memory表通常用于更新不太频繁的小表,从而快速得到访问结果。 Merge:用于将一系列等同的MyISAM表以逻辑方式组合在一起,并作为一个对象引用它们。Merge表的优点在于可以突破对单个MyISAM表大小的限制,并且将不同的表分布在多个磁盘上,可以有效地改善Merge表的访问效率。
4. Session与Cookie的区别是什么?
Session。 PHP的会话也称为Session。PHP在操作Session时,当用户登录或访问一些初始页面时服务器会为客户端分配一个SessionID。SessionID是一个加密的随机数字,在Session的生命周期中保存在客户端。它可以保存在用户机器的Cookie中,也可以通过URL在网络中进行传输。 用户通过SessionID可以注册一些特殊的变量,这些变量被称为会话变量,这些变量的数据保存在服务器端。在一次特定的网站连接中,如果客户端可以通过Cookie或URL找到SessionID,那么服务器就可以根据客户端传来的SessionID访问会话保存在服务器端的会话变量。 Session的生命周期只在一次特定的网站链接中有效,当关闭浏览器后,Session会自动失效,之前注册的会话变量也不能再使用。具体的使用步骤如下: (1)初始化会话 在实现会话功能之前必须要初始化会话,初始化会话使用session_start()函数。 bool session_start(void) 该函数将检查SessionID是否存在,如果不存在,则创建一个,并且能够使用预定义数组$_SESSION进行访问。如果启动会话成功,则函数返回TRUE,否则返回FALSE。会话启动后就可以载入该会话已经注册的会话变量以便使用。 (2)注册会话变量 自PHP 4.1以后,会话变量保存在预定义数组$_SESSION中,所以可以以直接定义数组单元的方式来定义一个会话变量,格式如下: $_SESSION["键名"]="值"; 会话变量定义后被记录在服务器中,并对该变量的值进行跟踪,直到会话结束或手动注销该变量。 (3)访问会话变量 要在一个脚本中访问会话变量,首先要使用session_start()函数启动一个会话,之后就可以使用$_SESSION数组访问该变量了。 (4)销毁会话变量 会话变量使用完后,删除已经注册的会话变量以减少对服务器资源的占用。删除会话变量使用unset()函数,语法格式如下: void unset(mixed $var[,mixed $var[,$...]]) 说明:$var是要销毁的变量,可以销毁一个或多个变量。要一次销毁所有的会话变量,使用session_unset(); (5)销毁会话 使用完一个会话后,要注销所有的会话变量,然后调用session_destroy()数销毁会话,语法格式如下: bool session_destroy(void) 该函数将删除会话的所有数据并清除SessionID,关闭该会话。
5. MySQL数据库基本的三个优化法则是什么?除了增加硬件和带宽。
1)系统服务优化,把MySQL的key_buffer、cache_buffer、query_cache等增加容量。 2)给所有经常查询的字段增加适当的索引。 3)优化SQL语句,减少Distinct、Group、Join等语句的操作。
四、编程题 1. 写一个函数,算出两个文件的相对路径。例如,$a=∨a/b/c/d/e.php\;,$b=∨a/b/12/34/c.php\;,计算出$b相对于$a的相对路径应该是../../c/d。
示例代码如下:
function getRelativepath($a,$b){
$returnpath=array(dirname($b));
for($n=1,$len=count($arrB);$n<$len;$n++){
if($arrA[$n]!=$arrB[$n]){
break;
}
}
if($len-$n>0){
$returnpath=array_merge($returnpath,array_fill(1,$len-$n,"\...\"));
}
$returnpath=array_merge($returnpath,array_slice($arrA,$n));
}
$a="∨a/b/c/d/e.php\";
$b="∨a/b/12/34/c.php\";
echo getRelativepath($a,$b);
2. 请用PHP和MySQL实现数据库分页。
数据库分页技术是指在页面展示时,对用户的数据进行按页面请求来展示,从而减少数据库的数据查询量,减轻数据库的压力。数据库分页机制的基本思想如下: 1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定。一般通过下拉框让用户来选择每页显示几条。 2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的页数。 3)确定分页后的总页数。根据公式:“总页数=(总记录数-1)/每页显示的记录数+1”。 4)根据当前页数显示数据。如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数。 5)通过for、while循环语句分布显示查询结果。 代码示例如下: <?php $num_rec_per_page=10; //每页显示数量 mysql_connect('localhost','root',"); mysql_select_db('students'); if(isset($_GET["page"])){ $page=$_GET["page"]; }else{ $page=1; } $start_from=($page-1)*$num_rec_per_page; $sql="SELECT*FROM student LIMIT $start_from,$num_rec_per_page"; $result=mysql_query($sql);//查询数据 ?> <table> <tr><td>学生名</td><td>性别</td></tr> <?php while($row=mysql_fetch_assoc($result)){ ?> <tr> <td><?php echo $row['student_name'];?></td> <td><?php echo $row[sex];?></td> </tr> <?php }; ?> </table> <?php $sql="SELECT*FROM student"; $result=mysql_query($sql); $total_records=mysql_num_rows($rs_result): //统计总共的记录条数 $total_pages=ceil($total_records/$num_rec_per_page); //计算总页数 echo"<a href='pagination.php?page=1'>".'|<'."</a>"; //第一页 for($i=1;$i<=$total_pages;$i++){ echo"<a href='pagination.php?page=".$i."'>".$i."</a>"; }; echo"<a href='pagination.php?page=$total_pages'>".'>|'."</a>";//最后一页 ?>
3. 有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人溜出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴子,自己先拿1/5藏了。没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴子,偷走了1/5。第二天,大家分赃,也是分成5份多一个扔给猴子。最后一人分了一份。问:共有多少苹果?
设总的苹果数量为s,上一个人对苹果划分时剩余的苹果为y,s/5为藏起来的一份,1为扔给猴子的一个苹果,则有公式y=s-s/5-1。从这个公式开始,第一个人分的苹果总数s为最初的苹果总数,第二个人开始分赃直到结束分赃时,这个s都为上一个人分完苹果剩余的苹果数。所以可以根据这个式子,通过循环找出最后符合这个公式的解,从而得到苹果总数。 实现代码如下: <?php for($s=5;;$s++){ if($s%5==1){ //第一个人拿走五分之一,剩$1 $1=$s-round($s/5)-1; if($1%5==1){ //第一个人拿走五分之一,剩$q $q=$1-round($1/5)-1; if($q%5==1){ //第一个人拿走五分之一,剩$w $w=$q-round($q/5)-1; if($w%5==1){ //第一个人拿走五分之一,剩$x $x=$w-round($w/5)-1; if($x%5==1){ //第一个人拿走五分之一,剩$y $y=$x-round($x/5)-1; if($y%5==1){ echo $s; exit; } } } } } } } ?> 程序的运行结果为 15621 从程序运行的结果知道,苹果总共有15621个。
4. 编写一个应用程序,该程序包括2个类:Monkey类和People类。要求:
1)Monkey类中有个speak()方法,在speak方法中输出“咿咿呀呀......”的信息。
2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法中输出“不错嘛!会说话了!”的信息。
根据题意,实现代码如下: <?php class Monkey{ public function speak(){ echo "咿咿呀呀......"; } } Class People extends Monkey{ public function speak(){ echo "不错嘛!会说话了!"; } } ?>