PHP简单笔记——CNYouth
一、表单验证
user.html文件
<html>
<head>
</head>
<body>
<form action="reg.php" method="get">
<input type="text" name="username" />
<input type="password" name="pwd" />
<input type="submit" value="提交" />
</form>
</body>
</html>
上面这段代码的主要意思是把用户名和密码,采用get方法,将数据发送给reg.php文件(在上面代码的第6行规定的)
reg.php文件获取用户名以及密码
<?php
//$_GET后面加上中括号,将username作为字符串放在中括号里面,就得到了表单里面的<input type="text" name="username" /> 的值
$u = $_GET['username'];
echo $u.'<br />';
//$_GET['pwd'] 得到表单<input type="text" name="username" /> 的值
$passwd = $_GET['pwd'];
echo $passwd.'<br />';
?>
G
E
T
的
主
要
作
用
是
将
得
到
g
e
t
传
值
的
数
据
,
通
过
_GET 的主要作用是将得到get传值的数据,通过
GET的主要作用是将得到get传值的数据,通过_GET这个外部变量,可以得到从表单输入的值。
reg.php后面跟了一个?(问号),表单里面的username以及pwd变在了地址栏里面,表单面username的值输入的是123,pwd的值输入的是456,username(名字)=root(值) 后面的密码是password(名字)=123123(值),中间有&(and符)分开
密码是可见的,那怎么样保证安全呢。让我在注册的过程当中,密码不在地址栏里面被人看到呢?
这个时候我们需要使用到post传值,post传值是在地址栏中不可见的。
同样上面例子的代码我们进行修改,html代码如下:
<html>
<head>
</head>
<body>
<!-- 这一行method 对应的值改为了post -->
<form action="reg.php" method="post">
<input type="text" name="username" />
<input type="password" name="pwd" />
<input type="submit" value="提交" />
</form>
</body>
</html>
PHP的代码里面的$_GET全改为了$_POST:
<?php
//$_POST后面加上中括号,将username作为字符串放在中括号里面,就得到了表单里面的<input type="text" name="username" /> 的值
$u = $_POST['username'];
echo $u.'<br />';
//$_POST['pwd'] 得到表单<input type="text" name="username" /> 的值
$passwd = $_POST['pwd'];
echo $passwd.'<br />';
?>
如上就做到了安全效果,通过post可以让用户名和密码不可见。
但是观察reg.php后的?(问号)不见了。后面的username和password也不见了。那他怎么传递数据的呢?
他是通过我们看不见的浏览器的请求头文件传递的数据。所以在URL(网址)栏不可见。这一块都是HTTP协议规定的传送方式。
以上讲解地址为:https://www.php.cn/code/1040.html
除此之外,我们还有
R
E
Q
U
E
S
T
来
接
收
数
据
。
现
在
我
们
这
样
处
理
:
将
p
h
p
代
码
段
中
的
_REQUEST来接收数据。现在我们这样处理: 将php代码段中的
REQUEST来接收数据。现在我们这样处理:将php代码段中的_POST全改为$_REQUEST,代码如下:
<?php
$u = $_REQUEST['username'];
echo $u.'<br />';
$passwd = $_REQUEST['pwd'];
echo $passwd.'<br />';
?>
把网页user.html里面的这一行中的method,改为get执行一次,再改为Post再运行一次,看看结果:
<form action="reg.php" method="post">
通过上面的实验你会发现$_REQUEST即可以接收get传值也可以接收post传值。
全局变量 | 功能说明 |
---|---|
$_COOKIE | 得到会话控制中cookie传值 |
$_SESSION | 得到会话控制中session的值 |
$_FILES | 得到文件上传的结果 |
$_GET | 得到get传值的结果 |
$_POST | 得到post传值的结果 |
$_REQUEST | 即能得到get的传值结果,也能得到post传值的结果 |
请再记住一句话: | 以上这些变量全是超全局的。(以后讲解超全局的含义) |
注:
1.我们认为从用户输入过来的所有数据都不是可信的。本书的下半部份会专门讲解限制和过滤
2.在提交数据的时候,我们常用的方法有get和post。可以这样理解,get传值在url中可见,而post传值在url中不可见。
而post传值在url中不可见,是通过浏览器的header头部份将数据发送给指定的服务器的,需要通过专门的工具才能看到post发送的值是什么。你可以下载火狐浏览器(Firefox)的插件(firebug)来查看。
打开firebug:
查看header头传递的数据(网络,点击POST reg.php 选择post),就看淡了传递的用户名和密码。
如果用get传值,用户名和密码在地址栏里面能够显示。浏览器的历史记录会自动记录访问过的地址(包含用户名和密码)。恶意用户会通过查看你的浏览器的历史记录,得到你曾经输入的密码而不安全,因此,不能使用get方式来用作密码的传输方式。
二、PHP常量和变量之环境变量
环境变量我们主要的有:
S
E
R
V
E
R
和
_SERVER和
SERVER和_ENV两个环境变量。
不过,$_ENV逐渐被PHP的新版本给废弃了。
【重点】知道在哪儿查看环境变量的名字(key)和值(value),记住并默写几个常用的环境变量。
查看环境变量的方法(如下代码):
<?php
phpinfo();
?>
其实环境变量不是不用背的,我了解在哪儿能够找到环境变量的key(键)和值即可。
我们学了phpinfo();打印出来了一批乱乱的东西,我们今天来学习其中的环境变量部份。
你在执行phpinfo();的这个网址中,将网页向下拉动翻页,看看能不能找到截图中的部份:
其中:_SERVER[‘中间的值’],是需要我们了解意思的。
如果我们需要显示我们当前访问的这个phpinfo();页面文件放在哪儿,就可以执行:
<?php
//我在上图左侧找到的一项,在前面加上了一个$(美元符),就显示出来了当前文件的路径
echo $_SERVER['SCRIPT_FILENAME'];
?>
我们来了解一些常用的环境变量的键名和值对应的意思:
键名 | 含义 |
---|---|
$_SERVER[“REQUEST_METHOD”] | 请求当前PHP页面的方法 |
$_SERVER[“REQUEST_URI”] | 请求的URI |
$_SERVER[“SERVER_SOFTWARE”] | 用的是哪一种服务器 |
$_SERVER[“REMOTE_ADDR”] | 客户的IP地址 |
$_SERVER[“SERVER_ADDR”] | 当前服务器的IP地址 |
$_SERVER[“SCRIPT_FILENAME”] | 当前请求文件的路径 |
$_SERVER[“HTTP_USER_AGENT”] | 当前访问这个网址的电脑和浏览器的情况 |
$_SERVER[“HTTP_REFERER”] | 上级来源(用户从哪个地址进入当前的网页的) |
$_SERVER[“REQUEST_TIME”] | 当前的时间 |
URI和URL都是网址,但是,URL带有主机地址部分,而URI不带主机地址部分,例如:
http://www.php.cn/abc.php?usernmae=php上面是一个URL(统一资源定位符),而URI是不带主机和(http://)协议部分:abc.php?username=php
三、php常量和变量之变量引用
变量引用
变量引用很多老师喜欢来用C语言的指针来去讲解。我们作为有这么多年开发和教学经验的人来说——大多数学习PHP的人来说根本不了解C语言。
使用C语言一指针来讲解变量引用,我们觉得画蛇填足。并且,不利于没有C语基础的朋友们学习。
关于变量引用的知识点,请以我们的讲解为理解的基准!
我们来对比两段代码的执行结果:
第一段代码,没有任何区别。跟我们原有的PHP代码一模一样:
<?php
$fo = 5;
//$fo的值为5,将5赋值
$bar = $fo;
//$bar的值原来为5,现在将值改为6
$bar = 6;
//$bar的结果为6
echo $bar.'<br />';
//$fo的结果为5
echo $fo.'<br />';
?>
第二段代码如下:
<?php
$fo = 5;
//注意,加上了一个&符哟
$bar = &$fo;
$bar = 6;
//$bar的结果为6
echo $bar.'<br />';
//$fo的结果为6
echo $fo.'<br />';
?>
为什么两个结果都变成6了呢?
我经常跟大家这样来举例。我们可以这样来想象:一个变量名,对应了一个数据值。如下图:
而加上&(and 符后),把变量指向同一个存值空间了,如下图:
也就是不论$fo
或$bar
的值如何发生变化,$fo
变$bar
也变,$bar
发生变化,$fo
也会发生变化。
四、PHP基本语法之运算
1、算术运算
与我们数学所学一样,也有优先级:先乘除,后加减。如果你想更明确的改变优先级,那就用()【小括号】,将想要优先的值给括起来。
2、写一个计算器
suanfa.php文件
<form method="get">//如果这里没有写get方法,那么程序第一次运行的时候就会产生$num1,$num2,$fh未定义
<input type="text" name="num1" >
<select name="fh">
<option value="jia"> + </option>
<option value="jian"> - </option>
<option value="c"> x </option>
<option value="chu"> / </option>
<option value="qy"> % </option>
</select>
<input type="text" name="num2">
<input type="submit" value="运算" />
</form>
<?php
$num1 = $_GET['num1'];
$num2 = $_GET['num2'];
$fh = $_GET['fh'];
if(!is_numeric($num1) || !is_numeric($num2)){
echo '请输入数值类型';
}
else
{
if($fh == 'jia'){
echo $num1 . '+' . $num2 . '=' . ($num1+$num2);
}
if($fh=='jian'){
echo $num1 . '-' . $num2 . '=' . ($num1-$num2);
}
if($fh=='c'){
echo $num1 . 'x' . $num2 . '=' . ($num1*$num2);
}
if($fh=='chu'){
echo $num1 . '/' . $num2 . '=' . ($num1/$num2);
}
if($fh=='qy'){
echo $num1 . '%' . $num2 . '=' . ($num1%$num2);
}
}
?>
效果如下:
3、写一个抽签的工具
<?php
//定义一个随机抽签软件
$tome=rand(1,6);
switch($tome){
case 1:
echo '1';
break;
case 2:
echo '2;
break;
case 3:
echo '3';
break;
case 4:
echo '4';
break;
case 5:
echo '5';
break;
case 6:
echo '6;
break;
............以此类推.............
}
?>
4、依次制表
<?php
$i=0;
echo '<table width="800" border="1">';
while($i<100){
//0 - 9 为一行
//10 -19 为一行
//因此,每一行都能够被10求默,如为为10的时候,应该显示行开始的标签
if($i%10 == 0){
//为了隔行变色,每20,40,60每行的颜色是不同的,因此我们又可以再进行一次取余运算
if($i%20==0){
echo '<tr>';
}else{
echo '<tr bgcolor="pink">';
}
}
echo '<td>'.$i.'</td>';
$i++;
//同理,每一行结束是不是应该有一个</tr>结束标签呢?
if($i%10==0){
echo '</tr>';
}
}
echo '</table>';
?>
展示如下:
5、引用操作符
$a = 5;
$b = &$a;
$a = 7;
echo "$b"."<br/>";//7
$a=12;
echo "$b"."<br/>";//12
unset($a);//销毁变量
echo "$b"."<br/>";//12
echo "$a"."<br/>";//no definde
$a=9;
$b=&$a;
echo "$b"."<br/>";//9
echo "$a"."<br/>";//9
如上,当变量$a
被销毁后,这个时候,变量$a
相当于没定义-no difinde;但是这个时候,$b
是有值的,因为他是在之前就已经引用了,和C语言最大的区别就是,在C语言中,$a
被销毁后,$b
也就没有值了,因为他也用的是$a
,这是指针,但是在PHP中,引用不同于指针,所以当$a
被销毁后,$b
的值还存在。
6、自加自减
在自加自减里面笔者有不懂的地方,希望有读者能够解答。
但是笔者最近又经过实验发现,$x
的值是先同所有赋值运算之后得到的,所以在上面赋值几次,下面得到的$x
或者$y
的值都跟着变化,如下示例:
第一种情况:
<?php
$x = 5;
$y = 6;
$foo = $x++ + $x--;
$bar = ++$y + ++$x;
$cup = $x-- + $y--;
$paper = ++$x + $x++;
// $water = $y-- + $x--;
echo $foo;//11
echo "<br/>";
echo $x;//7
?>
第二种情况:注意被注释的赋值语句!
<?php
$x = 5;
$y = 6;
$foo = $x++ + $x--;
$bar = ++$y + ++$x;
$cup = $x-- + $y--;
// $paper = ++$x + $x++;
// $water = $y-- + $x--;
echo $foo;//11
echo "<br/>";
echo $x;//5
?>
7、php基础语法之比较运算符
说明 | 符号 |
---|---|
大于 | > |
小于 | < |
大于等于 | >= |
小于等于 | <= |
不等于 | != |
等于 | == |
全等(判断类型等于) | === |
全不等(判断类型不等于) | !== |
内容相等:
<?php
$x = 5;
$y = '5';
if($x == $y){
echo '结果为真';//结果为真
}else{
echo '结果为假';
}
?>
类型判断1:
<?php
$x = 5;
$y = '5';
if($x === $y){
echo '结果为真';
}else{
echo '结果为假';//结果为假
}
?>
类型判断2:
<?php
$x = 5;
$y = 5;
if($x === $y){
echo '结果为真';//结果为真
}else{
echo '结果为假';
}
?>
我们对比区别发现:
下面这两段代码是===(三个等号,我们说他还有一个名字是判断类型等于)。而$x
为整型的5.$y
为字符串类型的5.类型不相同,所以执行的是假区间。而上面一段代码,是两个等号不判断类型,所以执行的是真区间
8、php基础语法之逻辑运算
逻辑与,中文解释为并且。可理解为,$x 并且 $y 都为真(true)的时候执行。
逻辑或,中文解释为或者。可以理解为, x 或 者 x或者 x或者y其中一个为真(true)的时候执行。
逻辑非,中文解释取反。如果$x的执为假(false),进行一次非操作。非假(false)就为真了,就可以执行真区间了。反推true,则执行假区间了。
逻辑异或,如果 x 和 x和 x和y相同则为false,不相同则为true。
举例 | 说明 | 详细说明 |
---|---|---|
$x and $y | 逻辑与(and关系) | $x and $y为真则返回真 |
$x && $y | 同上 | 同上 |
$x or $y | 逻辑或 | $x $y均为false时为假,其他情况全为真 |
$x 两个竖线 $b | 同上 | 同上 |
!$x | 逻辑非 | 取反,即true变为false,false变为true |
$x xor $y | 逻辑异或 | 相同取false,相异取true |
9、逻辑短路
【重点知识】短路
短路就是采用一个懒人模式来思考问题。
逻辑与的特性是:两边为true即为true,其他情况均为假。
逻辑或的特性是:两边为假均为假,其他情况全为真。
我们现在把自己想象成一个懒汉,非常非常懒。来思考逻辑与和逻辑或。可不可以这样理解:
逻辑与:如果前面第一个条件为false了,后面就可以不用执行了。
用代码表示:if($x && y ) 如 果 y) 如果 y)如果x已经为false了,后面的$y 就没有执行必要了。
逻辑或:前面第一个条件为true了,后面就不用执行了。
用代码表示:if($x || y ) 如 果 y) 如果 y)如果x已经为true了,后面的$y 就没有执行必要了。
我们写段代码来证明一下:
<?php
$x = false;
$y = 2;
if($x && $y++){
echo '真';
}else{
echo '假';
}
//结果还为2,说明没有执行$y++
echo $y;
?>
代码如下,将两个&符改为一个&符试试:
<?php
$x = false;
$y = 2;
if($x & $y++){
echo '真';
}else{
echo '假';
}
//再看看结果
echo $y;//因为两边都执行,所以y的值做了加加运算。
?>
我们来看看短路的逻辑或:
<?php
$x = true;
$y = 2;
if($x || $y++){
echo '真';
}else{
echo '假';
}
//结果,因为$x已经为true了,肯定执行真区间没有必要执行$y++了
echo $y;
?>
改成一个 | 再看看执行结果
<?php
$x = true;
$y = 2;
if($x | $y++){
echo '真';
}else{
echo '假';
}
//自己运行对比结果
echo $y;//即使左边为真,右边也执行了。
?>
通过上例我们知道了&&与&的区别,||和 |的区别。我们也了解了什么是短路。那我们在什么地方可以用到短路呢?有一些奇怪的写法,我们必须了清楚。其实就是基础语法的再应用。
<?php
//如果为defined('AUTH')存在AUTH常量则为true,不访问后面的exit了。如果为false则执行exit
defined('AUTH') or exit('存在安全因素不准访问');
?>
上面的一段代码就是典型的短路应用的代码
exit 的意思是指在此处停止运行,退出。后面的PHP代码不再执行了。它有两种用法:
1,直接exit; 就是直接退出
2,exit(‘提示内容’),退出的时候还给出一段提示内容
10、位运算(只作了解)
在今后编程里,位运算基本不用,所以不用太了解。 所以这里就不作过多解释了。
11、九九乘法表
//99乘法口诀表从1开始,所以声明一个变量$i = 1,让$i小于10,也就是最大值为9
for($i = 1 ; $i < 10 ; $i++ ){
//1x1=1,2x2等于4,所以第二次循环的最大值为$i的值,因此$j=1, $j在循环自加的过程当中,只能够小于等于$i
for($j=1;$j<=$i;$j++){
// 1 x 2 = 2 2 x 2 = 4啦
echo $j . 'x' . $i . '=' .($i*$j) . ' ';//这个地方,后面无论连接多少个空格或者制表符,PHP默认只有一个,即使是$str=' ';echo strlen($str);也不行。
}
echo '<br />';
}
五、流程控制
1、goto、exit;、exit(“内容”);的区别
<?php
for($i=0; $i<100; $i++) {
echo '第'. $i .'周往返北京大连<br />';
if($i == 17){
// goto end;//跳转到指定的位置
// exit;//退出程序
// break;//退出for循环
exit("下面的程序不执行了,嘿嘿!");//退出程序的时候给出一句话
}
}
end:
echo '集团公司要求停止此项';
?>
正如程序中的解释,goto跳转到指定程序行,其中exit适用于退出程序,而break是退出for循环结构体。
如下为简单的goto程序:
<?php
goto wan;
echo '天王盖地虎';//不执行
wan:
echo '小鸡炖蘑菇';//执行
?>
六、PHP的函数基本语法
函数,在之前的课程当中我们做过介绍。函数的英文叫作:function,而function的解释项中有另外一个含义:功能。
函数 就是 功能。那么调用一个函数就是在调用一个功能。
函数是条狗,哪里需要哪里吼。
通过上句话,我们能得到几个不同的规律:
需要用一个函数的时候,就吼一声它的名字
函数可以反复去吼,吼了它的名字它就过来了。也就是函数可以反复调用
我们明白后,那我们接下来来讲解函数的分类,我们将函数分为两大类别:
1、自定义函数
2、系统函数
1、php函数基本语法之自定义函数
PHP提供了功能强大的函数,但这远远满足不了需要,程序员可以根据需要自己创建函数。
我们在实际开发过程当中需要有很多功能都需要反复使用到,而这些反复需要使用到的功能,我们能定义成功能(函数),就尽可能定义成功能(函数)。使用的时候,吼一下它的名字即可。
function 函数名([参数名1[=值1], 参数名2[=值2], 参数名n[=值n]])
{
函数中的功能体
[return 返回值]
}
注意:函数名不区分大小写
a.php文件
<?php
function php_cn(){
echo '我是CNYouth';
}
php_cn();
echo "<br/>";
php_cn();
echo "<br/>";
php_cn();
?>
b.php文件
<?php
function php_c($n){
echo "我是你爸爸".$n;
}
php_c(",哈哈!");
PHP_C(",哈哈!");
php_C(",哈哈!");
php_c();
//上面前三个调用函数,因为php对于函数是不区分大小写的,所以其调用结果也相同。
//但是第四个调用函数,因为没有写入参数,所以会有报错。
?>
注意:
声明函数有参数(参数没有默认值),则调用函数务必要有参数。
声明函数有参数(参数有默认值时),则调用函数不必要有参数。
例如:
<?php
function test( $arg = 10){
echo $arg;
} test();//并不会报错,因为其声明定义的函数参数有默认值。 test(88);//最终答案为1088
?>
2、php自定义函数之回调函数
个人理解:PHP中的回调函数,在函数定义时,在函数里调用另一个函数,而另一个函数是怎么传进来的呢?这里用到了PHP中的可变函数,函数形参是一个变量,实参是字符串的函数名。
<?php
function woziji($one,$two,$func){
//我规定:检查$func是否是函数,如果不是函数停止执行本段代码,返回false
if(!is_callable($func)){
return false;
}
//我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
//$func是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
//我们定义几个函数试试
function plusx2( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
function jian( $x , $y ){
$result = $x - $y;
return $result;
}
//调用一下函数,woziji,向里面传入参数试试
echo woziji(20,10,'plusx2');
//将plusx2改成jian试试结果
echo woziji(20,10,'jian');
?>
由上面程序可知,在主调函数中,会有一个变量函数,例如$func
,其后面并没有直接添加小括号(),但是在后面调用主调函数的时候,其变量函数参数正是一个函数的函数名,所以所谓回调函数就是在主调函数里面嵌套一个将要调用的函数的函数名。
上面程序处理过程是这样的:
1.将20赋值给形参$one
,10赋值给$two
,而plusx2或者jian这两个变量函数,赋值给了$func
。
2.在woziji这个函数中判断plusx2或者jian是否为函数,不是函数就return false,停止执行。
3.显示plusx2或者jian是函数,因此$one
=20,$two
=10相加了,相加后,$one
和$two
又带入到了了$func($one,$two)
中。
4.带入至里面后,而$func
是可变的,可以是plusx2或者jian。如果为plusx2的话,$one = 20,$two = 10
的这个两个结果又给 了plusx2函数里面的$foo
和$bar
。
5.$foo + $bar
乘以2后将结果返回至woziji这个函数功能体的运算处:$one + $two + $func($one,$two);
6.这样就得到了运算结果
所以,回调函数:在一个函数里面,再传入一个函数名,在后面调用函数时,在函数名后面加上()括号进行调用并参与运算。作为变量函数,配合主调函数执行。