php中at @符号的作用使用说明

 更新时间:2016年11月25日 15:02  点击:1251
相信不少和我一样的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前面加@的话就可以不让他输出错误信息了。

变量用于存储值,比如数字、字符串或函数的结果,这样我们就可以在脚本中多次使用它们了变量用于存储值,比如数字、文本字符串或数组。

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

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”下面的代码。

今天做的是个简单的表明表页面,前端我用的是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。

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

在php中cookie和session经常是配合使用的,但是cookie安全性没有session高了,session只在服务器端而cookie在客户端,这个自然就明白它们的区别了,但它们经常用于各种登录验证,下面我来介绍。

Cookie和Session算是网站登陆验证的常用手段了。不管论坛也好,微博也好,它们都依赖于cookie和session以完成各项工作。

这里就不具体介绍Cookie和Session的概念了,我们可以简单的把它们理解为临时钥匙,用于开启不同的网络资源。
 

下面开始介绍在PHP里如何操作Cookie和Session。
 

Cookie:

  在PHP里,我们可以使用setcookie()函数来设置cookie。但特别注意,setcookie函数必须置于<html>标签之前。setcookie函数包含了一下几个参数:setcookie(name, value, expire, path, domain)。name参数是用来规定cookie的名称的,而value则是规定对应名称cookie的值,expire则是设定cookie有效期的。特别注意path和domain参数可选的。(path是规定cookie的服务器路径,而domain是规定cookie的所有域名)。


一般我们这样设置cookie

 
设置cookie

 代码如下 复制代码

<?php  
setcookie("username","Ku_Andrew",time()+3600);  
?>  

 

username就是我们cookie的名字了,而Ku_Andrew则是username的值,time()+3600就是一小时后该cookie过期。

 

现在我们用$_COOKIE来做一个实例

 
设置、读取cookie

 代码如下 复制代码

<?php  
$username = $_COOKIE['username'];  
if ($username == "")  
    {  
    setcookie("username","Ku_Andrew",time()+3600);  
    echo "we've not found your username from your cookie";  
    echo "but now we've give it to you , please refresh this page";  
    die("<a href=$PHP_SELF>kick me and refresh</a>");  
    }  
else  
    {  
    echo ("hello $usernama");  
    }  
?>  

 

如果想做出更复杂的判断,例如用户登陆等,我们可以在IF语句中的加入从数据库从检索出来的值。

 
Session:

  与Cookie不同,Session是保存在服务器上的,同时Session会随着浏览器的关闭而自动灭亡,生命周期较短。在PHP上,我们使用session_start()函数来启动session;与设置cookie相同,我们必须在<html>标签之前使用这个函数。使用这个函数之后我们就可以开始设置我们的Session变量了。方法也是极为简单:用$_SESSION数组直接定义。完成了定义,在不使用的时候为了节约服务器资源,我们要关闭它。这时可以使用unset()函数或者session_destroy()函数;unset()是解除变量,session_destroy()则是彻底终结session。下面是代码片段。

 
Session设置、读取

 代码如下 复制代码

<?php  
session_start();  
if ($_SESSION['pid'] == "")  
{  
    $_SESSION['pid'] = 1;  
}  
else  
{  
    $_SESSION['pid'] += 1;  
}  
echo "this is your $_SESSION['pid'] times watching this page";  
?>  

 
这是一个简单的网页计数器,通过设置pid来实现计数。第一次判断中,如果session为空,那么设置成一,并且读取session,反馈给用户。以后的每次访问,都会在原有session的基础上逐次加一反馈给用户。

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • C# 中 “$” 符号的作用以及用法详解

    这篇文章主要介绍了C# 中 “$” 符号的作用以及用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
  • Postman安装与使用详细教程 附postman离线安装包

    这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05