php复习
第1章
一、填空题
1.在Apache的bin目录下,可用于查看Apache版本的命令是“httpd -v”
2.Apache的主配置文件的文件名是httpd.f
3.Apache配置加载模块使用的指令是LoadModule
二、判断题
1.PHP是一种运行在浏览器端(服务器端)的编程语言
2.Apache的默认站点的目录是WWW(htdocs)
3.Apache监听的默认端口号是8080(80)
三、选择题
1.(状态码)不属于URL地址所包含的信息
2.“404 not found”说明请求资源不存在
四、简答题
1.简述apache和php的工作流程
① 用户在浏览器中输入要访问的地址
② Apache服务器解析用户的请求,若其后缀是“.php”,则将用户的请求交给PHP进行处理;若是静态的HTML文件、CSS和JavaScript文件则直接返回浏览器进行展示。
③ PHP程序处理Apache服务器传送过来的文件,并根据实际代码决定是否从后台读取,处理数据,最后动态地生成相应的HTML页面。
④ PHP程序将生成HTML页面返回给Apache服务器,Apache服务器再将HTML页面返回给客户端浏览器展示。
2.简述什么是虚拟主机
虚拟主机是Apache提供的一个功能,通过虚拟主机可以在一台服务器上部署多个网站。通常一台服务器的IP地址是固定的,而不同的域名可以解析到同一个IP地址上。因此,当用户通过不同的域名访问同一台服务器时,虚拟主机功能就可以使用户访问到不同的网站。
第2章
一、填空题
1.标量数据类型共有4种,分别为字符串型,整型,浮点型和布尔型
2.表达式(-5)%3的运行结果等于-2
3.注释用于在程序代码中进行解释和说明,它在程序解析时会被PHP解析器忽略。
4.使用短标记来标识PHP代码时,需要将php.ini中的short_open_tag选项设置为On。
注:php文件的正常起始和结束标记是<?php>和<?>
php中有一个<?php echo
的简写形式<?=
<?php echo"hahaha"?>就相当于是<?="hahaha"?>
php的短标记就是<? ?>
二、判断题
1.PHP中的标识符在定义时不能包含空格符号—-true
2.常量只能是固定不变的值,不能是表达式—-wrong(可以是表达式)
3.运算符“&&”和“and”都表示逻辑与,但是“and”的优先级比“&&”高—-wrong(&&的优先级更高)
4.可变变量就是把一个变量的值作为另一个变量的名称—–true
三、选择题
1.变量的命名正确的是$_name
2.语句var_dump((float)false)
的输出结果为float(0)
3.不属于赋值运算符的是”==“
4.不属于整型的表示方式的是1.759
5.可以输出数据类型的是var_dump()
四、简答题
1.php中文件包含语句以及各自异同点
PHP中文件包含语句分别为:include()、include_once()、require()、require_once()。
① 在包含文件时,如果没有找到文件,include语句会发生警告信息,程序继续运行;而require语句会发生致命错误,程序停止运行。
② 使用include语句包含文件时,只有程序执行到该语句时,才会调用被包含文件,而require语句会在程序一执行时,立刻调用被包含文件。
③ 对于include_once、require_once语句来说,与include、require的作用几乎相同,不同的是,带once的语句会先检查要导入的文件是否已经在该程序中的其他地方被调用过,如果有的话,就不会重复导入该文件,避免了同一文件被重复包含。
2.PHP中的几种跳转语句以及各自的特点
PHP中常用的跳转语句分别有break和continue,它们各自的特点具体如下。
① break语句用于终止当前循环,跳出循环体。
② continue语句用于结束本次循环的执行,开始下一轮循环的执行操作。
<?php
var_dump(0.9==(1-0.1));//bool(true)
var_dump(0.1==(1-0.9));//bool(false)
print_r(serialize(1-0.9));
print_r(serialize(1-0.1));
//d:0.09999999999999998;d:0.9;
?>
分析结果为何是bool(true),bool(false)
由于运算符“==”用于精确的比较两个数据的值,而浮点数则是不确定的约数,可以通过PHP提供的serialize()函数看出表达式“1-0.9”和“1-0.1”的真实结果,前者为“d:0.09999999999999998;”,后者结果为“d:0.9;”。因此,在比较浮点数时可以将其转化为string类型或使用round()函数进行四舍五入,防止出现“(0.1 == (1 – 0.9)”比较的结果为false的情况。
五、编程题
1.找出1到100之内的素数
<?php
for ($i = 1; $i <= 100; $i++) { // 循环1~100之间的数字
$count = 0;
for ($j = 1; $j < $i; $j++) { // 循环小于$i的所有数字
if ($i % $j == 0) { // 判断$i是否可被整除,整除$count加1
$count++; //若只有1和它本身,2个因数,则是素数
}
}
if ($count == 1) { // 计数$count为1的数字是质数
echo $i;
echo " ";
}
}
?>
2.有红,白,黑三种球,红白共25个,白黑共31个,红黑共28个,三种球各多少个?
(1)用白球来表示其他两种球的数量
<?php
for($w=0;$w<=25;$w++)
{
$r=25-$w;
$b=31-$w;
if(($r+$b)==28)
{
echo "white:".$w." red:".$r." black:".$b;
}
}
?>
(2)由题意可知,白球最多25个,红球最多也25个,黑球最多28个,然后三重for循环遍历,选出满足条件的即可
<?php
for($w=0;$w<=25;$w++)
{
for($r=0;$r<=25;$r++)
{
for($b=0;$b<=28;$b++)
{
if(($r+$w)==25 && ($w+$b)==31 && ($r+$b)==28)
{
echo "white:".$w." red:".$r." black:".$b;
}
}
}
}
?>
第3章
一、填空题
1.substr()函数用于获取字符串中的子串,则substr(‘import’,1,3)的返回值是mpo
2.函数strrpos(‘Welcome to learning PHP’,e)的返回值是12,strrpos返回的是指定字符串在目标字符串中最后一次出现的位置
二、判断题
1.函数调用时,函数的名称可以用一个变量来代替—-YES
2.在php中,定义的函数可以没有返回值—-YES
三、选择题
1.substr()可以用来截取字符串
2.用于函数返回的关键字是return
3.在函数内访问函数外定义的变量,需要使用global关键字
四、编程题
1.一只猴子第一天吃了一堆桃子的一半多一个,第二天在剩下的桃子里,又吃了一半多一个,第十天只剩下了1个,原来一共有多少个桃子?
<?php
function peach($i)
{
if($i==1)
return 1;
return 2*(peach($i-1)+1);
}
echo peach(10);
?>
2.编写计算整数4次方的函数。要求:函数的输入是一个整数,计算并输出16的4次方
<?php
function cifang($num)
{
return pow($num,4);
}
echo cifang(16);
?>
第4章
一、填空题
1.现有数组array(1,2,array('h'));
,则count($arr,1)
的返回值是4
count用于返回数组中元素的数目,加上参数1表示递归返回
2.函数array_product(array(2,9,true,5))的返回值是90
array_product用于计算数组元素的乘积
3.$str=’Hello’,str[1]是e
二、判断题
1.在数组中,键是数组元素的唯一标识—-true
2.sort函数在默认情况下,按照数组中元素的类型从低到高进行排序—-YES
三、选择题
1.不能用来操作数组的运算符是(自增‘++’)
2.可以将数组中各个元素连接成字符串的是implode函数,explode是打散
<?php
$str = "Hello world. I love Shanghai!";
print_r (explode(" ",$str));
?>
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr);
?>
3.对数组进行逆向排序的是krsort函数
4.array_merge函数可以接受多个参数,用法是把多个数组合并成一个数组
<?php
$a1=array("red","green");
$a2=array("blue","yellow");
print_r(array_merge($a1,$a2));
?>
四、编程题
创建一个长度为10的数组,数组中元素满足斐波那契数列的规律
<?php
$arr[1]=$arr[0]=1;
for($i=2;$i<10;$i++)
{
$arr[$i]=$arr[$i-1]+$arr[$i-2];
}
print_r($arr);
?>
第5章
一、填空题
1.运行PHP,遗漏分号属于语法错误
2.程序开发中,可以用trigger_error()手动触发错误
3.在php.ini中控制错误信息显示的配置是display_errors
二、判断题
1.PHP采用常量的形式来表示错误级别—-YES
2.使用exit输出的错误信息会保存到错误日志中—-WRONG(不会保存)
3.错误级别常量的值是字符串类型—-Wrong
三、选择题
1.无法修改错误报告级别的是exit()
2.php.ini中,用于控制是否记录错误日志的是log_error
四、简答题
1.php.ini中和错误相关的配置有哪些
常用的配置项分别为:error_reporting、display_errors、log_error、error_log
① error_reporting:用于设置显示错误级别
② display_errors:用于设置是否显示错误信息
③ log_error:用于设置是否记录日志
④ error_log:用于指定日志写入的文件路径
2.编写代码,实现当脚本退出时,自动执行一个回调函数
PHP提供的内置函数register_shutdown_function(),用于注册一个会在php中止时执行的函数。
<?php
$clean = false; // 脚本是否正常中止的标识,开始标识
function shutdown() // 自定义脚本退出时自动执行的回调函数
{
global $clean;
echo $clean ? '脚本结束':'遇到错误';
}
// 将shutdown()注册成一个在php中止时执行的函数
register_shutdown_function('shutdown');
error_reporting(~E_ALL); // 不显示任何错误
display();
$clean = true; // 脚本是否正常中止的标识,结束标识
?>
第7章
一、填空题
1.HTTP请求消息是由请求行,请求头和实体内容三部分组成。
2.在URL参数中,多个参数之间使用“&”符号连接
3.去除字符串中的HTML和PHP标签的函数是strip_tags() 函数
二、判断题
1.响应的状态码200表示被请求的缓存文档未修改—-wrong
2.URL参数中含有中文时,需要编码处理后才能使用—-wrong
3.GET提交方式是将URL参数作为实体内容发送的—-wrong
三、选择题
1.不属于消息头中可以包含的内容是(实体数据)
2.响应头位于响应状态行的后面(题中为前面错误)
四、简答题
1.概括http协议的主要特点
① 支持主流软件架构:支持B/S、C/S软件架构。
② 简单快速:客户端向服务器请求服务时,只需传送请求方式和路径即可。常用的请求方式有GET、POST等,每种方式规定了客户端与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
③ 灵活:HTTP允许传输任意类型的数据,传输的数据类型由Content-Type加以标记。
除此之外,由于HTTP是无状态协议,因此若后续处理需要前面的信息,则必须重新传递,这样可能导致每次连接传送的数据量增大,这是在程序开发中需要注意的地方。
2.GET与POST提交方式的区别
① POST方式通过实体内容传递数据,传输数据大小理论上没有限制(但服务器端会进行限制)。而GET方式通过URL参数传递数据,受限于URL的长度,通常不超过1KB。
② POST比GET请求方式更安全。GET方式的参数信息会在URL中直接显示,而POST方式传递的参数隐藏在实体内容中,因此POST比GET请求方式更安全。
第8章
一、填空题
1.数据库管理系统的简称为DBMS
2.数据表中的每一行内容被称为记录
3.PHP操作MySQL数据库的扩展有MYSQL扩展、MySQLi扩展和PDO扩展
二、判断题
1.PDO扩展只可以操作MySQL数据库—-NO
2.3306是MySQL的默认端口号—-YES
3.primary key可以唯一标识表中的某一条记录—-YES
三、选择题
1.可以用于代替SQL语句模板中数据部分的符号是“?”
2.mysqli_fetch_array()函数默认返回的数组形式是MYSQLI_BOTH
3.将所有数据都存储在内存中的存储引擎是MEMORY
四、编程题
1.mysql端口3307,ip:156.53.62.15,用户名php,密码123456,数据库名为data,使用MySQLi扩展函数编写程序,实现输出data数据库中所有数据表的功能。
<?php
$link = @mysqli_connect('156.53.62.15', 'php', '123456', 'data', 3307)
or exit('连接失败');
// 设置字符集
mysqli_set_charset($link, 'utf8');
// 执行SQL语句
$result = mysqli_query($link, 'SHOW TABLES');
// 处理结果集
$tables = mysqli_fetch_all($result, MYSQLI_ASSOC);
// 输出data数据库中的所有数据表
print_r($tables);
// 关闭数据库连接
mysqli_close($link);
?>
2.假设MySQL数据库安装在本地服务器上,数据库名称是test,数据库在默认端口上运行,用户名root,密码111111
<?php
$link = @mysqli_connect('127.0.0.1', 'root', '111111', 'test', 3306)or exit('连接失败');
mysqli_set_charset($link, 'utf8');
// 预处理SQL模板
$stmt = mysqli_prepare($link, 'INSERT INTO `stu`(`id`,`name`,`gender`) VALUES(?,?,?)');
// 参数绑定(将变量$id、$name、$gender按顺序绑定到SQL语句“?”占位符上)
mysqli_stmt_bind_param($stmt, 'iss', $id, $name, $gender);
// 准备插入的数据
$data = [
['id' => 1, 'name' => '张三', 'gender' => '男'],
['id' => 2, 'name' => '谢七', 'gender' => '女']
];
foreach ($data as $v) {
$id = $v['id']; // 分别为绑定的变量赋值
$name = $v['name']; // 分别为绑定的变量赋值
?>
第10章
一、填空题
1.在正则表达式中,\b用于匹配单词边界、\B用于匹配非单词边界
2.正则表达式中“()”既可以用于分组,又可以用于改变限定符的作用范围
3.preg_match_all(‘/H.*?i/’,’Hi Hi Hi Hi’)的返回值是4
二、判断题
1.PCRE是兼容Perl正则表达式的一套正则引擎—-True
2.”[a-z]”和”[z-a]“表达的含义相同—-Wrong([z-a]是不合法的)
3.preg_match_all()的返回值是正则匹配的总次数—-True
4.[^a]的含义是匹配以a开始的字符串—-Wrong(不包含a的字符串)
三、选择题
1.[e][i]匹配字符串“Beijing”的结果是“ei”
2.正则表达式中,与“*”功能相同的是“ {0,} ”
3.可以完成正则表达式中特殊字符转义的是“ \ ”
第11章
一、填空题
1.使用fopen()函数打开文件后,返回值是资源(resource)数据类型
2.file_put_contents()函数要实现追加写入,第3个参数应设为FIFE_APPEND
3.要禁止fopen函数打开远程文件,可以用php.ini中的allow_url_fopen配置项来禁止
二、判断题
1.在linux中,路径分隔符使用的是”/”—-True
2.file_get_contents()支持访问远程文件—-True
3.php.ini的open_basedir无法限制move_upload_file函数—-Wrong
三、选择题
1.php用于判断文件是否存在的函数—-file_exists();
2.fileatime()函数能够获取文件的上次访问时间属性
四、编程题
1.利用PHP远程下载指定URL的文件
<?php
// 远程URL地址
$url = "http://www.itheima.com";
// 获取远程文件内容
$data = file_get_contents($url);
// 将远程文件存储到本地的一个地址中
file_put_contents('./test.txt', $data);
?>
2.利用PHP导出一个数据表中的记录,保存为SQL文件
创建func.php文件,编写函数sqlFile(),数据库的连接等基本操作
/**
* 导出一个数据表中的记录,保存为SQL文件
* @param string $database 数据库名称
* @param string $table 数据表名称
* @param string $save SQL文件保存路径
* @param string $host 主机名称(数据库)
* @param string $user 用户名(数据库)
* @param string $pwd 密码(数据库)
* @param string $port 端口号(数据库)
*/
function sqlFile($database, $table, $save = './', $host = 'localhost', $user = 'root', $pwd = '123456', $port = '3306')
{
// 连接数据库
$link = @mysqli_connect($host, $user, $pwd, $database, $port) or exit('连接失败');
// 设置字符集
mysqli_set_charset($link, 'utf8');
……
}
继续编辑函数sqlFile(),完成数据的获取
// 执行SQL语句
$strres = mysqli_query($link, "SHOW CREATE TABLE $table");
$datares = mysqli_query($link, "SELECT * FROM $table");
// 处理结果集
$structure = mysqli_fetch_all($strres, MYSQLI_ASSOC);
$datas = mysqli_fetch_all($datares, MYSQLI_ASSOC);
// 获取数据表的字段,并为每个字段添加`号包裹
$fields = array_keys($datas[0]);
foreach ($fields as &$v) {
$v = "`$v`";
}
$fields = implode(',', $fields);
// 拼接转存数据的SQL语句
$insert = "INSERT INTO `$table` ($fields) VALUES ";
foreach ($datas as $value) {
foreach ($value as &$v) {
$v = mysqli_real_escape_string($link, $v);
}
$insert .= "(" . implode(',', $value) . "),";
}
// 将INSERT语句中最后一个逗号替换成分号
$insert = substr_replace($insert, ';', strrpos($insert, ','), 1);
mysqli_close($link); // 关闭数据库连接
继续编辑函数sqlFile(),完成字符串的拼接。
// 拼接字符串
$str = <<<EOD
--
-- Database: `$database`
--
-- --------------------------------------------------------
--
-- 表的结构 `$table`
--
EOD;
// 拼接表结构
$str .= $structure[0]['Create Table'];
// 拼接转存数据
$str .= <<<EOD
-- --------------------------------------------------------
--
-- 转存表中的数据 `$table`
--
EOD;
$str .= $insert;
继续编辑函数sqlFile(),用于将制定数据库下的数据表的记录保存到SQL文件中
$filename = $table . '.sql'; // 拼接SQL文件名称
$filepath = $save . $filename; // 拼接SQL文件保存路径
file_put_contents($filepath, $str); // 将获取的数据保存到SQL文件中
编写test.php文件,引入验证测试
require 'func.php';
sqlFile('itheima', 'stu');
在浏览器执行完成后,会在test.php所在的目录下生成一个与表名称相同的SQL文件stu.sql,打开后可以看到此表的结构和转存的数据。
第12章
一、填空题
1、想开启GD库,需要打开php.ini,将;extension=php_gd2.dll中的“;”删除
2.给图片添加水印的目的就是防止图片被盗用
3.imagecopymerge()函数的最后一个参数用于设置水印的透明度,其取值范围是0-100
二、判断题
1.GIF和JPEG都是无损压缩格式—-Wrong,(JPEG是有损压缩)
2.PHP中所有处理图像的函数都需要安装GD库后才能使用—-Wrong
3.函数imageellipse()函数可以绘制正圆和填充图像的颜色—-Wrong
4.函数imagettftext()可以在画布上绘制文本和&等特殊字符—-True
5.函数imageellipse()函数可以绘制一段圆弧—-Wrong
三、选择题
1.关于图片添加水印的说法错误的是(PHP中有且仅有imagecopy()函数能实现为图片添加水印功能)
2.可以实现添加半透明水印的函数是imagecopymerge()函数
3.imagettftext()函数支持的编码类型是utf-8。
四、编程题
编辑captcha.php文件,封装captcha()函数,首先创建画布并为其设置背景色。
/**
* 生成验证码
* @param int $w 验证码图片的宽度
* @param int $h 验证码图片的高度
* @param int $len 验证码码值的长度
* @param int $font 验证码字体大小
*/
function captcha($w = 140, $h = 45, $len = 5, $font = 5)
{
$img = imageCreateTrueColor($w, $h); // 生成画布
$bg_color = imageColorAllocate($img, 0xcc, 0xcc, 0xcc); // 生成背景颜色
imageFill($img, 0, 0, $bg_color); // 设置背景色
……
}
继续编辑captcha()函数,完成干扰元素(点和线)的绘制
// 绘制干扰像素(点)
for ($i = 0; $i <= 200; ++$i) {
$color = imageColorAllocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imageSetPixel($img, mt_rand(0, $w), mt_rand(0, $h), $color);
}
// 绘制干扰线
for ($i = 0; $i <= 8; ++$i) {
$color = imageColorAllocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imageline($img, mt_rand(0, $w), mt_rand(0, $h), mt_rand(0, $w), mt_rand(0, $h), $color);
}
继续编辑captcha()函数,完成验证码图片边框的绘制。
// 绘制矩形边框
$rect_color = imageColorAllocate($img, 0x90, 0x90, 0x90);
imageRectangle($img, 0, 0, $w - 1, $h - 1, $rect_color);
继续编辑captcha()函数,完成验证码码值的获取以及颜色、大小等相关计算。
// 生成码值数组,不需要0,避免与字母o冲突
$char = array_merge(range('A', 'Z'), range('a', 'z'), range(1, 9));
//随机获取$len个码值的键,并保证是数组
$rand_keys = (array) array_rand($char, $len);
// 打乱随机获取的码值键的数组
shuffle($rand_keys);
//根据键获取对应的码值,并拼接成字符串
$code = '';
foreach ($rand_keys as $key) {
$code .= $char[$key];
}
//设定字符串颜色
$str_color = imageColorAllocate($img, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
//设定字符串位置
$font_w = imageFontWidth($font); // 字体宽
$font_h = imageFontHeight($font); // 字体高
$str_w = $font_w * $len; // 字符串宽
最后继续编辑captcha()函数,完成验证码的绘制及输出。
imagestring($img, $font, ($w - $str_w) / 2, ($h - $font_h) / 2, $code, $str_color);
header('Content-Type: image/png');
imagepng($img); // 输出图片内容
imagedestroy($img); // 销毁画布
完成上述函数的封装后,即可在test.php文件中,引入该文件并调用captcha()函数,即可在浏览器中查看到生成的验证码图片。
需要注意的是,在开发中为了验证用户输入的验证码是否正确,在获取到验证码码值后会将该值保持到SESSION中。
第14章
一、填空题
1.在PHP中可以通过abstract声明抽象类
2.在PHP中,实现接口使用implements关键字
3.在调用未定义过的方法时被调用的魔术方法是__call()
二、判断题
1.抽象方法的修饰符可以是private类型—-Wrong
2.函数的参数类型可以指定为接口—-True
3.在类中可以使用self关键字表示当前的对象—-True
4.类中的private成员与其他成员之间是可见的—-True
三、选择题
1.PHP中默认访问权限修饰符是public
2.可以在子类中调用父类中成员方法的是parent
四、编程题
完成MySQL数据库类的封装。要求实现数据库对象的单例模式,并可以执行基本的SQL操作
编写Db.class.php文件,创建Db类,用于完成MySQL数据库的基本操作。
class Db {
protected static $db = null; // 保存mysqli实例
private static $config = [ // 保存mysqli连接的参数
'host' => 'localhost',
'user' => 'root',
'pwd' => '123456',
'dbname' => 'itheima',
'port' => '3306',
'charset' => 'utf8'
];
}
继续编辑Db类, 实现mysqli实例的单例模式
// 构造方法
public function __construct(array $config = [])
{
$c = array_merge(self::$config, $config);// 若用户未传递参数则使用默认值
self::$db || self::connect($c); // 若未实例化mysqli对象,则进行实例化
}
// 阻止克隆
private function __clone(){}
// 连接目标服务器
private static function connect($c)
{
try {
// 实例化msyqli
self::$db = new mysqli($c['host'], $c['user'], $c['pwd'], $c['dbname'],$c['port']);
} catch (mysqli_sql_exception $e) {
exit('数据库连接失败');
}
self::$db->set_charset($c['charset']); // 设置字符集
}
继续编辑Db类,利用预处理的方式完成SQL语句的执行
/**
* 执行SQL语句
* @param string $sql SQL语句
* @param string $type 参数绑定的数据类型(i、d、s、b)
* @param array $data 参数绑定的数据(支持二维数组批量处理)
* @return mysqli_stmt
*/
public function query($sql, $type = '', array $data = [])
{
// 预处理SQL语句
if (!$stmt = self::$db->prepare($sql)) {
exit("SQL[$sql]预处理失败:" . self::$db->error);
}
// 参数绑定
if ($data) {
$data = is_array(current($data)) ? $data : [$data];
$params = array_shift($data);
$args = [$type];
foreach ($params as &$args[])
;
call_user_func_array([$stmt, 'bind_param'], $args);
}
// 执行预处理SQL语句
if (!$stmt->execute()) {
exit('数据库操作失败:' . $stmt->error);
}
foreach ($data as $row) {
foreach ($row as $k => $v) {
$params[$k] = $v;
}
if (!$stmt->execute()) {
exit('数据库操作失败:' . $stmt->error);
}
}
return $stmt;
}
继续编辑Db类,获取插入的id或受影响的行数。
public function exec($sql, $type = '', array $data = [])
{
$stmt = $this->query($sql, $type, $data);
return (strtoupper(substr(trim($sql), 0, 6)) == 'INSERT') ? $stmt->insert_id : $stmt->affected_rows;
}
继续编辑Db类,根据需求获取一行结果或全部的查询结果。
public function fetchAll($sql, $type = '', array $data = [])
{
$stmt = $this->query($sql, $type, $data);
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}
public function fetchRow($sql, $type = '', array $data = [])
{
$stmt = $this->query($sql, $type, $data);
return $stmt->get_result()->fetch_assoc();
}
验证测试,编写test.php文件,引入Db.class.php,完成数据的增删改查。
require 'Db.class.php';
$db = new Db(); // 实例化数据库类
// ① 增加一条数据
$data1 =['name'=>'A','gender'=>'男'];
// 输出插入数据的id:1
echo $db->exec('INSERT INTO `student`(`name`,`gender`)VALUES(?,?)','ss',$data1);
// ② 增加多条数据
$data2 =[['name'=>'B','gender'=>'男'],['name'=>'C','gender'=>'男']];
$db->query('INSERT INTO `student`(`name`,`gender`)VALUES(?,?)','ss',$data2);
// ③ 查询所有记录
$res = $db->fetchAll('SELECT `name`,`gender` FROM `student`');
// 查询结果:Array ( [0] => Array ( [name] => A [gender] => 男 ) [1] => Array ( ...... ) ...... )
print_r($res);
// ④ 将id=3的记录名字修改为Tom
$db->query('UPDATE `student` SET `name`=? WHERE `id`=? ','si',['Tom',3]);
// ⑤ 查询id=3的记录
$one_res = $db->fetchRow('SELECT `name`,`gender` FROM `student` WHERE `id`=?','i',[3]);
// 查询结果:Array ( [name] => Tom [gender] => 男 )
print_r($one_res );
// ⑥ 删除性别为男的记录,并输出受影响的行数:3
echo $db->exec('DELETE FROM `student` WHERE `gender`=?','s',['男']);
第15章
一、填空题
1.通过javascript代码来盗取网站用户Cookie的方式,称之为XSS攻击
2.函数setcookie(‘data’,’PHP’,time()+1800)表示Cookie在1800秒后过期
二、判断题
1.会话技术可以实现跟踪和记录用户在网站中的活动—-True
2.$_COOKIE可以完成添加、读取或修改Cookie中的数据—False
3.在PHP中,只能通过函数session_start()启动Session—-False
4.session_destory()函数可以同时删除Session数据和文件—-False
5.Cookie的有效范围在默认情况下是整站有效的—-True
三、选择题
1.第一次创建cookie时,服务器会在响应消息中增加Set_Cookie头字段,并将信息发送给浏览器。
2.可以实现自动开启session的是session.auto_start
四、补充题目
1.什么是会话技术?
会话技术是一种维持同一个浏览器和服务器之间多次请求数据状态的技术,它可以很容易地实现对用户登录的支持,记录该用户的行为,并根据授权级别和个人喜好显示相应的内容。
Cookie指的是一种在浏览器端存储数据并以此来跟踪和识别用户的机制。
Session指的是将信息存放在服务器端的会话技术
2.Cookie的工作原理
当用户第一次访问服务器时,服务器会在响应消息中增加Set_Cookie头字段,将信息以Cookie的形式发送给浏览器,一旦用户接收了服务器发送的Cookie信息,就会将它保存到浏览器中的缓冲区中。这样,当浏览器后续访问该服务器时,都会将信息以Cookie的形式发送给服务器,从而使服务器分辨出当前请求是由哪个用户发出的。
3.Session的工作原理
(1)用户第一次请求服务器时,服务器端会生成一个sessionid
(2)服务器端将生成的sessionid返回给客户端,通过set-cookie
(3)客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
(4)当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid,不存在就新建一个sessionid重复1,2的流程,如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息
(5)此后的请求都会交换这个 Session ID,进行有状态的会话