php中at @符号的作用使用说明
一次,下载别人的源码来看,看到无数@记号,开始以为是注释;后来发现@后面的语句也是会执行的。纳闷了,这个记号究竟是做什么的呢.....
随着学习的不断深入,总算是明白了。这个记号的作用有点类似于asp中的忽略错误"on error resume next "。他们的作用是一样的,当php解释器遇到@开头的语句时候,无论本行的语句是否执行成功,都会继续执行后续的语句,而且不会报错。但特别注意,@(at)记号只对当前行起作用哦。
希望关于@(at)的问题就在这打住把。
eg.下面这句话肯定报错
报错代码
代码如下 | 复制代码 |
<?php
|
然而,如果我们加上@(at)记号,就不会报错了,而且继续执行。
不报错代码
代码如下 | 复制代码 |
<?php |
继续执行下边的代码。
代码如下 | 复制代码 |
@$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 |
代码的意思就是通过表单以POST方式提交性别选项,分别是男性和女性,然后交给php接收post上来的数据,并传给sex变量。最后进行判断,如果是male则输出男性,female输出女性,其它情况输出未知。
提交后
文中提到的if.php可以到这里测试
然后就是switch,这个也很好理解,类似于if和elseif的组合,只不过遇到很多种条件需要判断时,switch回把代码变得很简洁直观。
PHP代码
代码如下 | 复制代码 |
switch (变量名) { case 值1: code to be executed if expression = label1; break; case 值2: code to be executed if expression = label2; break; default: code to be executed if expression 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
|
username就是我们cookie的名字了,而Ku_Andrew则是username的值,time()+3600就是一小时后该cookie过期。
现在我们用$_COOKIE来做一个实例
设置、读取cookie
代码如下 | 复制代码 |
<?php
|
如果想做出更复杂的判断,例如用户登陆等,我们可以在IF语句中的加入从数据库从检索出来的值。
Session:
与Cookie不同,Session是保存在服务器上的,同时Session会随着浏览器的关闭而自动灭亡,生命周期较短。在PHP上,我们使用session_start()函数来启动session;与设置cookie相同,我们必须在<html>标签之前使用这个函数。使用这个函数之后我们就可以开始设置我们的Session变量了。方法也是极为简单:用$_SESSION数组直接定义。完成了定义,在不使用的时候为了节约服务器资源,我们要关闭它。这时可以使用unset()函数或者session_destroy()函数;unset()是解除变量,session_destroy()则是彻底终结session。下面是代码片段。
Session设置、读取
代码如下 | 复制代码 |
<?php |
这是一个简单的网页计数器,通过设置pid来实现计数。第一次判断中,如果session为空,那么设置成一,并且读取session,反馈给用户。以后的每次访问,都会在原有session的基础上逐次加一反馈给用户。
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 这篇文章主要介绍了C# 中 “$” 符号的作用以及用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 许多的朋友对于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-31jQuery 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- 大概有如下步骤 新建项目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- 一、下载 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#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
- Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
- mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
Postman安装与使用详细教程 附postman离线安装包
这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05