PHP学习笔记之变量用法详解

 更新时间:2016年11月25日 15:02  点击:1747
变量用于存储值,比如数字、字符串或函数的结果,这样我们就可以在脚本中多次使用它们了变量用于存储值,比如数字、文本字符串或数组。

一旦设置了某个变量,我们就可以在脚本中重复地使用它。

PHP 中的所有变量都是以 $ 符号开始的。

PHP的代码插入很直观,"<?php" 开始 "?>" 结束。

 
所有的变量以"$"开头,例如"$money"。(定义符容易让人遐想)需要使用时,定义即可,可以省略对变量类型的定义,php的编译器会自动为我们选择的。

 
对于条件判断语句,php和c差不多。if(条件A){过程A}即可,还有就是else和elseif。else用于运行条件A以外的过程,elseif(条件N....)则是其他条件为真时运行的代码。

下面是自己写的代码:

 代码如下 复制代码

if.php
<html>  
<body>  
<center>  
<form action="if.php" method="post">  
<input type="radio" name="sex" value="male" /> 男性  
</br>  
<input type="radio" name="sex" value="female" /> 女性  
</br>  
<input type="submit" value="提交" />  
</form>  
<?php  
$sex = $_POST["sex"];  
if($sex=="male")  
{  
    echo "男性";  
}  
elseif($sex=="female")  
{  
    echo "女性";  
}  
else  
{  
    echo "未知性别";  
}  
  
?>  
</center>  
</body>  
</html>  

代码的意思就是通过表单以POST方式提交性别选项,分别是男性和女性,然后交给php接收post上来的数据,并传给sex变量。最后进行判断,如果是male则输出男性,female输出女性,其它情况输出未知。

提交后

文中提到的if.php可以到这里测试


然后就是switch,这个也很好理解,类似于if和elseif的组合,只不过遇到很多种条件需要判断时,switch回把代码变得很简洁直观。

PHP代码

 代码如下 复制代码
switch (变量名)  
{  
case 值1:  
  code to be executed if e­xpression = label1;  
  break;    
case 值2:  
  code to be executed if e­xpression = label2;  
  break;  
default:  
  code to be executed  
  if e­xpression is different   
  from both label1 and label2;  
}  

当变量中的值满足“值1”或者“值2”时,分别执行两个case下面的代码,然后千万记住每个“case”之间都要用“break;”分开。当变量中的值既不是“值1”也不是“值2”时就执行“default”下面的代码。

今天早想做一个功能用户登录之后我把用户的名字保存到cookie中但是我开始使用读取cookie 的方法,但是没效果,后来发现使用setcookie()后面必须带时间才可以,下面我来介绍一下。

语法
setcookie(name,value,expire,path,domain,secure)

参数     描述
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的有效期。
path 可选。规定 cookie 的服务器路径。
domain 可选。规定 cookie 的域名。
secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。


例,一个简单给cookie赋值

 代码如下 复制代码

<?php
$value = "my cookie value";

// 发送一个 24 小时候过期的 cookie
setcookie("TestCookie",$value, time()+3600*24);
?>


例,二维数组存储到cookie

a.php

 代码如下 复制代码

<?
$cart_info[0][0] = "1123";
$cart_info[1][0] = "5334521";
$cart_info[1][2] = "df";
$cart_info[4][2] = "fefe";

setcookie("xia",serialize($cart_info));
?>

b.php

 代码如下 复制代码

<?
$other = StripSlashes($_COOKIE['xia']);
print_r(unserialize($other));
?>

相信不少和我一样的php新人在学习PHP的时候和我一样,都郁闷过这个问题。@(at)这个记号到底是做什么的呢?


一次,下载别人的源码来看,看到无数@记号,开始以为是注释;后来发现@后面的语句也是会执行的。纳闷了,这个记号究竟是做什么的呢.....

随着学习的不断深入,总算是明白了。这个记号的作用有点类似于asp中的忽略错误"on error resume next "。他们的作用是一样的,当php解释器遇到@开头的语句时候,无论本行的语句是否执行成功,都会继续执行后续的语句,而且不会报错。但特别注意,@(at)记号只对当前行起作用哦。

 
 
希望关于@(at)的问题就在这打住把。
 

eg.下面这句话肯定报错

报错代码

 代码如下 复制代码

<?php  
$sql = mysql_connect(*);  
?>  

 

 

然而,如果我们加上@(at)记号,就不会报错了,而且继续执行。

不报错代码

 代码如下 复制代码

<?php   
@$sql = mysql_connect(*);  
echo "我一直在执行";  
?>  


继续执行下边的代码。

 代码如下 复制代码

 @$page=$_GET['page']?intval($_GET['page']):1;

这句是从URL中获取page关键字的值,比如"index.php?page=5",则$page就会取到5。

但是如果有error,比如"index.php"后没有page关键字了,如果去取$_GET['page']不存在就会报错,这时有@就可以忽视这个小错误了。

又比如:

 代码如下 复制代码

 $conn = mysqli_conncet("q","w","e","r");

这样会输入错误信息,关于连接数据库方面的。

 代码如下 复制代码

 @$conn = mysqli_conncet("q","w","e","r");

如果$conn前面加@的话就可以不让他输出错误信息了。

今天做的是个简单的表明表页面,前端我用的是Bootstrap。没办法,自己不懂美工,也只有用别人的工具。BS真的很漂亮,而且插件丰富,不愧是twitter工程师弄出来的东西。

(中文官网:http://www.bootcss.com)好的东西大家都喜欢,但是它对IE6-9的兼容几乎是0。大家也懂的,国外基本是不使用这几款浏览器了。不过在中国,IE依然占有很高的市场份额。所以,有人开发了一款叫做BSIE的Bootstrap插件,美其名曰鄙视IE,使用方法也相当简单。好像有点跑题,后端我用的是CodeIgniter,它是基于PHP的开源框架。CI是今天的正题。

 

  因为CI对于数据的过滤函数只有xss_clean(),(不知道是不是自己才疏学浅,总之没有找到其他的过滤函数)而今天的项目涉及到接收用户数据,然后提交数据库的操作。没有针对SQL语句的过滤,使得这一操作变得很危险。有点蛋蛋的忧桑,我想到的方法是改写CI的xss_clean()函数,使之具备过滤SQL注入语句的功能;一来改起来方便,二来过滤数据的时候不用嵌套两个函数。说干就干,在CI/system/core/目录下找到secure.php文件,找到xss_clean()函数的申明位置,在最后加上这么一段东西。

PHP代码

 代码如下 复制代码
$str = str_replace("_","x",$str);    
$str = str_replace("%","x",$str);    
$str = str_replace(""","x",$str);    
$str = str_replace("'","x",$str);    
$str = str_replace("select","x",$str);    
$str = str_replace("update","x",$str);    
$str = str_replace("insert","x",$str);   
$str = str_replace("set","x",$str);   
$str = str_replace("where","x",$str);   
$str = str_replace("from","x",$str);   
$str = str_replace("alert","x",$str);    
$str = str_replace("like","x",$str);   
return $str;  

 

  这样差不多能避免一般的SQL注入了。

又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来。


开始觉得这玩意很简单,结果嘛惨不忍睹。用CodeIgniter的上传类来上传文件,一开始进展蛮顺利的,但发觉走到上传文件类型的时候就走不下去了。我明明添加了.torrent类型为可上传类型,结果无论我怎么传也传不上去,还提示我上传文件类型不对。汗森了,这可是货真价实的种子文件啊,难道CI只认可岛国的种子吗?

 
打开CI的上传类看代码,原来CI的UPLOAD是通过判断文件的来实现文件识别的。难怪,种子的MIME类型在一般浏览器上返回的都是二进制数据类型,看来只有自己动手改造一下了。

 
为了尽快完成项目,我直接从控制器(Controller)开始写代码。用$_FILE['file']['name']获取上传文件的文件名,然后用explode函数来获取后缀名,最后再调用CI的UPLOAD来上传文件。代码如下:

PHP代码

 代码如下 复制代码
$config['upload_path'] = './uploads/';  
$config['allowed_types'] = '*';  
$config['max_size'] = '100';  
$this->load->library('upload',$config);  
$this->load->helper('security');  
$this->load->helper('date');  
$this->load->helper('url');  
$this->load->model('bt_model','',TRUE);  
$data['source_url'] = base_url().'source';  
$data['base_url'] = base_url();  
  
  
  
$file = $_FILES['upload_file']['name'];  
$file_1 = explode('.',$file);  
$file_2 = $file_1[count($file_1)-1];  
if($file_2 <> 'torrent'){  
    echo '<script>alert("只能上传类型为torrent的种子文件");</script>';  
    echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';  
    return;  
}  
$data['type'] = xss_clean($this->input->post('type'));  
$data['name'] = xss_clean($this->input->post('name'));  
$data['space'] = xss_clean($this->input->post('space'));  
$data['username'] = xss_clean($this->input->post('username'));  
$data['time'] = mdate('%Y-%m-%d %G:%i',gmt_to_local(time(),'UP8'));  
if($data['type'] == '' || $data['name'] == '' || $data['space'] == '' || $data['username'] == ''){  
    echo '<script>alert("信息填写不完整,请重新填写");</script>';  
    echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';  
    return;  
}  
$this->upload->do_upload('upload_file');  
echo $this->upload->display_errors();  
$file = $this->upload->data();  
$data['url'] = $data['base_url'].'uploads/'.$file['file_name'];  
$this->bt_model->insert($data);  
echo '<script>alert("上传成功");</script>';  
echo '<script>window.location.href="'.$data['base_url'].'";</script>';  

原理大致是这样的,获取上传文件的文件名,然后通过explode()函数来分割文件名以获取后缀,得到后缀之后与允许上传类型做比较,最后上传。

 
讲到上传,我又想到了原来那个特别流行的MIME上传漏洞。很简单,当网站判断上传文件类型时只判断MIME类型那么就会造成上传漏洞。因为上传时服务器得到的MIME类型是从客户端发过来的,也就是说MIME类型的值是可以被用户控制的,攻击者克构造虚假的MIME类型来上传webshell。

所以判断文件类型的时候还是检测文件后缀名吧,最好只给上传目录一个可读权限,关闭执行权限,这样比较靠谱。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C#中的try catch finally用法分析

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Nest.js环境变量配置与序列化详解

    这篇文章主要给大家介绍了关于Nest.js环境变量配置与序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • C++变量,常量,数组和字符串详解

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • 在JS中如何使用css变量详解

    这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-02
  • C#设置与获取环境变量的方法详解

    这篇文章主要给大家介绍了关于C#设置与获取环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-25