PHP 四种URL解析处理方式的例子

 更新时间:2016年11月25日 14:59  点击:2069
在已知URL参数的情况下,我们可以根据自身情况采用$_GET来获取相应的参数信息($_GET[\\\'name\\\']);那,在未知情况下如何获取到URL上的参数信息呢?

第一种、利用$_SERVER内置数组变量

相对较为原始的$_SERVER['QUERY_STRING']来获取,URL的参数,通常使用这个变量返回的会是类似这样的数据:name=tank&sex=1

如果需要包含文件名的话可以使用$_SERVER["REQUEST_URI"](返回类似:/index.php?name=tank&sex=1)


第二种、利用pathinfo内置函数
01 <?php
02 $test = pathinfo("http://localhost/index.php");
03 print_r($test);
04 /*
05 结果如下
06 Array
07 (
08     [dirname] => http://localhost //url的路径
09     [basename] => index.php  //完整文件名
10     [extension] => php  //文件名后缀
11     [filename] => index //文件名
12 )
13 */
14 ?>


第三种、利用parse_url内置函数
01 <?php
02 $test = parse_url("http://localhost/index.php?name=tank&sex=1#top");
03 print_r($test);
04 /*
05 结果如下
06 Array
07 (
08     [scheme] => http //使用什么协议
09     [host] => localhost //主机名
10     [path] => /index.php //路径
11     [query] => name=tank&sex=1 // 所传的参数
12     [fragment] => top //后面根的锚点
13 )
14 */
15 ?>


第四种、利用basename内置函数
1 <?php
2 $test = basename("http://localhost/index.php?name=tank&sex=1#top");
3 echo $test;
4 /*
5 结果如下
6 index.php?name=tank&sex=1#top
7 */
8 ?>


另外,还有就是自己通过正则匹配的处理方式来获取需要的值了。这种方式较为精确,效率暂不考虑。。。

下面拓展实践下正则处理方式:
01 <?php
02 preg_match_all("/(\w+=\w+)(#\w+)?/i","http://localhost/index.php?name=tank&sex=1#top",$match);
03 print_r($match);
04 /*
05 结果如下
06 Array
07 (
08     [0] => Array
09         (
10             [0] => name=tank
11             [1] => sex=1#top
12         )
13     [1] => Array
14         (
15             [0] => name=tank
16             [1] => sex=1
17         )
18     [2] => Array
19         (
20             [0] =>
21             [1] => #top
22         )
23 )
24 */
25 ?>


路途漫漫...还有待继续挖掘...

下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。

有如下4个代码示例,你认为他们创建对象,并获得成员变量的速度排序是怎样的?

1:将成员变量设置为public,通过赋值操作给成员变量赋值,直接获取变量

 

 代码如下 复制代码

class Foo {
  public $id;
 }
 
 $data = new Foo;
 $data->id = 10;
 echo $data->id;2:将成员变量设置为public,通过构造函数设置成员变量的值,直接获取变量

        class Foo2 {
  public $id;
  public function __construct($id) {
   $this->id = $id;
  }
 }
 
 $data = new Foo2(10);
 echo $data->id;


3:将成员变量设置为protected,通过构造函数设置成员变量的值,通过魔术方法获取变量

 

 代码如下 复制代码

     class Foo3 {
  protected $id;
  public function __construct($id) {
   $this->id = $id;
  }
 
  public function getId() {
   return $this->id;
  }
 }
 $data = new Foo3(10);
 echo $data->getId();


4:将成员变量设置为protected,通过构造函数设置成员变量的值,通过成员方法获取变量

 

 代码如下 复制代码

     class Foo4 {
  protected $id;
  public function __construct($id) {
   $this->id = $id;
  }//www.111cn.net
 
  public function __get($key) {
   return $this->id;
  }
 }
 $data = new Foo4(10);
 echo $data->id;


按执行速度快慢排序: 1243
咱们先看其opcode:

 代码如下 复制代码

1:

    1  ZEND_FETCH_CLASS 4  :4  'Foo'
 2  NEW         $5 :4
 3  DO_FCALL_BY_NAME   0         
 4  ASSIGN         !0, $5
 5  ZEND_ASSIGN_OBJ   !0, 'id'
 6  ZEND_OP_DATA    10
 7  FETCH_OBJ_R   $9 !0, 'id'
 8  ECHO            $92:

 1  ZEND_FETCH_CLASS 4  :10 'Foo2'
 2  NEW               $11 :10
 3  SEND_VAL           10
 4  DO_FCALL_BY_NAME  1
 5  ASSIGN        !1, $11
 6  FETCH_OBJ_R   $14 !1, 'id'
 7  ECHO            $143:

 1  ZEND_FETCH_CLASS 4  :15 'Foo3'
 2  NEW            $16 :15
 3  SEND_VAL        10
 4  DO_FCALL_BY_NAME   1         
 5  ASSIGN         !2, $16
 6  ZEND_INIT_METHOD_CALL !2, 'getId'
 7  DO_FCALL_BY_NAME  0  $20    
 8  ECHO           $204:

 1  ZEND_FETCH_CLASS 4  :21 'Foo4'
 2  NEW            $22 :21
 3  END_VAL         10
 4  DO_FCALL_BY_NAME  1         
 5  ASSIGN           !3, $22
 6  FETCH_OBJ_R    $25 !3, 'id'
 7   ECHO      $25


根据上面的opcode,参照其在zend_vm_execute.h文件对应的opcode实现,我们可以发现什么?

一、PHP内核创建对象的过程分为三步:

1.ZEND_FETCH_CLASS 根据类名获取存储类的变量,其实现为一个hashtalbe EG(class_table) 的查找操作
2.NEW 初始化对象,将EX(call)->fbc指向构造函数指针。
3.调用构造函数,其调用和其它的函数调用是一样,都是调用zend_do_fcall_common_helper_SPEC
二、魔术方法的调用是通过条件触发的,并不是直接调用,如我们示例中的成员变量id的获取(zend_std_read_property),其步骤为:

1.获取对象的属性,如果存在,转第二步;如果没有相关属性,转第三步
2.从对象的properties查找是否存在与名称对应的属性存在,如果存在返回结果,如果不存在,转第三步
3.如果存在__get魔术方法,则调用此方法获取变量,如果不存在,报错
回到排序的问题:

一、第一个和第二个的区别是什么?

第二个的opcode比第一个要少,反而比第一个要慢一些,因为构造函数多了参数,多了一个参数处理的opcode。参数处理是一个比较费时的操作,当我们在做代码优化时,一些不必要的参数能去掉就去掉;当一个函数有多个参数时,可以考虑通过一个数组将其封装后传递进来。

二、为啥第三个最慢?

因为其获取参数其本质上是一次对象成员方法的调用,方法的调用成本高于变量的获取

三、为啥第四个比第三个要快?

因为第四个的操作实质上获取变量,只不过其内部实现了魔术方法的调用,相对于用户定义的方法,内部函数的调用的效率会高。因此,当我们有一些PHP内核实现的方法可以调用时就不要重复发明轮子了。

四、为啥第四个比第二个要慢?

因为在PHP的对象获取变量的过程中,当成员变量在类的定义不在在时,会去调用PHP特有的魔术方法__get,多了一次魔术方法的调用。

总结一下:

1.使用PHP内置函数
2.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
3.尽量少用魔术方法 -- 除非有必要,不要用框架,因为框架都有大量的魔术方法使用。
4.在性能优先的应用场景中,将成员变量不失为一种比较好的方法,当你需要用到OOP时。
5.能使用PHP语法结构的不要用函数,能使用内置函数的不要自己写,能用函数的不要用对象

在php中浮点数是一个非常有用的数据类型了,但是他同样也给我们带来很多的细节问题,下面我来举个实例来分析PHP浮点数的一个常见问题

先看看这段代码:

 代码如下 复制代码

<?php
    $f = 0.58;
    var_dump(intval($f * 100)); //为什么输出57
?>

为什么输出是57?

我相信有很多的同学有过这样的疑问,bugs.php.net上经也常有人问。

要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754):

浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).

符号位:最高位表示数据的正负,0表示正数,1表示负数。

指数位:表示数据以2为底的幂,指数采用偏移码表示

尾数:表示数据小数点后的有效数字.

这里的关键点就在于, 小数在二进制的表示, 关于小数如何用二进制表示, 大家可以百度一下, 我这里就不再赘述, 我们关键的要了解, 0.58 对于二进制表示来说, 是无限长的值(下面的数字省掉了隐含的1)..


0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

而两者的二进制, 如果只是通过这52位计算的话,分别是:


0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995

至于0.58 * 100的具体浮点数乘法, 我们不考虑那么细, 有兴趣的可以看(Floating point), 我们就模糊的以心算来看… 0.58 * 100 = 57.999999999

那你intval一下, 自然就是57了….

可见, 这个问题的关键点就是: “你看似有穷的小数, 在计算机的二进制表示里却是无穷的”

so, 不要再以为这是PHP的bug了, 这就是这样的.

本文章介绍从url带参数传值与在表单中传值的获取方法,希望本文章对各位同学会带来帮助。

例子、单表单内容发送和接收

我们都是如果要实现内容发送或者接收我们首先都需要一个表单也就是form标签 下面这个是前端的html代码

 代码如下 复制代码

<form  action="1.php">
<p>Get 发送方式:
<input type="text" name="wz"/></p>

<p>Post 发送发送:
<input type="text" name="wz1"/></p>

<input type="submit" value="OK"/>
</form>

 

后台的php就是从上面的name内的值获取需要的内容

 

 代码如下 复制代码

<?php
$a = $_GET ['wz'];
if($a==null){echo "对方没输入"."</br>";}else{
echo "我是GET接收方式:".$a."</br>";}

$b = $_GET ['wz1'];
if($b==null){echo "对方没输入"."</br>";}else{
echo "我是POST接收方式:".$b."</br>";}
?>


这里的php意思以get模式来获取标签内属性name里面的值

然而echo 在php中就是打印出来 if就是先加以判断~ 注意:如果表单是post传值我们必须使用$_POST才可以接受数据

例子、url传值

 这个是要发送的php代码

   

 代码如下 复制代码

<?php
include_once('zq/db.php');
$sql = "select * from wd_sql";
$query=mysql_query($sql);
 $i = 1;
 while ($result = mysql_fetch_array($query)) {
 $x = $i++;
   "<br><a href='del.php?xx=".$result['id']."&ccxc=wd_sql'>删除</a>"//在这里实现了传值
}
?>


这个是接收值的php

 代码如下 复制代码

<?php
$uid = $_GET['xx'];
$db_sql = $_GET['ccxc'];
if(mysql_query($sql) == 1)
{echo "<script>alert('删除成功!');history.go(-1);</script>";}
?> 

php中更新数据中的记录使用update的sql语句,这个只要在php连接数据库之后执行sql语句即可,下面我们一起来看个例子。

sql有许多对数据库操作的语句。但是常见和比较需要的是这么几个语句 。UPDATE 语句用于在数据库表中修改数据。


UPDATE table_name  SET column1 = value1,column2 = value2 ...  WHERE column = some_value


例如,将user表中用户“张三”的密码修改为“ abc123 ”,年龄修改为“ 45 ”,SQL语句可以是这样:

UPDATE user SET password='abc123' , age='45'  WHERE  name='张三'

注意:UPDATE...SET...一般与WHERE子句一起使用,否则将修改数据表中的全部记录!

UPDATE 语句的例子

 代码如下 复制代码

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("my_db", $con);
mysql_query("UPDATE Persons SET Age = '36'
WHERE FirstName = 'Peter' AND LastName = 'Griffin'");
mysql_close($con);
?>

批量更新数据

 

 代码如下 复制代码

$sql="select * from booking_tables_info1";
  $query=$db->query($sql);
if($_POST['btnSave']){
   $checkbox = $_POST['range'];
/*如果要获取全部数值则使用下面代码*/
  for($i=0;$i<=count($checkbox);$i++)
   {
   if(!is_null($checkbox[$i]))
    {
     $chechvalue.=$checkbox[$i];
     $str="update booking_tables_info1 set ispass=1 where info_id=$chechvalue";
     $db->query($str);
    }
   }
   echo "<script>alert('更新成功!');window.location.href='http://blog.163.com/sun_jian_zhang/blog/memberManager.php';</script>";

}
?>

<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta name="GENERATOR" content="PHPEclipse 1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>会员管理页面</title>
 <script type="text/javascript" language="javascript">
        function selectBox(selectType){
        var checkboxis = document.getElementsByName("range[]");
        if(selectType == "reverse"){
            for (var i=0; i<checkboxis.length; i++){
                //alert(checkboxis[i].checked);
                checkboxis[i].checked = !checkboxis[i].checked;
            }
        }
        else if(selectType == "all")
        {
            for (var i=0; i<checkboxis.length; i++){
                //alert(checkboxis[i].checked);
                checkboxis[i].checked = true;
            }
        }
     }
</script>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
<form action="" method="post">
  <table border=1>
    <tr>
      <td>会员编号</td><td>卡型号</td><td>卡号< /td><td>名字</td><td>性别</td><td>年龄< /td><td>爸爸电话</td><td>妈妈电话</td><td>联系方 式</td><td>住址</td><td>宣言</td><td>是否通 过</td><td>参与时间</td><td><input type="button" value="全选" onclick="selectBox('all')"/><input type="button" value="反选" onclick="selectBox('reverse')"/></td>
    </tr>www.111cn.net
  <?php
      while($row=$db->fetch_array($query)){
      ?>
    <tr>
      <td><?php echo $row['info_id']?></td><td><?php echo $row['cardtype']?></td><td><?php echo $row['cardno']?></td> <td><?php echo $row['name']?></td><td><?php if($row['sex']==1){echo "男";}else{echo "女";}?></td><td><?php echo $row['age']?></td> <td><?php echo $row['fathermobile']?></td><td><?php echo $row['mothermobile']?></td><td><?php echo $row['tel']?></td> <td><?php echo $row['address']?></td><td><?php echo $row['enounce']?></td><td><?php echo $row['ispass']?></td><td><?php echo $row['jointime']?></td><td>
      <input type="checkbox" name="range[]" value="<?php echo $row['info_id'] ?>"/>


  </td>
    </tr>
      <?php
  }
    ?>
  </table>
<br>
<input type="submit" name="btnSave" value="批量审核通过"/>
</form>
</body>
</html>

注意在批量更新时要注意:<input type="checkbox" name="range[]" value="<?php echo $row['info_id'] ?>"/>中的name为range[]以数组形式。

[!--infotagslink--]

相关文章

  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • php常量详细解析

    一、常量常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。 常量名和其它任何 PHP 标签遵循...2015-10-30
  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • PHP用DOM方式处理HTML之《Simple HTML DOM》

    近经常需要采集一些网上的数据,发现一个PHP处理HTML的利器 simple html dom,看了一下文档,使用非常方便,关键是能够用CSS选择器来访问DOM树,和jquery相似,实在是难得的利器...2016-11-25
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • BAT批处理判断服务是否正常运行的方法(批处理命令综合应用)

    批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。这篇文章主要介绍了BAT批处理判断服务是否正常运行(批处理命令综合应用),需要的朋友可以参考下...2020-06-30
  • ps中怎么设置垂直罗马对齐方式?垂直罗马对齐方式设置方法

    photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
  • PHP file_get_contents设置超时处理方法

    file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。今天说的这篇是讲超时的,确实在...2013-10-04
  • C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • Python同时处理多个异常的方法

    这篇文章主要介绍了Python同时处理多个异常的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-29
  • C#异常处理中try和catch语句及finally语句的用法示例

    这篇文章主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下...2020-06-25
  • python用moviepy对视频进行简单的处理

    这篇文章主要介绍了python如何用moviepy对视频进行简单的处理,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下...2021-03-11
  • JS跨浏览器解析XML应用过程详解

    这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
  • C# 如何解析获取Url参数值

    这篇文章主要介绍了C# 如何解析获取Url参数值,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-09-01
  • C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下...2020-06-25
  • error LNK2019: 无法解析的外部符号 问题的解决办法

    error LNK2019: 无法解析的外部符号 问题的解决办法,需要的朋友可以参考一下...2020-04-25
  • JavaScript实现解析INI文件内容的方法

    这篇文章主要介绍了JavaScript实现解析INI文件内容的方法,结合实例形式分析了javascript通过自定义函数实现针对ini文件解析操作的相关处理技巧,需要的朋友可以参考下...2016-11-22
  • javascript 判断页面访问方式电脑或者移动端

    这篇文章主要介绍了 判断页面访问方式电脑或者移动端的相关资料,这里提供了三种方法,需要的朋友可以参考下...2016-10-03
  • C#网络请求与JSON解析的示例代码

    这篇文章主要介绍了C#网络请求与JSON解析的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25