php 获取当前页面地址

 更新时间:2016年11月25日 15:02  点击:2156
在php中获取当前页面完整地址是需要通过各种函数与参考组合起来的,包括域名或主机地址 网页地址 网址参数 用户代理 端口号等。

基于函数了解


PHP实现:

 代码如下 复制代码

//获取域名或主机地址
echo $_SERVER['HTTP_HOST']."<br>"; #localhost

//获取网页地址
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php

//获取网址参数
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5

//获取用户代理
echo $_SERVER['HTTP_REFERER']."<br>";

//获取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5

//包含端口号的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
#http://localhost:80/blog/testurl.php?id=5

//只取路径
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
echo dirname($url);

实例

 代码如下 复制代码

/**
 * 获取当前页面地址
 *
 * @author 111cn.net
 */
function getPageUrl() {
 $pageURL = 'http';

 if ($_SERVER["HTTPS"] == "on") {
  $pageURL .= "s";
 }
 $pageURL .= "://";

 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}

本文章来给php初学者介绍一个不错的php mysql入门实例,我们连接数据库并实现显示出数据库中的记录实例,各位朋友可参考。

连接到一个 MySQL 数据库

在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接。

在 PHP 中,这个任务通过 mysql_connect() 函数完成。

语法

mysql_connect(servername,username,password);

在下面的例子中,我们在一个变量中 ($con) 存放了在脚本中供稍后使用的连接。如果连接失败,将执行 "die" 部分:

 代码如下 复制代码

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// some code

?>

有了上面基础之后我们就可以查询数据库并显示了

 代码如下 复制代码


<?php
mysql_connect("localhost","root","");
mysql_select_db("cinema");
$_sql="select * from `t_hall`";
mysql_query("set names utf8");//编码设置为utf8
$query=mysql_query($_sql);
echo "<table align='center' border='1' cellspacing='0' width='550' >";
echo "<tr><td>影厅编号</td><td>大厅名</td><td>座位行</td><td>座位列</td></tr>";
while($row=mysql_fetch_array($query))
{
//从数据库查询出来的字段
//将数据放到html的表格中

echo "<tr onclick='GetText()'><td>{$row['HID']}</td><td>{$row['HHall']}</td><td>{$row['HSeatline']}</td><td>{$row['HSeatrow']}</td></tr>";
}
echo "</table>";
?>

在php中url处理函数有很多,如有:http_build_query,compact,urldecode、urlencode,parse_url,rawurldecode等等函数。

http_build_query

(PHP 5) http_build_query — 生成 URL-encode 之后的请求字符串

 代码如下 复制代码

<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');echo http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>


compact

array compact ( mixed $varname [, mixed $... ] )
(PHP 4, PHP 5)  compact — 建立一个数组,包括变量名和它们的值

 代码如下 复制代码

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";
$result = compact("city", "state", "event");
// array('city'=>'"San Francisco"','state'=>'CA','event' => "SIGGRAPH")
?>
-------------

$qs=compact('province','city','name');
foreach($qs as $key => $value){
    if(!$value){
        unset($qs[$key]);
    }
}
$url='something/search/?'.http_build_query($qs) ;


urldecode、urlencode
下面来看介绍与实例。
parse_url($str url);
把url转换成数组

 代码如下 复制代码

*/
print_r(parse_url("www.111cn.net"));       //解析url并输出返回数组

/*

url 专用格式字符串还原成普通字符串。

语法: string rawurldecode(string str);

返回值: 字符串

函数种类: 编码处理
 
内容说明


本函数将字符串解码。从 url 的字符串专用格式解成普通字符串。详细的编码解码信息及规格文件可以参考 rfc 1738。

 代码如下 复制代码

*/

echo rawurldecode('foo%20bar%40baz');      //输出foo bar@baz
/*

string rawurlencode ( string str )


返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 rfc 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 url 定界符,同时保护 url 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。例如,如果你想在 ftp 的 url 中包含密码:

 

 代码如下 复制代码

*/
$str="http://www.111cn.net";       //定义字符串
$result=rawurlencode($str);      //对指定字符串编码
echo $result;

/*
urldecode()
url解码
*/         //输出结果

$str="http%3a%2f%2fwww.111cn.net";
$result=urldecode($str);
echo $result;

/*
urlencode()
url编码

*/

$str="http://www.111cn.net";       //定义字符串
$result=urlencode($str);       //对指定字符串编码
echo $result;         //输出结果

在php中遍历循环读出数组的方法有几种,foreach,for,list,each,while都是可以的,只是那种更适合用来遍历数组了。

foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢?

比如:

 代码如下 复制代码

<?php
$colors= array('red','blue','green','yellow');
foreach ($colors as $color){
//add your codes
}
?>

例2

$capitals= array("Ohio"=> "Columbus","Towa"=> "Des Moines","Arizona"=> "Phoenix");
foreach($capitals as  $key=> $val){
//add your codes
}
 

while()

while() 通常和 list(),each()配合使用。

#example2:

 代码如下 复制代码

<?php
$colors = array('red','blue','green','yellow');

while(list($key,$val) = each($colors)) {
 echo "Other list of $val.<br />";
}
?>

显示结果:

Other list of red.
Other list of blue.
Other list of green.
Other list of yellow.

3. for()
#example3:

 代码如下 复制代码


<?php
$arr = array ("0" => "zero","1" => "one","2" => "two");

for ($i = 0;$i < count($arr); $i++) {
 $str = $arr[$i];
 echo "the number is $str.<br />";
}
?>
显示结果:

the number is zero.
the number is one.
the number is two.

========= 以下是函数介绍 ==========

key()
mixed key(array input_array)

key()函数返回input_array中位于当前指针位置的键元素。

#example4

 代码如下 复制代码


<?php
$capitals = array("Ohio" => "Columbus","Towa" => "Des Moines","Arizona" => "Phoenix");
echo "<p>Can you name the capitals of these states?</p>";
while($key = key($capitals)) {
 echo $key."<br />";
 next($capitals);
//每个key()调用不会推进指针。为此要使用next()函数
}
?>

Can you name the capitals of these states?
Ohio
Towa
Arizona

each() 函数遍历数组

例子 1

 代码如下 复制代码

<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");
print_r (each($people));
?>

输出:

Array ( [1] => Peter [value] => Peter [0] => 0 [key] => 0 )

子 2
each() 经常和 list() 结合使用来遍历数组。本例与上例类似,不过循环输出了整个数组:

 代码如下 复制代码

<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");

reset($people);

while (list($key, $val) = each($people))
  {
  echo "$key => $val<br />";
  }
?>

输出:

0 => Peter
1 => Joe
2 => Glenn
3 => Cleveland


多维数组的递归遍历

 代码如下 复制代码

<?php
/*
*  -------------------------------------------------
*   Author :
*   Url    : www.111cn.net*   Date   : 2011-03-09
*  -------------------------------------------------
*/
function arr_foreach ($arr)
{
 if (!is_array ($arr))
 {
  return false;
 }
 
 foreach ($arr as $key => $val )
 {
  if (is_array ($val))
  {
   arr_foreach ($val);
  }
  else
  {
   echo $val.'<br/>';
  }
 }
}

$arr1 = array (1=>array(11,12,13,14=>array(141,142)),2,3,4,5);

echo '<pre>';
print_r($arr1);
echo '<pre>';

arr_foreach ($arr1);
?>

结果

Array
(
    [1] => Array
        (
            [0] => 11
            [1] => 12
            [2] => 13
            [14] => Array
                (
                    [0] => 141
                    [1] => 142
                )

        )

    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
11
12
13
141
142
2
3
4
5

单例模式是php中一个为了简化大家开发及重复调用的一个功能,下面我来给各位朋友详细介绍单例模式用法。

1.单例模式的概念

顾名思义,单例模式只有一个实例,而且自行实例化,向全局提供这个实例。需要强调的是,单例模式

确保某个类只能有一个实例!

2.单例模式的三个要点

(1)需要一个静态变量来保存类的唯一实例

 代码如下 复制代码

private static $_instance;

(2)构造函数和克隆函数必须为私有的,防止用户创建对象和复制实例对象

 代码如下 复制代码

private function __construct()
{
//私有化默认构造方法,防止外界直接实例化
}
private function __clone()
{
//私有化克隆方法,防止用户复制实例
}

(3)必须提供一个公共的静态方法(一般为getInstance),从而返回一个唯一实例的引用

 代码如下 复制代码
public static function getInstance()   
{   
    if(! (self::$_instance instanceof self) )  
    {   
        self::$_instance = new self();   
    } 
    return self::$_instance;   
 
}

3.php中使用单例模式的原因
       PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资

源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译

型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可

以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静

态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,

这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个

应用场景并需要共享同一对象资源时是非常有意义的。

4.如何实现单例模式

 代码如下 复制代码

<?php
/**
 * 单例模式示例:Demo
 */
class Demo{
 //静态成员变量,用来保存全局实例
 private static $_instance;
 //私有化构造方法,保证外界不能直接实例化
 private function __construct(){

 }
 //私有化克隆方法,防止用户复制实例
 private function __clone(){

 }
 //返还此类的唯一实例
 public function getInstance(){
  if(!(self::$_instance instanceof self))
  {
   self::$_instance = new self();
  }
  return self::$_instance;
 }
 //这是第一个测试方法
 public function test1Function(){
  echo '这是第一个测试方法';
 }
 //这是第二个测试方法
 public function test2Function(){
  echo '这是第二个测试方法';
 }
}
//正确的使用方法
@$demo = Demo::getInstance();
$demo->test1Function();
$demo->test2Function();
//这样实例化会出错,因为构造方法为private
//$demo_new = new Demo;
//复制demo会出错,因为默认的clone方法为private
// $demo_clone = clone $demo;
?>

5.单利模式的应用场合


(1)应用与数据库的交互,多用于数据库的连接
(2)如果系统中需要一个类来全局控制配置信息,用单例模式可以很方便的实现


1、普通的数据库访问例子:

 代码如下 复制代码

<?php
......
//初始化一个数据库句柄
$db = new DB(...);

//添加用户信息
$db->addUserInfo(...);

......

//在函数中访问数据库,查找用户信息
function getUserInfo()
{
    $db = new DB(...);//再次new 数据库类,和数据库建立连接
    $db = query(....);//根据查询语句访问数据库
}

?>

2、应用单例模式对数据库进行操作:

 代码如下 复制代码


<?php

class DB 

    private $_db; 
    private static $_instance; 
 
    private function __construct(...) 
    { 
        $this->_db = pg_connect(...);//postgrsql 
    } 
 
    private function __clone() {};  //覆盖__clone()方法,禁止克隆 
 
    public static function getInstance() 
    { 
        if(! (self::$_instance instanceof self) ) { 
            self::$_instance = new self(); 
        } 
        return self::$_instance; 
    } 
 
   

    public function addUserInfo(...)
    {

  

    }

     public function getUserInfo(...)
    {

    }

}

//test

$db = DB::getInstance();

$db->addUserInfo(...);

$db->getUserInfo(...);


?>

深入理解

 代码如下 复制代码

<?php
class db {
 public $conn;
 public static $sql;
 public static $instance=null;
 private function __construct(){
  require_once('db.config.php');
  $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);
  if(!mysql_select_db($db['database'],$this->conn)){
   echo "失败";
  };
  mysql_query('set names utf8',$this->conn);  
 }
 public static function getInstance(){
  if(is_null(self::$instance)){
   self::$instance = new db;
  }
  return self::$instance;
 }
 /**
  * 查询数据库
  */
 public function select($table,$condition=array(),$field = array()){
  $where='';
  if(!empty($condition)){
   
   foreach($condition as $k=>$v){
    $where.=$k."='".$v."' and ";
   }
   $where='where '.$where .'1=1';
  }
  $fieldstr = '';
  if(!empty($field)){
   
   foreach($field as $k=>$v){
    $fieldstr.= $v.',';
   }
    $fieldstr = rtrim($fieldstr,',');
  }else{
   $fieldstr = '*';
  }
  self::$sql = "select {$fieldstr} from {$table} {$where}";
  $result=mysql_query(self::$sql,$this->conn);
  $resuleRow = array();
  $i = 0;
  while($row=mysql_fetch_assoc($result)){
   foreach($row as $k=>$v){
    $resuleRow[$i][$k] = $v;
   }
   $i++;
  }
  return $resuleRow;
 }
 /**
  * 添加一条记录
  */
  public function insert($table,$data){
   $values = '';
   $datas = '';
   foreach($data as $k=>$v){
    $values.=$k.',';
    $datas.="'$v'".',';
   }
   $values = rtrim($values,',');
   $datas   = rtrim($datas,',');
   self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";
  if(mysql_query(self::$sql)){
   return mysql_insert_id();
  }else{
   return false;
  };
  }
  /**
   * 修改一条记录
   */
 public function update($table,$data,$condition=array()){
  $where='';
  if(!empty($condition)){
   
   foreach($condition as $k=>$v){
    $where.=$k."='".$v."' and ";
   }
   $where='where '.$where .'1=1';
  }
  $updatastr = '';
  if(!empty($data)){
   foreach($data as $k=>$v){
    $updatastr.= $k."='".$v."',";
   }
   $updatastr = 'set '.rtrim($updatastr,',');
  }
  self::$sql = "update {$table} {$updatastr} {$where}";
  return mysql_query(self::$sql);
 }
 /**
  * 删除记录
  */
  public function delete($table,$condition){
   $where='';
  if(!empty($condition)){
   
   foreach($condition as $k=>$v){
    $where.=$k."='".$v."' and ";
   }
   $where='where '.$where .'1=1';
  }
  self::$sql = "delete from {$table} {$where}";
  return mysql_query(self::$sql);
  
  }
 
 public static function getLastSql(){
  echo self::$sql;
 }
 
 
 
}

$db = db::getInstance();
//$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array

('name','password'));
//echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
//echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
echo $db->delete('demo',array('id'=>'2'));
db::getLastSql();
echo "<pre>";
?>

       php中有很多的设计模式,其中的单例模式是我们写代码的时候较为常用的一种模式,它不但能

够有效的减少new操作的资源消耗,而且能够很方便的对某些全局配置信息进行控制!希望大家在php学

习中深刻理解单例模式的应用。

[!--infotagslink--]

相关文章

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

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • PHP传值到不同页面的三种常见方式及php和html之间传值问题

    在项目开发中经常见到不同页面之间传值在web工作中,本篇文章给大家列出了三种常见的方式。接触PHP也有几个月了,本文总结一下这段日子中,在编程过程里常用的3种不同页面传值方法,希望可以给大家参考。有什么意见也希望大...2015-11-24
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • jQuery实现切换页面过渡动画效果

    直接为大家介绍制作过程,希望大家可以喜欢。HTML结构该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进...2015-10-30
  • 解决vue刷新页面以后丢失store的数据问题

    这篇文章主要介绍了解决vue刷新页面以后丢失store的数据问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31
  • DOM XPATH获取img src值的query

    复制代码 代码如下:$nodes = @$xpath->query("//*[@id='main_pr']/img/@src");$prurl = $nodes->item(0)->nodeValue;...2013-10-04
  • 解决vuex数据页面刷新后初始化操作

    这篇文章主要介绍了解决vuex数据页面刷新后初始化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-26
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序。这是中国人大多数使用的排序方法。那么在php程序中该如何操作呢?下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的...2015-10-23
  • JavaScript 获取滚动条位置并将页面滑动到锚点

    这篇文章主要介绍了JavaScript 获取滚动条位置并将页面滑动到锚点的的相关资料,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下...2021-02-09
  • java后台实现js关闭本页面,父页面指定跳转或刷新操作

    这篇文章主要介绍了java后台实现js关闭本页面,父页面指定跳转或刷新操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-16
  • 使用C#获取系统特殊文件夹路径的解决方法

    本篇文章是对使用C#获取系统特殊文件夹路径的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25