php复习题

1.Cookie和Session的区别和联系
区别:1. session存储数据在服务器端,Cookie在客户端2. session没有数据大小限制,Cookie有3. session数据安全,Cookie相对于不安全4.Cookie只能存放字符串。Session还可以存放对象等其他类型。
联系:1.cookie对象和session对象一样是用来保存特定的用户相关的数据2、通过cookie/session的名称来区分不同的cookie/session3、有生命周期,cookie最大可设置为50年,session默认周期为20分
2.php数组定义:
在 PHP 中,array() 函数用于创建数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
PHP 中的数组实际上是一个有序映射

()$array=array(‘value1’,’value2’,)  
()$array[key]=’value’
(三)$array=array(key1=>value1,key2=>value2,) 

其中,key是数组元素的下表,value是下表所对应的元素,声明数组后,数组中的元素个数可以自由更改,只要给数组赋值,数组就会自动增加长度
Count()函数计算数组的长度。
function 是PHP 的关键字,用于完成函数的定义函数名,避开PHP 关键字,命名规则与变量的命名规则相同。形参,给函数传递参数用的。函数体,执行函数功能的部分。返回值,返回给调用者,默认返回NULL
Sql注入及解决方法
SQL注入产生的原因是由于某些特殊字符打乱了SQL语句本身的逻辑,使数据库服务器引擎错误的执行了某些SQL语句。有2种解决方案:1.当配置文件php.ini中的magic_quotes_gpc选项设置为关闭时,使用addslashes()函数将GET或POST提交方式提交的特殊字符转义。2. 当配置文件php.ini中的magic_quotes_gpc选项设置为开启时,PHP预处理器会自动将GET或POST提交方式提交的特殊字符转义。
单双引号指定字符串区别:
使用双引号指定的字符串中若出现变量名(以 开 头 ) , 变 量 名 会 被 替 换 成 对 应 的 变 量 值 ; 使 用 单 引 号 指 定 的 字 符 串 则 不 会 。 这 是 使 用 单 引 号 和 双 引 号 指 定 字 符 串 的 主 要 区 别 。 双 引 号 指 定 字 符 串 的 特 点 " " 双 引 号 里 面 的 字 段 会 经 过 编 译 器 解 释 , 然 后 再 当 作 H T M L 代 码 输 出 。 ∗ ∗ 单 双 引 号 指 定 字 符 串 的 特 点 : ∗ ∗ 单 引 号 代 表 纯 字 符 串 , 不 论 里 面 有 什 么 东 西 都 当 字 符 串 处 理 双 引 号 代 表 可 以 处 理 的 字 符 串 , 如 果 字 符 串 中 有 变 量 会 优 先 解 析 变 量 , 之 后 再 按 照 正 常 的 字 符 串 进 行 处 理 单 引 号 的 速 度 > 双 引 号 的 速 度 , 因 为 不 用 解 析 变 量 函 数 的 定 义 : f u n c t i o n 函 数 名 ( 参 数 ) 函 数 体 r e t u r n 返 回 值 d e f a u l t 语 句 用 于 不 存 在 匹 配 ( 即 没 有 c a s e 为 真 ) 时 执 行 。 创 建 数 组 时 数 组 键 为 小 数 使 用 带 小 数 点 的 数 字 作 为 键 名 时 , 键 名 会 自 动 截 取 整 数 部 分 作 为 键 名 。 如 开头),变量名会被替换成对应的变量值;使用单引号指定的字符串则不会。这是使用单引号和双引号指定字符串的主要区别。 双引号指定字符串的特点 " "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。 **单双引号指定字符串的特点:** 单引号代表纯字符串,不论里面有什么东西都当字符串处理 双引号代表可以处理的字符串,如果字符串中有变量会优先解析变量,之后再按照正常的字符串进行处理 单引号的速度 > 双引号的速度,因为不用解析变量 函数的定义: function 函数名(参数){ 函数体 return 返回值 } default 语句用于不存在匹配(即没有 case 为真)时执行。 创建数组时数组键为小数 使用带小数点的数字作为键名时,键名会自动截取整数部分作为键名。如 使使""HTML西>functionreturndefaultcase使arr[123.45]=5,你使用 a r r [ 123.45 ] 或 arr[123.45]或 arr[123.45]arr[123]均可以取得键值;用foreach遍历时,使用的是$arr[123]。数组中键名的数据类型为整数或字符串型
static关键字使用
php中除了常规类和方法的使用,访问控制之外,还有静态关键字static,静态变量可以是局部变量也可以是全局变量,当一个程序段执行完毕时,静态变量并没有消失,它依然存在于内存中,下次在定义时还是以前的值,常用于递归或子函数中保留之前的值,可以用来定义变量和方法,
逻辑运算时短路现象
or、||、and、&& 都是短路运算符
&&(and)短路与运算符检查第一个表达式是否返回“flase”,如果是“false”则结束语句并返回“false”,否则检查第二个表达式。
|| (or)短路或运算符检查第一个表达式是否返回“true”,如果是“true”则结束语句并返回“true”,否则检查第二个表达式。
strlen函数
strlen()函数返回字符串的长度(字节数)。如果成功则返回字符串的长度,如果字符串为空则返回 0。中文字符串的处理使用mb_strlen()函数。

综合

add.php

<html>
   <head>
      <meta charset="utf-8">
      <title>添加学生</title>
   </head>
   <body>
   <br>
  <h1 align="center">添加学生</h1>
  <br>
    <div style="width: 100%;text-align: center;">
        <form name="input" method="POST">
       <h3>学号:</h3><input type="text" name="stu_id">
       <h3>成绩:</h3> <input type="text" name="grade">
      <br>
      <input type="submit" value="确定">
      </form>
        </div>
<?php
header("content-type:text/html;charset=utf8");
$conn=mysqli_connect("localhost","root","123456","students");
mysqli_set_charset($conn,"utf8");
$stu_id=$_POST['stu_id'];
$grade=$_POST['grade'];
$sql="insert into score(stu_id,grade) values('$stu_id','$grade')";
$row=mysqli_query($conn,$sql);
if($row>0)
{
echo "<script>alert('添加成功');</script>";
}
else
{
echo "<script>alert('添加失败');</script>";
}
?>
</body>
</html> 
View.php
<!DOCTYPE html>
<html>
     <head>
       <meta charset="utf-8">
</head>
<body>
<h3>学生信息显示</h3>
<table class="lala" width="350" border="1" cellspacing="0">
 <tr>
  <th>ID</th>
   <th>学生姓名</th>
   <th>学号</th>
   <th>成绩</th>
    </tr>
<?php
header("content-type:text/html;charset=utf8");
$conn=mysqli_connect("localhost","root","123456","students");
mysqli_set_charset($conn,"utf8");
$sql_select="SELECT * FROM score";
foreach($conn->query($sql_select)as $row)//遍历
{
echo "<tr>";
echo "<th>{$row['id']}";
echo "<th>{$row['name']}";
echo "<th>{$row['stu_id']}";
echo "<th>{$row['grade']}";
echo "<td>";
echo "</tr>";
}
?>
</table>
</body>
</html>

1.简单说明PHP程序运行过程中,PHP预处理器、Web服务器和数据库服务器各自的功能,并简单描述PHP程序的工作流程。
PHP预处理器的功能是将PHP程序中PHP代码解释为文本信息,这些文本信息中可以包含HTML代码。
Web服务器主要提供两个功能:
(1)存储大量的网络资源以供浏览器用户访问。(2)处理HTTP请求。
数据库服务器为客户应用程序提供数据服务。数据库服务器建立在数据库系统基础上,具有数据库系统的特性,且有其独特的—面。主要功能如下:
数据库管理功能,包括系统配置与管理、数据存取与更新管理、数据完整性管理和数据安全性管理。
数据库的查询和操纵功能 ,该功能包括数据库检索和修改。
数据库维护功能,包括数据导入/导出管理,数据库结构维护、数据恢复功能和性能监测。
数据库并行运行,由于在同一时间,访问数据库的用户不止一个,所以数据库服务器必须支持并行运行机制,处理多个事件的同时发生。
PHP程序的工作流程:
1.用户在浏览器地址栏中输入要访问的页面地址,按回车键后就会触发该页面请求,并将请求传送给Web服务器。
2.Web服务器接收到该请求后,根据请求页面文件名在Web服务器主机中查找对应的页面文件,并根据请求页面文件名的扩展名(如.html或.php)判断当前HTTP请求为静态页面请求还是动态页面请求。
(1)当请求页面为静态页面时(如请求页面文件扩展名为.html或.htm),Web服务器直接将请求页面返回,并将该页面作为响应发送给浏览器。
(2)当请求页面为动态页面时(如请求页面文件扩展名为.php),此时Web服务器委托PHP预处理器将该动态页面中的PHP代码解释为文本信息;如果动态页面中存在数据库操作代码,PHP预处理器和数据库服务器完成信息交互后,再将动态页面解释为静态页面;最后Web服务器将该静态页面作为响应发送给浏览器。
3.浏览器接收到Web服务器的HTTP响应后,将执行结果显示在浏览器或由浏览器进行其
他处理。
2.列举常见的Web服务器和数据库服务器。
常用的Web服务器软件有微软公司的Internet Information Server(IIS)服务器软件、IBM公司的WebSphere服务器软件以及开源的Apache服务器软件等。
数据库服务器:安装有数据库管理系统软件的计算机称为数据库服务器。
典型的数据库管理系统有美国甲骨文公司的Oracle和MySQL、美国微软公司的SQL Server、德国SAP公司的Sybase以及美国IBM公司的DB2和Informix。
3.列举动态网页程序设计语言。PHP、JSP、.NET、ASP等
4.如果下面的PHP语句打印出前一天的时间(格式是YYYY/MM/DD HH:II:SS):
date_default_timezone_set(‘PRC&’); //设置中国时区
echo date (“Y/m/d H:i:s”, time()-24*3600); //打印前一天的时间
编写程序tomorrow.php打印明天的时间(格式是YYYY-MM-DD HH:II:SS),并说明 date()函数的参数中Y、y、m、M、d、D、H、h、i、s的含义以及time()函数的功能。

<?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服务器的配置文件名、MySQL服务器的配置文件名以及PHP预处理器配置文件名分别是什么?WampServer采用默认方式安装成功后,这些配置文件放在哪个目录下?
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. Apache服务器的配置有哪些?MySQL服务器以及PHP预处理器的配置有哪些?
设置允许外网访问Apache服务、修改Apache服务端口号。
MySQL服务器:
PHP时区设置、short_open_tag=On:表示允许使用“<?”和“?>”作为PHP的开始标记和结束标记、output_buffering=On:表示允许使用页面缓存、display_errors=On:表示打开错误提示。在调试程序时经常使用。
7.PHP的开始标记与结束标记有哪些?使用时有何注意事项?
开始标记“<?php”和结束标记”?>”、<scrip language=”php”和“”任何情况下都可以
”<?”和”?>”必须将php.ini配置文件中的选项short_open_tag设置为On
“<%”和”%>“必须将php.ini配置文件中的选项asp_tag设置为On
8.PHP的注释种类有哪些?这些注释在何种场合下使用?如何进行HTML注释?
/多行注释风格/、//单行注释风格、#单行注释风格
HTML代码注释的内容以“<!—“开始,以”–>”结束,且HTML代码注释仅在静态文本中有效。
9.PHP的数据类型有哪些?每种数据类型适用于哪种应用场合?
PHP数据类型分为4种:标量数据类型(布尔型、整形、浮点型和字符串型)、复合数据类型(数组和对象)、特殊数据类型(资源数据类型:用于表示一个PHP的外部资源,如一个数据库的连接或者一个文件流等和空数据类型:用来标识一个不确定或不存在的数据)和伪类型(通常在函数的定义中使用)。
PHP数组中各元素中的键既可以是整数,又可以是浮点数,还可以是字符串。各元素的值既可以是标量数据类型数据,也可以是复合数据类型数据(如数组、对象)。在PHP中数组是动态的,在定义数组时不必指定数组的长度。
布尔型主要用于逻辑判断,整型和浮点型主要用于算术运算,字符串主要用于文字性描述,数组实际上是用于容纳若干变量的容器。当使用面向对象编程思想时,需要使用对象描述事物(属性及方法)。
10.Echo语句和print语句有何区别和联系?print_r实现什么功能?
echo与print共同点:它们都不是真正的函数,是一种语法结构,因为语句没有返回值,函数可以有返回值(即便没有用)(也有说print是函数,echo不是)。
echo和 print后面都可不用加(),如: echo ‘ok’; print ‘ok’;
运行速度echo稍快一些,因为echo并不返回值,print只允许输出一个字符串返回一个值 int(1)。(返回值总为1)
echo 与 print区别:
一般用echo,除非三元运算时。 a = 5 ; ( a=5; ( a=5;(a==5) ? print ‘5’: print 0;
print只能有一个参数,所以不能不能用”,",而echo可以。
echo:输出一个或者多个字符串(多个字符串之前使用逗号隔开即可);
在echo前不能使用错误抑制运算符“@”
print()也可以看作是一个有返回值的函数,此时print能作为表达式的一部分,而echo不能。
print_r是递归打印,主要用于打印复杂类型变量的值(如数组,对象)
11.编码规范有哪些?
书写规范:1.缩进2.大括号3.运算符(每个运算符与两边参与运算的值或表达式中间要有一个空格,唯一的特例是字符串连接运算符号两边不加空格)
命名规范:1.类(类名每一个单词首字母大写)2.常量(常量名所有字母大写,单词间用下划线分隔)3.变量(第一个单词首字母小写,其余单词首字母大写(驼峰);单词所有字母小写,单词间用下划线分隔)4.数组(尽量使用单词的复数形式)5.函数6.数据库命名7.类文件
12.从功能的角度描述完整的PHP程序由几部分组成,并描述各部分的实现技术。
从功能的角度,完整的PHP程序可以划分为3个组成部分:数据的采集、数据的处理和数据的输出,其中PHP的数据采集主要包括3个过程:浏览器端的数据采集、浏览器端数据的提交。
PHP程序的数据采集,浏览器用户访问注册页面(如register.html),register.html页面为浏览器用户提供一个图形界面(如FORM注册表单)采集用户的数据。浏览器用户在FORM表单中输入个人信息,单击FORM注册表单的“提交”按钮后,浏览器负责将用户信息提交到Web服务器某个动态页面(如register.php程序)。register.php程序负责采集浏览器端的用户信息,再对采集到的用户信息进行数据处理,并将处理结果输出,告知浏览器用户处理结果。
13.如何使用下面的Test类,Test类提供的get_test()函数能实现什么功能?

<?php class Test { function get_test($num){ $num=md5(md5($num)); return $num; ?> <?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加密结果:d9bld7db4cd6e70935368a1efb10e377 ?>

14.如果用“+“操作符把一个字符串和一个整形数字相加,字符串将被转换成数字再与整型数字相加。
逻辑异或(xor)运算符操作符在两个操作数中有一个(不是全部)为TRUE时返回TRUE。
全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回False。
15. isset( s t r ) 用 于 测 试 变 量 是 否 设 置 ( 或 者 存 在 ) , e m p t y ( str)用于测试变量是否设置(或者存在),empty( str))empty(str)用于测试变量是否为空。检测变量是否为空使用is_null()和empty()函数。is_null()和 empty()函数的区别请参考下面的程序:

<?php $a = 0; var_dump(empty($a));/输出: bool(true) echo "
"; var_dump(is_null($a));/输出: bool(false) ?>

16.PHP垃圾回收机制是基于引用计数机制的垃圾回收,当一个变量的引用计数变为0时,PHP将在内存中销毁这个变量,此时启动垃圾回收机制。当一个变量被初始化或者赋值给另一个变量时引用计数会加1,当变量或者被赋值的变量被销毁或者被侦测到无用时引用计数会减一,当垃圾收集的进程运行时会释放掉引用计数为0的那些变量会被从内存中释放(垃圾回收期间程序会被中断)。当脚本执行完成时所有资源都会被释放。
17.PHP中传值与传引用的区别。什么时候传值?什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
区别:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。
18.给出三个数,写程序求出3个数中的最大值
$var1 = 1;
$var2 = 7;
$var3 = 8;
答:<?php
$var1 = 1;
$var2 = 7;
$var3 = 8;
m a x = max= max=var1> v a r 2 ? var2? var2?var1:$var2;
m a x = max= max=max>Svar3? m a x : max: max:var3;
echo $max;
?>
19.die语句结构等价于exit语句结构
20.current()函数是取得当前指针所指向元素的值
数组的键可以是字符串。
asort()函数能在保留原有索引关系的前提下进行升序排序。rsort()和 array_reverse()能把数组逆向排序。
array_flip()只能把数组中每个元素的键和值进行交换。

简答题(写出程序运行结果)
break语句:当break在switch语句中使用时,它会使程序跳出当前的switch语句。break语句还可以使用在for、while或do…while循环语句中,使得程序跳出当前循环结构。Break可以接受一个可选的数字参数来决定跳出几重循环,这种功能一般在多重循环中使用。

switch语句的语法格式:
switch(表达式){
case 值1:
语句块1
break;
case值2:
语句块2
break;

default:
语句块n;
}
功能:当程序执行碰到switch语句时,它会计算表达式的值(该表达式的值不能为数组或对象),然后与switch语句中case子句所列出的值逐一进行“==”比较(两个等号的比较),如有匹配,那么case子句相连的语句块将被执行,直到遇到break语句时才跳离当前的switch语句;如果没有匹配,default语句将被执行(default语句在switch语句中不是必需的)。

创建数组时:如果数组元素中的“键“是一个浮点数,则”键“将被强制转换为整数;
如果“键“是TRUE或FALSE,则”键“将被强制转换为整数1或0。

static关键字使用:函数体内的变量能够从这次调用一直存活到下次调用,需要在该变量前加上static关键字。Static关键字一般在函数定义中使用,用于修饰局部变量。
用来定义静态方法及属性,在类中可用来延迟静态绑定以及在函数中修饰变量。
借助静态变量可以实现递归函数。递归函数是一种调用自身的函数,为了防止递归函数无休止地“调用”自身,必须为递归函数提供一个函数出口,这个出口可以使用静态变量实现。

逻辑运算时短路现象:当逻辑表达式中后一部分的取值不会影响整个表达式的值时,为了提高程序效率,后一部分将不会进行任何数据运算。

foreach遍历数组:
数组遍历语言结构:PHP引入了遍历数组更为简单、快捷的方法:foreach语言结构。
foreach语言结构有以下两种用法。
1.foreach(array as v a l u e ) 使 用 该 方 法 循 环 遍 历 给 定 的 数 组 a r r a y , 每 次 循 环 中 , “ 当 前 指 针 ” 所 指 元 素 的 “ 值 ” 赋 给 变 量 value) 使用该方法循环遍历给定的数组array,每次循环中,“当前指针”所指元素的“值”赋给变量 value)使array,value,然后移动数组array“当前指针”,使“当前指针”指向下一个元素,周而复始,直至数组array最后一个元素,此时“当前指针”为空。
2.foreach(array as k e y = > key=> key=>value)
使用该方法循环遍历给定的数组array,每次循环中,“当前指针”所指元素的“键”名赋给变量 k e y , “ 当 前 指 针 ” 所 指 元 素 的 值 赋 给 变 量 key,“当前指针”所指元素的值赋给变量 key,value,然后移动数组array“当前指针”,使“当前指针”指向下一个元素,周而复始,直至数组array最后一个元素,此时“当前指针”为空。
使用foreach语言结构除了可以实现对数组的遍历,还可以实现数组元素的键或值的修改。
每次执行foreach语言结构时,数组array“当前指针”(current)会自动指向第一个元素,即在使用foreach遍历数组时,不需要调用reset()函数。foreach语言结构操作的是数组的一个拷贝,而不是该数组本身。在foreach遍历数组的过程中,尽量不要使用数组指针函数操作“当前指针”(current)。
通常情况下,foreach语句是遍历数组的首选。但是由于foreach语句是在数组的副本上进行操作,当需要给数组中每个元素重新赋值时就不适用了。尽管也可以用while循环和do…while循环,但由于数组是顺序索引的,最合适的语句还是for语句。

双引号指定字符串的特点:
单引号代表纯字符串,不论里面有什么东西都当字符串处理
双引号代表可以处理的字符串,如果字符串中有变量会优先解析变量,之后再按照正常的字符串进行处理
单引号的速度 > 双引号的速度,因为不用解析变量

strlen()函数返回字符串的长度(字节数)。如果成功则返回字符串的长度,如果字符串为空则返回 0。
中文字符串的处理使用mb_strlen()函数。

字符串相关函数
1)转换函数;implode()、explode()、str_split()
implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
str_split(字符串,字符长度):按照指定长度拆分字符串得到数组

2)截取函数:trim()、ltrim()、rtrim()
trim(字符串[,指定字符]):本身默认用来去除两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容,直到碰到一个不是目标字符串为止
ltrim():去除左边的空格或者其他字符
rtrim():去除右边的空格或者其他字符
3)截取函数:substr()、strstr()
substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
strstr(字符串,匹配字符):从指定位置开始截取到最后(可以用来取文件后缀名)
4)大小转化函数:strtolower()、strtoupper()、ucfirst()
strtolower(字符串):全部小写
strtoupper(字符串):全部大写
ucfirst(字符串):首字母大写(首字母为空格则看不出效果)
5)查找函数:strpos()、strrpos()
strpos():判断字符在目标字符串中首次出现的位置
strrpos():判断字符在目标字符串中最后出现的位置
6)替换函数:str_replace()
str_replace(mixed $search , mixed $replace , mixed $subject):将目标字符串中部分字符串进行替换
7)格式化函数:printf()、sprintf()
printf()/sprintf():(输出字符串有占位符,顺序占位内容)格式化输出数据
8)其他:str_repeat()、str_shuffle()
str_repeat((string $input , int $multiplier):重复某个字符串n次
str_shuffle():随机打乱字符串

Cookie与Session的区别
1)存放位置:
Cookie放在客户端浏览器中;
Session放在服务器端某个文件夹下;
2)存放的类型:
Cookie只能存放字符串。
Session还可以存放对象等其他类型。
3)存放大小:
Cookie存储的数据根据浏览器的不同而有不同的限制,Chrome大概是50左右,最大4097字节。
Session默认没有限制,但是如果过多的话,会影响服务器性能。
4)存放路径:
Cookie是可以用setcookie()函数设置路径参数的,如果同一个网站下不同路径的Cookie互相也是访问不到。
Session不能区分路径,同一个用户在会话期间,Session在任何一个地方都可以访问到。
%)生命周期:
Cookie是可以用setcookie()函数过期时间的,如果浏览器关闭,Cookie还没过期那么会存储到本地,下次打开浏览器的时候还有。如果没有设置过期时间一般是到浏览器关闭的时候就销毁了。
Session默认基于Cookie,然后默认设置session.cookie_lifetime=0也就是浏览器关闭的时候,会删除客户端Cookie,那么你就访问不到你之前的会话,而是新创建一个会话,但是远程服务器上的会话文件不会被删除(它会被垃圾回收机制进行处理);另外Session也可以用session.cookie_lifetime进行设定SessionID在客户端Cookie 有效期。
6)浏览器访问:
Cookie可以在不同浏览器下共享数据,都能访问到Cookie的信息。
Session只能在一个浏览器独享,常见的场景就是你如果登陆一个web系统后,复制链接到另一个浏览器上是需要重新进行登陆创建新的会话。
7)创建方式:
Cookie直接就可以用setcookie()进行设置。
Session必须先开启session_start(),然后用超全局变量 S E S S I O N [ ′ n a m e ′ ] = ′ T a c k s ′ ; 进 行 设 置 。 8 ) 手 动 销 毁 : C o o k i e 利 用 s e t C o o k i e ( ′ n a m e ′ , ′ T a c k s ′ , t i m e ( ) − 1 ) ; 设 置 过 期 就 好 了 。 S e s s i o n 需 要 四 步 走 , 开 启 s e s s i o n s t a r t ( ) , 然 后 删 除 对 应 的 s e s s i o n 变 量 _SESSION['name'] = 'Tacks';进行设置。 8)手动销毁: Cookie利用 setCookie('name','Tacks',time()-1);设置过期就好了。 Session需要四步走,开启session_start(),然后删除对应的session变量 SESSION[name]=Tacks;8CookiesetCookie(name,Tacks,time()1);Sessionsessionstart()session_SESSION = [];,然后让对应客户端的cookie也过期,然后彻底消除会话session_destroy();
9)用处:
Cookie一般用于不重要的数据存储在浏览器上,如果想要更安全一些,可以利用一些加密算法处理后存放。
Session一般于登陆时候,存储会话状态

变量
一.局部变量
(1)局部变量也叫内部变量,是在函数内部声明的变量。
起作用仅限于函数内部,离开该函数的时候再使用这种变量是非法的。当每次调用函数的时候,函数内部的变量才被声明,执行完毕后,函数内部的变量都将被释放。
function add1($a){
b = 100 ; / / 函 数 内 声 明 一 个 变 量 e c h o " i n t e r n a l v a r e x e c u t e : b = 100;//函数内声明一个变量 echo "internal var execute : b=100;//echo"internalvarexecute:a + b " , ′ = ′ , ( b",'=',( b",=,(a+KaTeX parse error: Expected 'EOF', got '}' at position 21: …br/>';//局部变量求和 }̲ add1(100);//向a…a + b " , ′ = ′ , ( b",'=',( b",=,(a+ b ) , ′ < b r / > ′ ; / / 函 数 外 部 不 能 访 问 函 数 内 部 的 局 部 变 量 , 报 错 上 面 的 例 子 中 声 明 一 个 a d d ( ) 函 数 , 只 有 调 用 函 数 时 候 , 才 会 去 声 明 两 个 变 量 b),'<br/>';//函数外部不能访问函数内部的局部变量,报错 上面的例子中声明一个add()函数,只有调用函数时候,才会去声明两个变量 b),<br/>;//访add()a和 b 。 这 两 个 变 量 都 是 局 部 变 量 , 只 能 用 于 函 数 内 部 使 用 。 当 a d d ( ) 输 出 结 果 执 行 完 毕 后 , 这 两 个 变 量 都 会 释 放 , 在 函 数 外 是 访 问 不 到 的 。 ( 二 ) 如 果 想 在 函 数 外 部 调 用 该 变 量 值 , 必 须 通 过 r e t u r n 语 句 返 回 其 值 。 f u n c t i o n a d d 2 ( b。这两个变量都是局部变量,只能用于函数内部使用。当add()输出结果执行完毕后,这两个变量都会释放,在函数外是访问不到的。 (二)如果想在函数外部调用该变量值,必须通过return语句返回其值。 function add2( b使add()访returnfunctionadd2(a){#声明一个函数,传入一个参数$a
KaTeX parse error: Expected 'EOF', got '#' at position 9: b = 100;#̲函数内部声明一个局部变量b
return a + a+ a+b;#使用算术运算符计算结果返回到函数调用处
}
KaTeX parse error: Expected 'EOF', got '#' at position 18: …m = add2(100);#̲将函数的返回值赋给sum
echo $sum;//200 输出函数返回值
二、全局变量
(1)全局变量也叫做外部变量,是在函数外部定义的。
作用域从变量开始处到程序结束处。和其他语言不同,全局变量不可以在函数内部直接调用,函数可以视为单独的程序片段。c语言中全局变量在函数中自动生效,除非被局部变量覆盖。
$one = 100;
$two = 200;
function add3(){
echo o n e + one+ one+two;#相当于直接在函数内部声明两个局部变量并且没有赋值。
}
add3();//报错notice,意味 o n e 和 one和 onetwo没有定义,输出0
echo o n e + one+ one+two;//输出300
(2)PHP中全局变量在函数中使用需要声明global。
$one = 100;
$two = 200;
function add4(){
global o n e , one, one,two;//在函数内部使用global关键字加载全局变量
echo o n e + one+ one+two;
}
add4();//输出300
echo o n e + one+ one+two;//输出300
(3)在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组 。
$one = 100;
$two = 200;
function add5(){
$GLOBALS[‘one’] = $GLOBALS[‘one’] + KaTeX parse error: Expected 'EOF', got '#' at position 16: GLOBALS['two'];#̲超全局数组访问全局变量 } a…one的值
echo $one;//输出300 说明全局变量访问到了,被重新赋值
三、静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
局部变量从存储方式上可以有动态存储类型和静态存储类型。函数中的局部变量,如果不专门声明static存储,那么默认都是动态分配内存空间,其变量会在函数调用后自动释放。如果希望函数在执行完毕后,变量依然保存在内存中应使用static关键字声明静态变量。
声明静态变量后,是在所有对该函数的调用之间共享。即函数再次执行时候,静态变量将持续前次的结果继续运算,并且仅仅在脚本的执行期间,函数第一次调用时候被初始化。
function demo(){
static $a = 0;
echo $a;
$a++;
}
demo();//0
demo();//1

文件包含四种形式:
include, require, include_once, require_once
文件加载原理:
在文件加载(include或者require)的时候,系统会自动的将包含文件的代码相当于嵌入到当前文件中
加载位置:在哪加载,对应的文件中代码嵌入的位置就是对应的include位置
在PHP中被包含的文件是单独进行编译的
PHP文件在编译过程中如果出现了语法错误,那么会失败(不会执行);但是如果被包含的文件有错误时,系统会执行到包含include这条语句的时候才会报错。
include 和 include_once的区别:
include :系统碰到一次,执行一次,如果对同一个文件进行多次加载,那么系统会执行多次;
include_once :系统碰到多次,也只会执行一次。
require和include的区别:
本质都是包含文件,唯一的区别在于包含不到文件的时候,报错的形式不一样。
include的错误级别比较轻,不会阻止代码执行。
require要求较高,如果包含出错,require后面的代码不会执行。

绝对路径与相对路径的加载区别:
1.绝对路径相对效率偏低,但是相对安全(路径不会出问题)。
2.相对路径相对效率高些,但是容易出错(相对路径会发生改变)。
编程题
1、实现中文字串截取无乱码的方法。(3分)
答:function GBsubstr($string, $start, KaTeX parse error: Expected '}', got 'EOF' at end of input: … if(strlen(string)>$length){
$str=null;
l e n = len= len=start+ l e n g t h ; f o r ( length; for( length;for(i= s t a r t ; start; start;i< l e n ; len; len;i++){
if(ord(substr( s t r i n g , string, string,i,1))>0xa0){
s t r . = s u b s t r ( str.=substr( str.=substr(string,$i,2);
$i++;
}else{
s t r . = s u b s t r ( str.=substr( str.=substr(string,$i,1);
}
}
return $str.’…’;
}else{
return KaTeX parse error: Expected 'EOF', got '}' at position 12: string; }̲ } 2. 请写一个函数验证电…email)
{
KaTeX parse error: Got function '\.' with no arguments as subscript at position 28: …"/([a-z0-9]*[-_\̲.̲]?[a-z0-9]+)*@(…pregEmail,$email);
}
3、完成以下:
(一)创建新闻发布系统,表名为message有如下字段 (3分)
  id 文章id
  title 文章标题
  content 文章内容
  category_id 文章分类id
hits 点击量
答:CREATE TABLE ‘message’(
‘id’ int(10) NOT NULL auto_increment,
‘title’ varchar(200) default NULL,
‘content’ text,
‘category_id’ int(10) NOT NULL,
‘hits’ int(20),
PRIMARY KEY(‘id’);
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分)
  comment_id 回复id
  id 文章id,关联message表中的id
  comment_content 回复内容
  现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
  文章id 文章标题 点击量 回复数量
  用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0
答:SELECT message.id id,message.title title,IF(message.hits IS NULL,0,message.hits) hits,
IF(comment.id is NULL,0,count(*)) number FROM message LEFT JOIN
comment ON message.id=comment.id GROUP BY message.id;
  (三)上述内容管理系统,表category保存分类信息,字段如下 (3分)
  category_id int(4) not null auto_increment;
  categroy_name varchar(40) not null;
  用户输入文章时,通过选择下拉菜单选定文章分类
  写出如何实现这个下拉菜单
答:function categoryList()
{
KaTeX parse error: Undefined control sequence: \n at position 169: …gory' value=''>\̲n̲"); while(rowArray=mysql_fetch_array(KaTeX parse error: Expected '}', got 'EOF' at end of input: …ption value='".rowArray[‘category_id’]."’>".$rowArray[‘categroy_name’]."\n");
}
print("");
}
4. 写一个函数,算出两个文件的相对路径
  如 a = ′ / a / b / c / d / e . p h p ′ ;     a = '/a/b/c/d/e.php';    a=/a/b/c/d/e.php;  b = ‘/a/b/12/34/c.php’;
  计算出 $b 相对于 a 的 相 对 路 径 应 该 是 . . / . . / c / d 将 ( ) 添 上 答 : f u n c t i o n g e t R e l a t i v e P a t h ( a 的相对路径应该是 ../../c/d将()添上 答:function getRelativePath( a../../c/d():functiongetRelativePath(a, $b) {
r e t u r n P a t h = a r r a y ( d i r n a m e ( returnPath = array(dirname( returnPath=array(dirname(b));
$arrA = explode(’/’, $a);
$arrB = explode(’/’, r e t u r n P a t h [ 0 ] ) ; f o r ( returnPath[0]); for ( returnPath[0]);for(n = 1, l e n = c o u n t ( len = count( len=count(arrB); $n < $len; KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (arrA[$n] != a r r B [ arrB[ arrB[n]) {
break;
}
}
if ($len - $n > 0) {
r e t u r n P a t h = a r r a y m e r g e ( returnPath = array_merge( returnPath=arraymerge(returnPath, array_fill(1, $len - $n, ‘…’));
}
r e t u r n P a t h = a r r a y m e r g e ( returnPath = array_merge( returnPath=arraymerge(returnPath, array_slice($arrA, $n));
return implode(’/’, KaTeX parse error: Expected 'EOF', got '}' at position 20: …rnPath); }̲ echo get…a, b ) ; 5. 写 一 个 函 数 , 能 够 遍 历 一 个 文 件 夹 下 的 所 有 文 件 和 子 文 件 夹 。 答 : f u n c t i o n m y s c a n d i r ( b); 5.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。 答: function my_scandir( b);5.:functionmyscandir(dir)
{
$files = array();
if ( h a n d l e = o p e n d i r ( handle = opendir( handle=opendir(dir) ) {
while ( ( f i l e = r e a d d i r ( file = readdir( file=readdir(handle)) !== false ) {
if ( $file != “…” && KaTeX parse error: Expected '}', got 'EOF' at end of input: … if ( is_dir(dir . “/” . $file) ) {
f i l e s [ files[ files[file] = scandir($dir . “/” . $file);
}else {
$files[] = KaTeX parse error: Expected 'EOF', got '}' at position 24: … }̲ }…handle);
return $files;
}
}
6.简述论坛中无限分类的实现原理。
答:

<?php //指定分类id变量$category_id,然后返回该分类的所有子类 //$default_category为默认的选中的分类 function Get_Category($category_id = 0,$level = 0, $default_category = 0) { global $DB; $sql = "SELECT * FROM category ORDER BY categoryID DESC"; $result = $DB->query( $sql ); while ($rows = $DB->fetch_array($result)) { $category_array[$rows[categoryParentID]][$rows[categoryID]]=array('id' => $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows [categoryName]); } if (!isset($category_array[$category_id])){ return ""; } foreach($category_array[$category_id] AS $key => $category){ if ($category['id'] == $default_category){ echo "<?php class cate { function Get_Category($category_id = 0,$level = 0, $default_category = 0) { echo $category_id; $arr = array( '0' => array( '1' => array('id' => 1, 'parent' => 0, 'name' => '1111'), '2' => array('id' => 2, 'parent' => 0, 'name' => '2222'), '4' => array('id' => 4, 'parent' => 0, 'name' => '4444') ), '1' => array( '3' => array('id' => 3, 'parent' => 1, 'name' => '333333'), '5' => array('id' => 5, 'parent' => 1, 'name' => '555555') ), '3' => array( '6' => array('id' => 6, 'parent' => 3, 'name' => '66666'), '7' => array('id' => 7, 'parent' => 3, 'name' => '77777') ), '4' => array( '8' => array('id' => 8, 'parent' => 4, 'name' => '8888'), '9' => array('id' => 9, 'parent' => 4, 'name' => '9999') ) ); if (!isset($arr[$category_id])) { return ""; } foreach($arr[$category_id] AS $key => $cate) { if ($cate['id'] == $default_category) { $txt = "

7求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
方法一:

<?php class Dtime { function get_days($date1, $date2){ $time1 = strtotime($date1); $time2 = strtotime($date2); return ($time2-$time1)/86400; } } $Dtime = new Dtime; echo $Dtime->get_days('2007-2-5', '2007-3-6'); ?>

方法二:

<?php $temp = explode('-', '2007-2-5'); $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); $temp = explode('-', '2007-3-6'); $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); echo ($time2-$time1)/86400; 8.字符串“open_door” 转换成 “opendoor”、”make_by_id” 转换成 ”makebyid” function changeStyle($str){ $arr = explode('_',$str); $new_str = ''; foreach($arr as $v){ $new_str .= ucfirst($v); } return $new_str; } echo changeStyle('open_door')."
"; //OpenDoor echo changeStyle('make_by_id'); //MakeById 要求写一段程序,实现以下数组$arr1转换成数组$arr2: $arr1 = array ( '0' => array ('fid' => 1, 'tid' => 1, 'name' =>'Name1' ), '1' => array ('fid' => 1, 'tid' => 2 , 'name' =>'Name2' ), '2' => array ('fid' => 1, 'tid' => 5 , 'name' =>'Name3' ), '3' => array ('fid' => 1, 'tid' => 7 , 'name' =>'Name4' ), '4' => array ('fid' => 3, 'tid' => 9, 'name' =>'Name5' ) ); $arr2 = array ( '0' => array ( '0' => array ( 'tid' => 1, 'name' => 'Name1'), '1' => array ( 'tid' => 2, 'name' => 'Name2'), '2' => array ( 'tid' => 5, 'name' => 'Name3'), '3' => array ( 'tid' => 7, 'name' => 'Name4') ), '1' => array ( '0' => array ( 'tid' => 9, 'name' => 'Name5' ) ) ); 实现代码如下: <?php $arr1 = array ( '0' => array ('fid' => 1, 'tid' => 1, 'name' =>'Name1' ), '1' => array ('fid' => 1, 'tid' => 2 , 'name' =>'Name2' ), '2' => array ('fid' => 1, 'tid' => 5 , 'name' =>'Name3' ), '3' => array ('fid' => 1, 'tid' => 7 , 'name' =>'Name4' ), '4' => array ('fid' => 3, 'tid' => 9, 'name' =>'Name5' ) ); $arr2 = array(); $i = 0; foreach($arr1 as $key=>$val) { unset($val['fid']); //将键值为fid的元素释放(去掉) $arr2[$i][] = $val; if($key == 3) $i++; } echo '
';
print_r($arr2);
echo '
';
?>

排序

<? //插入排序(一维数组) function insert_sort($arr){  $count = count($arr);  for($i=1; $i<$count; $i++){   $tmp = $arr[$i];   $j = $i - 1;   while($arr[$j] > $tmp){    $arr[$j+1] = $arr[$j];    $arr[$j] = $tmp;    $j--;   }  }  return $arr; }    //选择排序(一维数组) function select_sort($arr){  $count = count($arr);  for($i=0; $i<$count; $i++){   $k = $i;   for($j=$i+1; $j<$count; $j++){    if ($arr[$k] > $arr[$j])     $k = $j;    if ($k != $i){     $tmp = $arr[$i];     $arr[$i] = $arr[$k];     $arr[$k] = $tmp;    }   }  }  return $arr; }    //冒泡排序(一维数组) function bubble_sort($array){  $count = count($array);  if ($count <= 0) return false;    for($i=0; $i<$count; $i++){   for($j=$count-1; $j>$i; $j--){    if ($array[$j] < $array[$j-1]){     $tmp = $array[$j];     $array[$j] = $array[$j-1];     $array[$j-1] = $tmp;    }   }  }  return $array; }    //快速排序(一维数组) function quick_sort($array){  if (count($array) <= 1) return $array;     $key = $array[0];  $left_arr = array();  $right_arr = array();  for ($i=1; $i

一.连接数据库相关语句、添加、修改,显示数据库里的记录
方法一:

<?php $dbhost="127.0.0.1"; $dbuser="root"; $dbpass="201266"; $dbname="jsb1915935066"; $conn=mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); mysqli_query(“set names ‘gdk’”); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); }else echo "连接成功"; ?>

方法二:

<?php $link=@mysqli_connect(‘localhost’,’root’.’密码’,’数据库名’) if (!$link){ Exit(‘数据库连接失败:’.mysqli_connect_error());} Mysqli_set_charset($link,’utf8’) ?>

完整程序如下:

<?php $serverLink =@mysql_connect("localhost" , "root","") or die("连接服务器失败!程序中断执行! "); mysql_query("set names 'gbk'"); $dbLink = emysql_select_db ("student") or die ("选择当前数据库失败!程序中断执行!"); $insertSQL = "insert into student values (null, 'test', 'test ',2)"; $updateSQL = "update student set class_id=1 where student_name='test'"; $deletesQL= "delete from student where student_name='test'"; $inserted =mysql_query($insertSQL); echo "当前插入记录的student_id值为:".mysql insert id() ."
"; $insertedRows = mysql_affected_rows(); echo"插入记录的行数;$insertedRows
"; $updated = mysql_query ($updatesQL); supdatedRows= mysql_affected_rows(); echo"修改记录的行数:$updatedRows
"; $deleted = mysa1_query ($deletesQL); $deletedRows - mysql_affected_rows(); echo "删除记录的行数:$deletedRows
"; $close = @mysql_close($serverLink); 二.一个简单表单用于收集数据然后添加到数据库 //action 默认 Username:
Password: //-----以上为简单表单的制作 <?php $name = $_POST["username"]; //利用POST超全局变量 获取表单信$name = $_POST["username"]; $servername = "127.0.0.1"; //以下四行为数据库信息 $user = "root"; //用户名 $password = "123456"; //密码 $data = "school"; //要使用的数据库名称 $con = mysqli_connect($servername,$user,$password,$data); //连接到数据库(面向对象) if($con->connect_error){ die("连接失败".$con->connect_error); } echo "连接成功"."
"; //连接数据库成功显示的信息 $sql = "insert into user(username,password) values ('$username','$password')"; //插入数据到数据库语句 if($con->query($sql)===true){ //插入成功显示的信息 echo "data insert success"; }else { echo "data insert fail"."
".$con->error; } $con->close(); ?>

三.一个简单的学生管理的添加学生记录,实现添加记录,查询某些学生信息,修改某些学生信息

四.编写支持换皮肤的PHP程序
1.准备JPG皮肤图图片,分别将其命名为01.jpg、02.jpg、03.jpg。
2.创建目录images,将所有皮肤图片文件放在该目录下。
3.创建skin.php文件,代码如下:

<?php if(isset($_GET["source"])){ $source=$_GET["source"]; }else{ $source="image/01.jpg"; } ?>

Index.php

<?php //设置编码为UTF-8,以避免中文乱码 header('Content-Type:text/html;charset=utf-8'); ?> 文件上传表单页面

Upload.php

<?php //设置编码为UTF-8,以避免中文乱码 header('Content-Type:text/html;charset=utf-8'); $first_file = $_FILES['upload_file1']; //获取文件1的信息 $second_file = $_FILES['upload_file2'];//获取文件2的信 $upload_dir ='D:/upload/';//保存上传文件的目录 //处理上传的文件1 if($first_file['error']== UPLOAD_ERR_OK){ //上传文件1在服务器上的临时存放路径 $temp_name = $first_file['tmp_name']; //上传文件1在客户端计算机上的真实名称 $file_name = $first_file['name']; //移动临时文件夹中的文件1到存放上传文件的目录,并重命名为真实名称 move_uploaded_file($temp_name, $upload_dir.$file_name); echo '[文件1]上传成功!
'; }else{ echo '[文件1]上传失败!
'; } //处理上传的文件2 if($second_file['error']== UPLOAD_ERR_OK){ //上传文件2在服务器上的临时存放路径 $temp_name = $second_file['tmp_name']; //上传文件2在客户端计算机上的真实名称 $file_name = $second_file['name']; //移动临时文件夹中的文件2到存放上传文件的目录,并重命名为真实名称 move_uploaded_file($temp_name, $upload_dir.$file_name); echo '[文件2]上传成功!
'; }else{ echo '[文件2]上传失败!
'; } ?>

PHP字符串比较大小
//ASCII码,比较两个字符串的大小,根据ASCII,从左到右依次比较。
//大小写不同的字母,小写的比大写的要大
//strcmp — 二进制安全字符串比较
echo strcmp(‘Tacks’,‘tacks’),’
’;//-1
echo strcmp(‘tacks’,‘Tacks’),’
’;//1
echo strcmp(‘Tacks’,‘Tacks’),’
’;//0

//strncmp — 二进制安全比较字符串开头的若干n个字符
echo strncmp(‘Tacks’,‘TackS’,5),’
’;//1
echo strncmp(‘Tacks’,‘Tacks’,5),’
’;//0

//strcasecmp — 二进制安全比较字符串(不区分大小写)
echo strcasecmp(‘Tacks’,‘tacks’),’
’;//0

//strncasecmp — 二进制安全比较字符串开头的若干个字符(不区分大小写)
echo strncasecmp(‘TacksA’,‘tacks’,5),’
’;//0
echo strncasecmp(‘TacksA’,‘tacks’,6),’
’;//1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值