工作中总结的常用PHP代码
【目录】
【Apache设置二级域名和虚拟主机,在httpd.conf的最后】
----------------《开始》-----------------
◆PHP常用的代码
date_default_timezone_set(PRC); //时区设置 header("Content-type: text/html; charset=utf-8"); error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING); ini_set ('memory_limit', '1280M');
◆ HTML常用代码
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" src="jquery-1.3.1.js"></script>
<meta charset="UTF-8"> <meta http-equiv ="refresh" content ="60"> #定时刷新页面 body{-webkit-user-select:none;} #CSS控制页面文字不能复制
【值传递和引用传递】
$p=213; function ddd(&$q){ $q=314; } ddd($p); echo $p; //不加&符号的时候,输出为213,加上后输出为314
【单例模式】
<?php class demo{ private static $obj; //保存对象的静态属性 private function __construct(){} //私有化构造函数 private function __clone(){} //禁止克隆 public static function getInstance(){ if(!(self::$obj instanceof self)){ self::$obj = new self; } return self::$obj; } } ?>
【魔术常量】
class moshu{ function __construct(){ echo "<br>".__LINE__; //当前的行数 echo "<br>".__FILE__; //当前文件绝对路径及文件名 echo "<br>".__DIR__; //当前文件绝对路径 echo "<br>".__CLASS__;//当前的类名 echo "<br>".__FUNCTION__; //当前的函数(方法)名 echo "<br>".__METHOD__; //类的方法名 echo "<br>".__NAMESPACE__; //命名空间[不常用] } } $ms=new moshu();
【代码调试(自定义一个简单的debug函数)】
function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组的索引; for($i=0;$i<$num_args;$i++){ echo "第 $i 个变量的值为:".$arg_list[$i]."<br>"; } echo "当前所处的文件名为:".__FILE__."<br><br>"; }
【thinkphp多表查询】
$table="tb_user a,tb_info b"; $field="a.id,a.name,a.sex,b.img"; $order="a.id desc,b.create_time desc"; $map['a.is_del']=0; $limit=(($_GET['page']-1)*$_GET['limit']).','.$_GET['limit']; $list = M('')->table($table)->field($field)->where($map)->order($order)->limit($limit)->select(); $sql_res = M('')->getLastSql();
【获取客户端IP地址】
function getIP(){ $ip=getenv('REMOTE_ADDR'); $ip_ = getenv('HTTP_X_FORWARDED_FOR'); if (($ip_ != "") && ($ip_ != "unknown")){ $ip=$ip_; } return $ip; }
【PHP json_encode中文乱码解决方法】
$testJSON=array('name'=>'中文字符串','value'=>'test'); foreach ( $testJSON as $key => $value ) { $testJSON[$key] = urlencode ( $value ); } echo urldecode ( json_encode ( $testJSON ) );
【Apache设置二级域名和虚拟主机,在httpd.conf的最后】
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.a.com DocumentRoot "D:/www" </VirtualHost> <Directory "D:/www" > Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> Options FollowSymLinks 表示不列出目录下的文件,如果要列出文件列表,则使用 Options Indexes FollowSymLinks。C:\Windows\System32\drivers\etc 目录下hosts文件中(Ubuntu 系统下,是在 /etc/hosts 文件中):最后添加一行:127.0.0.1 www.a.com。
----------------《CURL》-----------------
【CURL 获取远程网页数据】
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0); //第三个参数是1表示不输出,0允许输出 $data = curl_exec($curl); curl_close($curl);
【使用CURL抓取网页】
<?php header("Content-type:text/html;charset=utf-8"); /*CURL的具体实现,抓取网页,类似于直接file_get_contents() */ //--- 1.初始化 $ch = curl_init(); //--- 2.设置选项,包括url curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); //将curl_exec() 获取的信息以文件流的形式返回,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //启用时会将头文件的信息作为数据流输出 curl_setopt($ch, CURLOPT_HEADER, 1); //--- 3.执行并获取HTML文档内容 $output = curl_exec($ch); //curl_getinfo() 函数返回CURL执行后这一请求的相关信息,对调试和排查错误很有用 //$info = curl_getinfo($ch); print_r($info); //--- 4.释放CURL句柄 curl_close($ch); echo $output; ?>
【在cURL中用POST方法发送数据】
<?php header("Content-type:text/html;charset=utf-8"); //提交后的数据接收部分 if(isset($_GET['type']) && $_GET['type']=='tijiao'){ print_r($_POST);exit; } //CURL请求部分 $url = "http://localhost/test/code04/code03.php?type=tijiao"; $post_data = array( 'username'=>'root', 'password'=>'123456', 'name'=>'管理员', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设置为POST curl_setopt($ch, CURLOPT_POST, 1); //把POST的变量加上 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output; ?>
【使用cURL上传文件】
<?php error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING); header("Content-type:text/html;charset=utf-8"); //提交后的数据接收部分 if(isset($_GET['type']) && $_GET['type']=='tijiao'){ echo '<pre>';print_r($_FILES);echo '</pre>';exit; } //CURL请求部分 $url = "http://localhost/test/code04/code04.php?type=tijiao"; //注意下面一定要有@符号! $post_data = array( 'files1'=>'@E:/test/s1.jpg', 'files3'=>'@E:/test/s2.zip', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output; ?>
【上传网络图片】
$pic_url = $_POST['pic_url']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://imgtest.qwbcg.mobi/image/crawl_upload.php?token=mmkj2xai823@asin&pic_url= $pic_url" ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); //执行并获取HTML文档内容 curl_close($ch); print_r($output );
----------------《PHP数组》-----------------
【PHP将XML数据转换为数组】
function xml_to_array($xml) { $array = (array)(simplexml_load_string($xml)); foreach ($array as $key=$item){ $array[$key] = struct_to_array((array)$item); } return $array; } function struct_to_array($item) { if(!is_string($item)) { $item = (array)$item; foreach ($item as $key=$val){ $item[$key] = struct_to_array($val); } } return $item; }
【数组使用中的细节】
(1)创建数组时,如果没有给某个元素指定key,则会用目前最大的key(整数)+1 作为该元素的key:
$arr=array(5=>"logo",567,90); echo $arr[5]; //值为”logo” echo $arr[6]; //值为567
(2)如果使用[true ,false ,null,小数] 作为key, 则等价于[1,0,””(空字符串),截断小数点后的数值]
$arr[true]="hello"; //==> $arr[1] $arr[false]="world"; //==> $arr[0] $arr[null]="北京"; //==> $arr[""]; $arr[3.14]="北京"; //==> $arr[3];
【数组排序】:从效率上看 ------- 冒泡法< 选择排序法 < 插入排序法
(1)冒泡排序
function bubbleSort(&$arr){ //注意这里& $temp=0; for($i=0;$i<count($arr)-1;$i++){ for($j=0;$j<count($arr)-1-$i;$j++){ if($arr[$j]>$arr[$j+1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; } } } }
(2)选择排序
function selectSort(&$arr){ $temp=0; for($i=0;$i<count($arr)-1;$i++){ //假设 $i就是最小的数 $minVal=$arr[$i]; //记录我认为的最小数的下标 $minIndex=$i; for($j=$i+1;$j<count($arr);$j++){ //说明我们认为的最小值,不是最小值 if($minVal>$arr[$j]){ $minVal=$arr[$j]; $minIndex=$j; } } //最后交换 $temp=$arr[$i]; $arr[$i]=$arr[$minIndex]; $arr[$minIndex]=$temp; } }
(3)插入排序法
function insertSort(&$arr){ //先默认下标为0 这个数已经是有序 for($i=1;$i<count($arr);$i++){ //$insertVal是准备插入的数 $insertVal=$arr[$i]; //准备先和$insertIndex比较 $insertIndex=$i-1; //如果这个条件满足,说明,我们还没有找到适当的位置 while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){ //同时把数后移 $arr[$insertIndex+1]=$arr[$insertIndex]; $insertIndex--; } //插入(这时就给$insertVal找到适当位置) $arr[$insertIndex+1]=$insertVal; } }
【数组的查找】
(1)顺序查找
function search(&$arr,$findVal){ $flag=false; foreach($arr as $k=>$v){ if($findVal==$arr[$k]){ echo "找到了,下标为:$k".'<br>'; $flag=true; //break; } } if(!$flag){ echo '没有找到!'; } }
(1)二分查找法(前提是 该数组本身已经是一个有序数组. 如果该数组不是有序的,则必须先排序再查找)
function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){ //$leftIndex为数组最左端下标[0],$rightIndex为最右端下标[count($arr)] //当 $leftIndex>$rightIndex 说明没有数 if($leftIndex>$rightIndex){ echo "没有找到..."; return; //必须有 } //找到中间这个数 $middleIndex=round(($rightIndex+$leftIndex)/2); //如果大于中间这个数,则向后面找 if($findVal>$arr[$middleIndex]){ binarySearch($arr,$findVal,$middleIndex+1,$rightIndex); } //如果小于中间这个数,则向前面找 elseif($findVal<$arr[$middleIndex]){ binarySearch($arr,$findVal,$leftIndex,$middleIndex-1); }else{ echo "找到这个数,下标是:$middleIndex"; } }
----------------《PHP操作文件》-----------------
【下载文件】
<?php header("Content-Type:image/gif"); header('Content-Disposition: attachment; filename="logo3333.gif"'); header('Content-Length:'.filesize("logo.gif")); readfile("logo.gif");
【从一个标准 url 里取出文件的扩展名】
function getExt($url){ $arr = parse_url($url); $file = basename($arr['path']); $ext = explode(".",$file); return $ext[1]; } $str = "http://www.sina.com.cn/abc/de/fg.php?id=1"; echo getExt($str);// 输出:php
【复制非空目录】
<?php header("Content-type: text/html; charset=utf-8"); $dirname="phpMyAdmin"; copydir($dirname,"hello1"); functioncopydir($dirsrc, $dirto){ if(is_file($dirto)){ echo"目标不是目录不能创建"; return; } if(!file_exists($dirto)){ mkdir($dirto); //echo "创建目录".$dirto."成功!<br>"; } $dir=opendir($dirsrc); while($filename=readdir($dir)){ if($filename!="."&& $filename!=".."){ $file1=$dirsrc."/".$filename; $file2=$dirto."/".$filename; if(is_dir($file1)){ copydir($file1, $file2);//递归处理 }else{ copy($file1, $file2); } } } closedir($dir); } ?>
【删除非空目录】
<?php header("Content-type: text/html; charset=utf-8"); $dirname="phpMyAdmin"; deldir($dirname); functiondeldir($dirname){ if(file_exists($dirname)) { $dir=opendir($dirname); while($filename=readdir($dir)){ if($filename!="."&& $filename!=".."){ $file=$dirname."/".$filename; if(is_dir($file)){ deldir($file);//使用递归删除子目录 }else{ echo'删除文件<b>'.$file.'</b>成功<br>'; unlink($file); } } } closedir($dir); echo'删除目录<b>'.$dirname.'</b>成功<br>'; rmdir($dirname); } } ?>
【PHP读取一个目录下的文件个数】
<?php function FileCount($dir){ global $count; if(is_dir($dir)&&file_exists($dir)){ $ob=scandir($dir); foreach($ob as $file){ if($file=="."||$file==".."){ continue; } $file=$dir."/".$file; if(is_file($file)){ $count++; }elseif(is_dir($file)){ FileCount($file); } } } } //调用方法 $count=0; FileCount("DataRoom"); echo $count;exit; ?>
【php获取目录中的所有文件名】
<?php $handler = opendir('pic/common'); while( ($filename = readdir($handler)) !== false ) { if($filename != "." && $filename != ".."){ echo $filename; } } closedir($handler); ?>
function getAllFiles($dir){ $handler = opendir($dir); $list = array(); while( ($filename = readdir($handler)) !== false ) { if($filename != "." && $filename != ".."){ $list[] = $filename; } } closedir($handler); return $list; }
【判断远程图片(文件)是否存在】
function check_remote_file_exists($url) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_NOBODY, true); // 不取回数据 $result = curl_exec($curl); // 发送请求 $found = false; if ($result !== false) { $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($statusCode == 200) { $found = true; } } curl_close($curl); return $found; }
【按照年月日创建目录,并返回目录地址】
function makeDir(){ date_default_timezone_set('Asia/Shanghai'); $log_path = $_SERVER['DOCUMENT_ROOT'].'/FxData'; //创建“年份”文件夹,格式为: /Data/2014 $log_path_year = $log_path.'/'.date("Y",time()); if(!is_dir($log_path_year)) { mkdir($log_path_year, 0777, true); } //创建“月份”文件夹,格式为: /Data/2014/201412 $log_path_month = $log_path_year.'/'.date("Ym",time()); if(!is_dir($log_path_month)) { mkdir($log_path_month, 0777, true); } //创建“日期”文件夹,格式为: /Data/2014/201412/20141212 $log_path_date = $log_path_month.'/'.date("Ymd",time()); if(!is_dir($log_path_date)) { mkdir($log_path_date, 0777, true); } return $log_path_date; }
----------------《PHP操作MySQL》-----------------
【PHP操作MySQL】
$conn=mysql_connect($db_host,$db_user,$db_pwd) or die("连接服务器失败"); mysql_select_db($db_name,$conn) or die("选择数据库失败"); $result=mysql_query("select * from employee") or die("查询失败"); while($row = mysql_fetch_array($result)){ $res[] = $row; } print_r($res); mysql_free_result($result);// 释放结果集内存 mysql_close($conn);
【PHP操作mysqli】
$mysqli=new mysqli($db_host,$db_user,$db_pwd,$db_name) ; $result=$mysqli->query("select * from employee"); while($row =$result->fetch_array()){ $res[] = $row; } print_r($res); $result->free(); $mysqli->close();
【PHP操作MySQL的事务】
$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb"); $mysqli->autocommit(0); $error=true; $price=50; $sql="update zh set ye=ye-{$price} where name='zhangsan'"; $result=$mysqli->query($sql); if(!$result){ $error=false; echo "从张三转出失败<br>"; }else{ if($mysqli->affected_rows==0){ $error=false; echo "张三的钱没有变化"; }else{ echo "从张三账号中转出成功!<br>"; } } $sql="update zh set ye=ye+{$price} where name='lisi1'"; $result=$mysqli->query($sql); if(!$result){ $error=false; echo "从李四转入失败<br>"; }else{ if($mysqli->affected_rows==0){ $error=false; echo "李四的钱没有变化"; }else{ echo "向李四账号中转入成功!<br>"; } } if($error){ echo "转账成功!"; $mysqli->commit(); }else{ echo "转账失败!"; $mysqli->rollback(); } $mysqli->autocommit(1); $mysqli->close();
【PHP删除MySQL数据库下的所有数据表】
$hostname ='localhost'; $userid = 'username'; $password = 'password'; $dbname = 'dbname'; $connect = mysql_connect($hostname,$userid,$password); mysql_select_db($dbname); $result = mysql_query("show table status from $dbname",$connect); while($data=mysql_fetch_array($result)) { mysql_query("drop table $data[Name]"); }
【了解备用:PDO】
PDO即 PHP DATA OBJECTS,是PHP定义的一个轻量级的数据操作接口,并且此接口实现了事务和不同数据库之间的抽象。
$dsn = 'mysql:dbname=renxing;host=localhost'; $user_name = 'root'; $user_pwd = 'root'; $pdo = new PDO($dsn, $user_name, $user_pwd); $query="select * from employee"; foreach ( $pdo->query($query) as $row){ $res[] = $row; } print_r($res); //执行操作:$pdo->exec("delete from employee where id>4";);
◆ PDO的事务:
(1)开始事务:beginTransaction()方法,该方法会关闭自动提交(autocommit)模式,直到事务提交或者回滚以后才能恢复。
(2)提交事务:commit()方法成功返回true,否则返回false
(3)回滚事务:rollBack()方法
【了解备用:ADODB】
include('adodb/adodb.inc.php'); $conn = ADONewConnection('mysql');//MySQL数据库 $conn->Connect("localhost", "root", "root", "renxing");//连接数据库 $result=$conn->Execute("select * from employee");//执行查询 foreach ($result as $row) { print_r($row); } $conn -> Close();//关闭连接
◆ ADODB获取结果:
(1)GetAll()方法可获取表中的所有记录,并返回包含结果集的一个数组
(2)GetRow()方法可获取单条记录
(3)GetOne()方法可获取结果集中某条记录的第一个字段的值。
(4)RecordCount()方法可获取结果集中行的个数,FieldCount()方法可获取结果集中字段的个数。
(5)FetchField()方法可获取指定字段的名称、数据类型、是否为主键。
◆ ADODB的其他功能:
(1)开启调试功能:$conn->debug=true;程序在运行时会输出SQL语句。
(2)对查询进行缓存:$conn->CacheExecute($time,$query);清除缓存使用CacheFlush()方法。
(3)ADODB的事务处理:开始事务StartTrans()方法,结束事务Complete()方法,强制执行回滚FailTrans()方法,获知处理事务是否成功HasFailedTrans()方法。
----------------《完》-----------------