用户名和密码将出现在 URL 上,如果页面可以被缓存或者其 他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题 是,该页面如果刷新的时候,会弹出一个对话框。 2.答案参见教材6.5.2 3.答案参见教材6.5.4
4.以上传文件只允许为”jpg”图片为例,只需要得到文件名的扩展名必须是”jpg”或者”JPG”,才可进行上传。
获得文件名扩展名的方法如下:
$extend = strtolower(end(explode(\ 说明:这里用到了字符串操作函数explode,数组指针函数end,和字符串操作函数strtolower 然后再使用if判断语句if($extend == “jpg”),条件成立时,再进行上传。
5.POST传输数据容量由php.in中post_max_size的值设置。GET传输数据容量由浏览器决定。 6.
$clientIP = $_SERVER['REMOTE_ADDR']; $serverIP = $_SERVER['SERVER_ADDR']; echo $clientIP; echo \ echo $serverIP; ?>
7.
程序说明:此题关键在于文件上传框不确定,可以使用DOM+JavaScript,产生不确定个数的于文件上传框。步骤如下:
1.创建目录:uploads,所有上传文件置于该目录下。 2.创建upload.html文件,写入如下代码:
3.创建upload.php文件,写入如下代码:
if(empty($_POST)){ exit(\您提交的表单数据超过post_max_size的配置!
\}
$count = count($_FILES['myFile']['name']); for($i=0;$i<$count;$i++){
$myFile = $_FILES['myFile']; $error = $myFile[\switch ($error){
case 0: $fileName = $myFile['name'][$i]; echo \您上传的文件有:\ $fileTemp = $myFile['tmp_name'][$i];
$destination = \
move_uploaded_file($fileTemp,$destination);
break; case 1: echo \上传的某些文件超过了php.ini 中upload_max_filesize选项限制的值!
break;
\
case 2: echo \上传的某些文件超过了FORM表单MAX_FILE_SIZE选项指定的值!
break;
\
} ?>
}
case 3: echo \某些文件只有部分被上传!
\ break; case 4: echo \没有选择上传文件!
\
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.
function($var1,$var2,$var3){
$max=$var1>$var2?$var1:$var2; $max=$max>$var3?$max:$var3;
return $max; } ?>
2.答案请参考第6章最后一道习题。
3.按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
4.
通过修改php.ini配置文件的选项allow_call_time_pass_reference(默认值为Off)决定是否开启函数调用时强制参数按照引用传递。
5.
可用冒泡法进行排序。冒泡排序的基本概念是:依次比较 相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后, 如此继续,直至比较最后两个数,将小数放前,大数放后,此时第一趟结束,在最后的数必是所有数中的最大数。重复以上过程,仍从第一对数开始比较(因为可能 由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟 结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
function BubbleSort($str) {
for ($i=0;$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)); ?> 6.说明:这里使用了字符串处理函数ucwords()和explode()函数。 function convString($string){ $array = explode('_', $string); $str = \ for($k=0;$k $str = $str.ucwords($array[$k]); } return $str; } echo convString(\ ?> 7. 说明:这里使用了字符串处理函数explode()函数。 function getRelativePath($a, $b) { $returnPath = array(dirname($b)); } $arrA = explode('/', $a); $arrB = explode('/', $returnPath[0]); 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)); return implode('/', $returnPath); $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; echo getRelativePath($a, $b); ?> 第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