php中switch语句的用法介绍

 更新时间:2016年11月25日 15:06  点击:1634
本文章详细的介绍了switch语句在php中用法,以及switch case在条件为0时的处理办法,有需要了解的同学可以参考一下。

Switch 语句
如果您希望有选择地执行若干代码块之一,请使用 Switch 语句。

使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。

语法

 代码如下 复制代码
switch (expression)
{
case label1:
  code to be executed if expression = label1;
  break; 
case label2:
  code to be executed if expression = label2;
  break;
default:
  code to be executed
  if expression is different
  from both label1 and label2;
}

实例
工作原理:

对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
如果没有 case 为真,则使用 default 语句

 代码如下 复制代码

    switch ($cps_sign) {
        case 'yiqifa':
        case 'chengguo':
        case 'roiyiqifa':
        case 'lkt':
        case 'fanli':
        case 'qqfanli':
        case 'weiyi':
        case 'yoyi':
            $sql = "INSERT into sa_cps_list (`uv`,`s_time`,`cps`,`url`) VALUES ('{$uv}',{$timestamp},'{$cps_sign}','{$url}')";
            echo $sql;exit();
            mysql_query($sql);
            break;
        default:
            break;
    }


仔细看了一下程序,莫非是switch和case惹的祸?于是,写DEMO检测。
//输出结果为:bool(true) bool(false) xxx

 代码如下 复制代码

var_dump(""==0);   
var_dump(""===0);

$errid = '';
switch ($errid) {
    case 0 :
        echo "xxx";
        break;
    default:
        echo "yyy";
}

真相大白了,原来 switch/case结构中,比较case值用的是==而不是===。这样,空就和0相等了,我收到的结果也当然就是错误的了。
没办法,程序不想改,毕竟多条件的时候switch/case要比一堆if让人看着舒心。想办法吧。呵呵。

 代码如下 复制代码

$result = '';
if(is_numeric($err_id) === false) { 
$result .= '宕机或超时,没有返回值';
return $result;
}
switch ($err_id) {
    case xxx :
        ..........
}

问题解决了,先判断一下返回值是否是数值,如果不是数值的话,直接return。
以后写switch/case判断数字的时候一定要小心,尤其是有0这个败家值存在的时候

switch 语句和 elseif 语句的比较
在 switch 语句中,条件只求一次,然后和每个 case 比较,而在 elseif 语句中,条件会再次求值。如果你的条件比较复杂,或者是多次循环,用 switch 语句速度会更加快些

有时我们要输出字符中的变量我们可能会用到dump_var但如果我们想自动输出,我们就需要算定函数了。
 代码如下 复制代码

<?php
function show_var($var) {
if (is_scalar($var)) {
echo $var;
} else {
var_dump($var);
}
}
$pi = 3.1416;
$proteins = array("hemoglobin", "cytochrome c oxidase", "ferredoxin");

show_var($pi);
// 打印:3.1416

show_var($proteins)
// 打印:
// array(3) {
// [0]=>
// string(10) "hemoglobin"
// [1]=>
// string(20) "cytochrome c oxidase"
// [2]=>
// string(10) "ferredoxin"
// }
?>


描述
bool is_scalar ( mixed $var )
如果给出的变量参数 var 是一个标量, is_scalar() 返回 TRUE,否则返回 FALSE。

标量变量是指那些包含了 integer、float、string 或 boolean的变量,而 array、object 和 resource 则不是标量。


Note:

尽管当前的 resource 类型是居于整数的,但 is_scalar() 不会把它们当作是标量,因为资源是抽象数据类型。不能依赖于执行细节,因为它可能会改变。

本文章来告诉你如何在php5中的php.ini中配置session的详细教程,包括了路径等等一些相关的操作,有需要了解的同学可参考一下。

php.ini中有关session的一些设定会影响到session函数的使用,以php5版本为例,我们来了解一下php.ini中有关session的设定。
;处理session存取的模式(预设:files)
session.save_handler = files
;session档案存放路径(预设:/tmp)
session.save_path = /tmp
;session使用cookie的功能(预设:启动 1)
session.use_cookies = 1
;session的名字(预设:PHPSESSID)
session.name = PHPSESSID
;自动启动(预设:关 0,此处可以改为1)
session.auto_start = 0
;session使用cookie的生存期,以秒为单位(预设:随浏览器关闭而消失 0)
session.cookie_lifetime = 0
;session使用cookie的路径(预设:与domian相同或根路径 /)
session.cookie_path = /
;session使用cookie的域名称(预设:空)
session.cookie_domain =
;处理连续资料的方式,本功能只有WDDX模组或PHP内部使用(预设:php)
session.serialize_handler = php
;按千分之一的比率进行垃圾收集
;垃圾收集的处理几率(预设:1)
session.gc_probability = 1
;设置进程比率,(php5新增参数,预设:1000)
session.gc_divisor = 1000
;(垃圾收集)被处理前的生存期(预设:1440[秒])
session.gc_maxlifetime = 1440
;PHP 4.2和以前的版本都有个BUG,即使你禁止了”允许注册全局变量”.仍然可以让你在全局变量范围中初始化一个SESSION的值
;PHP 4.3 和以后的版本会发出相应的警告,你可以禁止警告.PHP5中,只有你打开了bug_compat_42(=ON),警告才会显示.
session.bug_compat_42,0
session.bug_compat_warn = 1
;session在重新整理时检查session是否还存在(预设:空)
session.referer_check =
;特别设定session值的长度(预设:关)
session.entropy_length = 0
;特别设定session值的文件
session.entropy_file =
;使用cache限制器(预设:不要cache)
session.cache_limiter = nocache
;使用cache的生存期
session.cache_expire = 180
;使用sid值(session_id)传送模式(基于安全,预设:关)
session.use_trans_sid = 0
;选择一个HASH函数,0为MD5(128比特强度),1为SHA-1(160比特强度)
session.hash_function = 0
;定义当转换2进制hash数据为一些可读的数据时,每个字符存储多少个比特.
;4 比特: 0-9, a-f
;5 比特: 0-9, a-v
;6 比特: 0-9, a-z, A-Z, “-”, “,”
session.hash_bits_per_character = 5
;URL重指向的标签
url_rewriter.tags = “a=href,area=href,frame=src,input=src,form=fakeentry”
对以上设置进行修改以后应该重启Apache服务器,以加载以上的修改。

配置session其实不难只要大家好好仔细的看看就KO了。

对于PHP程序员来说,最为难掌握的一点要数PHP抽象类应用这一块知识点。作为一个新手其实也还没有到要用面向对象的知识去编程,但以后进行开发,使用类进行封装或者使用接口之类,把程序进行各种模块式的开发,这当然是必然的。

在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是一个模板,它指示它的子方法必须要实现的一些行为。

PHP抽象类应用的定义:

 代码如下 复制代码

abstract class ClassName{

}

PHP抽象类应用要点:

  1.定义一些方法,子类必须完全实现这个抽象中所有的方法

  2.不能从抽象类创建对象,它的意义在于被扩展

  3.抽象类通常具有抽象方法,方法中没有大括号

PHP抽象类应用重点:

  1.抽象方法不必实现具体的功能,由子类来完成

  2.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义

  3.抽象类的方法可以有参数,也可以为空

  4.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数

PHP抽象类应用示例:

abstract public function_name(); //注意没有大括号

PHP抽象类规则:

某个类只要至少含有一个抽象方法,就必须声明为抽象类
抽象方法,不能够含有函数体
继承抽象类的子类,实现抽象方法的,必须跟该抽象方法具有相同或者更低的访问级别
继承抽象类的子类,如果不实现所有抽象方法,那么该子类也为抽象类
 

作为演示,我们来实现一个简单的抽象类:计算矩形的面积。这个矩形可以从形状类扩展。

 代码如下 复制代码


< ?PHP  
abstract class Shape {  
abstract protected function get_area();  
//和一般的方法不同的是,这个方法没有大括号  
//你不能创建这个抽象类的实例:$Shape_Rect= new Shape();
}  
class Rectangle extends Shape{  
private $width;  
private $height;  
function __construct($width=0,
$height=0){  

  $this->width=$width;  
  $this->height=$height;  
}  
function get_area(){  
  echo ($this->width+$this->height)*2;  
}  
}  
$Shape_Rect = new Rectangle(20,30);  
$Shape_Rect->get_area();  
?>  

这也算是一个简单的例子,基本上可以说明PHP中抽象类的用法了,其他的不想多说了。个人觉得抽象类一般在大的项目才会用吧,因为我觉得它实在是要遵守的”规矩”太多了,用起来不方便!当然这只是我的意见。还想多说一些,PHP抽象类应用是单继承的,也就是说你只能从一个类继承,而不能一个类继承了A类,又继承B类,如果要实现这样的功能,得使用接口相关的知识了,在此暂时不讨论PHP接口的知识!一句话:单继承多接口中!

本文章简单的讲述了关于在php中防xss攻击和sql注入详解,有需了解的朋友可以参考一下下。

XSS攻击

 代码如下 复制代码

任意执行代码
文件包含以及CSRF.
}


关于SQL攻击有很多文章还有各种防注入脚本,但是都不能解决SQL注入的根本问题
见代码:

 代码如下 复制代码


<?php
mysql_connect("localhost","root","123456")or die("数据库连接失败!");
mysql_select_db("test1");
$user=$_post['uid'];
$pwd=$_POST['pass'];
if(mysql_query("SELECT * from where
admin
= `username`='$user' or `password`='$pwd'"){
echo "用户成功登陆..";
} eles {
echo "用户名或密码出错";
}
?>

很简单的一段代码,功能是用于检测用户名或密码是否正确,可是在一些恶意攻击者中提交一些敏感代码.后果可想而知.. post判断注入的方式有2种。
1.在form表单的文本框输入 "or‘1'=1"或者"and 1=1"
在查询数据库的语句就应该是:
SELECT admin from where login = `user`=''or‘1'=1' or `pass`=‘xxxx'
当然也不会出现什么错误,因为or在sql的语句中代表和,或的意思。当然也会提示错误。
当时我们已经发现了可以执行SQL语句之后就可以查询当前表的所有信息。例如:正确的管理员账户和密码进行登录入侵。。
修复方式1:
使用javascript脚本过滤特殊字符(不推荐,指标不治本)
如果攻击者禁用了javascript还是可以进行SQL注入攻击。。
修复方式2:
使用mysql的自带函数进行过滤。
见代码:

 代码如下 复制代码

<?php
// 省略连接数据库等操作。。
$user=mysql_real_escape_string($_POST['user']);
mysql_query("select * from admin whrer `username`='$user'");
?>

既然前面说道了xss攻击,我们再来说说XSS攻击以及防范吧。。
提交表单:

 代码如下 复制代码

<form method="post" action="">
<intup tyep="text" name="test">
<intup tyep="submit" name="sub" value="提交">
</form>

接收文件:

 

 代码如下 复制代码

if(empty($_POST['sub'])){
echo $_POST['test'];
}

很简单的一段代码,在这里只是模拟了下使用场景..
加入攻击者提交

 代码如下 复制代码
<script>alert(document.cookie);</script>

在返回的页面就应该显示当前页面的cookie信息。
我们可以运用到某些留言板上(提前是没过滤的),然后当管理员审核改条信息时盗取COOKIE信息,并发送到攻击者的空间或者邮箱。。攻击者可以使用cookie修改器进行登陆入侵了。。
当然解决方案也有很多。。下面就介绍一个最常用的方式吧。
修复方案1:使用javascript进行转义
修复方案2:使用php内置函数进行转义
代码如下:

 代码如下 复制代码
[code]
if(empty($_POST['sub'])){
$str=$_POST['test'];
htmlentities($srt);
echo $srt;
}
[html]

 
好了,关于SQL注入攻击和XSS攻击的案例与修复方法就讲的差不多了。

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • mysql中获取一天、一周、一月时间数据的各种sql语句写法

    创建表:复制代码 代码如下:create table if not exists t( id int, addTime datetime default '0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07...2014-05-31
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • C#条件语句、循环语句(if、while)

    这篇文章主要介绍了C#条件语句、循环语句(if、while)的用法,学习c#的朋友可以参考下...2020-06-25
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • C++中cin的用法详细

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

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • c# 循环语句的使用方法

    这篇文章主要介绍了c# 循环语句的使用方法,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • Mysql 原生语句中save or update 的写法汇总

    背景&#8195;&#8195;在平常的开发中,经常碰到这种更新数据的场景:先判断某一数据在库表中是否存在,存在则update,不存在则insert。 如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢? &#8195;...2015-03-15
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • 示例详解react中useState的用法

    useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state,接下来通过一个示例来看看怎么使用 useState吧...2021-06-04
  • jquery if条件语句的写法

    下面小编就为大家带来一篇jquery if条件语句的写法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20