一、使用絕對路徑載入文件
defined('ROOT',pathinfo(__FILE__,PATHINFO_DIRNAME));
require(ROOT.'/test.php');
二、寫入文件前,檢查目錄寫權限
通常代碼:
$content="please input text";
$path='e:/text/text.txt';
file_put_contents($path,$content);
存在問題:寫或保存文件前,確保目錄是可寫的,假如不可寫輸出
錯誤信息,在linux系統中,須要處理權限,目錄權限不當會致使
不少問題,文件也有可能沒法讀取。
一、父目錄不存在
二、目錄存在,但文件不可寫
三、文件被寫鎖住
改良代碼:
$content='please input text';
$dir='e:/text';
$path=$dir.'/text.txt';
if(is_writable($dir)){
file_put_contents($path,$contents);
}else{
die('文件夾有權限設置或者文件不可寫');
}
三、不要依賴submit按鈕值來檢查表單的提交行爲
通常代碼:
if($_POST['submit']=='Save'){
//other thing
}
上訴狀況大多數狀況下正確,除了應用多語言,save可能表明其餘含義,很差區分它們因此不要依賴它們
改良代碼:
if($_SERVER['REQUEST_METHOD']=='POST'&&isset($_POST['submit'])){
//other thing
}
四、生成惟一的id 使用函數uniqid()2013/9/1
五、array_fill($start_index,$num,$mix)數組填充
六、mt_rand()與rand() 區別:mt_rand()比rand()產生隨機數的平均速度快4倍
八、比較常見的輸出:echo,var_dump(),var_export()
九、全部魔術方法:__construct() __destruct() __clone() __set() __get() __isset() __unset() __call() __invoke()
十、reset系列相關函數;reset()將數組的內部指針移動到第一個位置 current() key() next()
十一、OOP關鍵字:class final instanceof private protected public static abstruct interface extends implements :: ->
十二、查詢出當天的記錄: select * from notes where to_days(notes_date)=to_days(now()); to_days()爲Mysql時間函數用於計算出天數
1三、查詢出昨天的記錄: select * from notes where (TO_DAYS(NOW())-TO_DAYS(notes_date)) BETWEEN 1 and 2;
1四、查詢出近7天的記錄:select * from notes where DATE_SUB(CURDATE(),INTERVAL 7 DAY) <DATE(notes_date); curdate()獲得當前年月日,date_sub()計算時間差
1五、查詢出近30天的記錄:select * from notes where date_sub(curdate(),interval 30 day)<date(notes_date)
1六、查詢出本月的記錄:select * from notes where DATE_FORMAT(notes_date,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m'); date_format(date,format)格式化時間
1七、查詢出上月的記錄:select * from notes where PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(notes_date,'%Y%m'))=1; period_diff(P1,P2)返回P1到P2之間的月份間隔數,其中P1和P2的格式是YYYYMM或YYMM
1八、在MVC中全部的相對路徑參照路徑都是入口文件 index.php
1九、if(array_key_exists($key,get_object_vars($this))) 在一個類中中判斷傳入的參數鍵是否在類中
20、 __DIR__:動態獲得當前文件所在目錄
dirname()獲得上級目錄 dirname(__DIR__) 動態獲得當前文件所在目錄的上級目錄
__FILE__ 動態獲得包含文件名的全路徑
basename(__FILE__) 動態獲得文件名 包括後面的地址欄參數 如 test.php?a=method&id=2
2一、讀取txt文件中的信息並以換行爲分隔存入到數組中: $txt=file_get_contents(text.txt); $string_arr=explode("\n",$txt) //此處的分隔符必需要是雙引號將\n包含起來,不能使用單引號
2二、使用fread讀取文件內容
function get_file_content($file_path){
$fp=fopen($file_path, 'r');
$data='';
while (!feof($fp)){ //feof($handle) 其中feof表示測試文件指針是否已經到了文件結束的位置
$data.=fread($fp, 1024);
}
fclose($fp);
return $data;
}
2三、ini_set()函數的使用
2四、array_unique(array) 移除數組中重複的項
2五、strlen()與mb_strlen()的區別:
都是用於獲取字符串的長度,其中str_len只針對單字節編碼字符,也就是說它計算的是字符串的總字節數。若是是多字節編碼如gbk和utf8,使用
strlen獲得的不是字符的個數而是該字符的總字節數。可使用mb_strlen獲取其字符個數,使用mb_strlen要注意兩點,一是要開啓mbstring擴展
二是指定字符集
$str="傳智播客php學院";
echo strlen($str); //21 當前頁面是utf-8字符集,若是是gbk則結果爲15
echo mb_strlen($str); //21 注意 未指定字符集,使用內部字符編碼(單字節)
echo mb_strlen($str,'utf8'); //9
自定義函數取得帶有中文字符字符串的長度
function strlen_utf8($str){
$arr=preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY);
$len=count($arr);
return $len;
}
2六、截取帶有中文的字符串使用 mb_substr()
$str="你好我叫shushu";
echo mb_substr($str,2,3,'utf8');
function substr_utf8($str,$start,$len){
return implode("",array_slice(preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY),$start,$len));
}
2七、post與get傳輸的最大容量分別是: post根據php.ini文件的配置 post_max_size(默認爲8M),get則是2k
2八、打印前一天的時間
strtotime()函數用於將英文文本的日期時間轉換爲unix時間戳
獲得前一天的時間:date("Y-m-d H:i:s",strtotime("-1 day"));
獲得上一個月的時間:date("Y-m-d H:i:s",strtotime("-1 Month"))
獲得上一年的時間:date("Y-m-d H:i:s",strtotime("-1 Year")) 或者 date("Y-m-d H:i:s",strtotime("last year"))
獲得上一週的時間:date("Y-m-d H:i:s",strtotime("-1 Week"));
計算2009-4-1與200-3-2兩個日期之差:(strtotime('2009-4-1')-strtotime('2009-3-2'))/(3600*24) 獲得兩個日期的日期之差
2九、list()函數,把一個數組中的值賦給list中的變量 如 list($a,$b)=array('xiaozhang','xiaoli');
30、implode()將數組轉成字符串 emplode()將字符串轉爲數組
3一、preg_split()函數:使用正則表達式對字符串分割
語法:preg_split(正則表達式,分割的字符串,limit,$flag) 其中limit爲-1表示沒有限制,$flag爲PREG_SPLIT_NO_EMPTY表示只返回非空部分
preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY);
3二、array_slice() 從數組中取出一段來 語法:array_slice(array,offset,[length])
3三、trim() 消去字符串左右兩邊的空格 語法:trim($string,【$charlist】) 若是$charlist缺省則消去$string中左右兩邊的空格,若是存在$charlist則消去
$string中兩邊的$charlist 如 trim('ashushusdsa','a') 獲得的結果是字符串 :shushusds 消掉了左右兩邊的a
其餘兩個函數 ltrim()與rtrim()分別表示消掉左邊和消掉右邊的指定字符串
3四、何爲可變變量:獲取一個變量的值做爲這個可變變量的變量名
3五、以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句:LoadModule php5_module 'c:/php/php5apache2.dll'; 動態加載PHP模塊
而後再用語句 AddType application/x-httpd-php .php 使得Apache把全部擴展名爲php的文件都做爲PHP腳本處理。
3六、取得一個全路徑的文件的擴展名的五種方法
//取得一個全路徑的擴展名
//方法1
function getExtension1($file_path){
//對文件地址作分割獲得數組
$path_arr=preg_split('/\./', $file_path,-1,PREG_SPLIT_NO_EMPTY);
return $path_arr[(count($path_arr)-1)];
}
//方法2
function getExtension2($file_path){
return pathinfo($file_path,PATHINFO_EXTENSION);
}
//方法3
function getExtension3($file_path){
$arr=explode('/', $file_path);
$file_arr=$arr[(count($arr)-1)];
$extension=explode('.', $file_arr);
return $extension[(count($extension)-1)];
}
//方法4
function getExtension4($file_path){
$extension=strrchr($file_path,'.');
return ltrim($extension,'.');
}
//方法5
function getExtension5($file_path){
return substr($file_path, strrpos($file_path, '.')+1);
}
echo getExtension4('f:/test/a.txt');
3七、intval() 函數 將'101' 轉換爲101
3八、將open_dir轉換爲OpenDir
function get($string){
$arr=explode('_',$string);
$txt=array_map('toUpper',$arr); //使用array_map()函數使得數組$arr中的每個元素都調用了函數toUpper
return implode('',$txt);
}
function toUpper($word){
$word{0}=strtoupper($word{0});
return $word;
}
3九、array_map(callback,array) 該函數的做用是使得數組array中的每個元素都回調callback函數
40、統計字符在字符串中出現的次數:substr_count(字符串,字符)
//自定義函數:統計字符在字符串中出現的次數
function getNumber($string,$key){
$arr=explode($key, $string);
return count($arr)-1;
}
echo getNumber('gsggsgsgs','g');
4一、ord($string)函數 獲得字符串中的ASCII碼 如:0-9爲48-57 只能獲得第一個字符的ASCII值
4二、刪掉一個網站的全部的Cookie $_SERVER['HTTP_COOKIE']獲得包含全部cookie的字符串 每一個cookie之間用";"分割 如:name1=xiaozhang; name2=xiaoli; name4=xiaoluo
//刪除一個站點的全部cookie
$cookie_str=$_SERVER['HTTP_COOKIE'];
$cookies_arr=explode(';', $cookie_str);
foreach ($cookies_arr as $cookie){
$cookie_arr=explode('=', $cookie); //獲得cookie名與cookie值的數組
$cookie_name=trim($cookie_arr[0]); //必需要使用trim()去掉兩邊的空格
//echo $cookie_name;
setcookie($cookie_name,'',time()-3600);
}
4三、chr()
4四、ini_get()取得PHP配置信息 ini_set() 配置PHP
4五、extract()
4六、str_repeat(字符串,次數) 該函數是重複的產生字符串 如:$str=str_repeat('=',10) 將生成10個「=」的字符串
4七、mysql_real_escape_string() 轉義SQL中的特殊字符
4八、fsockopen()
4九、feof()
50、header()
5一、header_set()
if(!header_set()){
header('Location:http://www.baidu.com');
exit;
}
5二、gmdate()
5三、glob()
5四、serialize() 對數據序列化
5五、unserialize() 對數據反序列化
5六、json_decode() 對json格式的數據進行編碼
5七、json_encode() 對變量進行json編碼
5八、unlink()刪掉文件
5九、finfo_open() finfo_file()
60、ucfrist() 將字符串的首字母大寫,主要應用於MVC地址欄中平臺與模塊的單詞拼寫
6一、addslashes()
6二、get_magic_quotes_gpc()
6三、array_walk_recursive()
6四、IE8下不支持html5標籤的解決方法:使用javascript:document.createElement('header'); 這句話即告訴IE8說header爲一個標籤
6五、array_unique(array) 消除數組中重複的項,返回爲一個數組
6六、js事件監聽:
IE:
attachEvent(type,callback) type:事件名 如 onclick,callback:事件處理程序
基於w3c模型的瀏覽器(firefox 等):
addEventListener(type,callback,flag) type:事件名 如click 注意,這裏沒有on前綴 callback:事件處理程序 flag: 使用捕捉模型仍是冒泡模型 默認:冒泡
解決瀏覽器兼容性問題:
/**
* obj: 爲操做的dom對象
* type: 事件名 不加 'on'
* callback: 事件處理程序
function addEvent(obj,type,callback){
if(window.addEventListener){
obj.addEventListener(type,callback);
}else{
obj.attachEvent('on'+type,callback);
}
}
6七、js中的event對象 window.event 只支持IE瀏覽器 火狐等W3C瀏覽器不支持 這個須要在匿名函數中傳遞event對象 function(event){}
如:
obj.onclick=function(event){
var evt;
if(window.event){
//解決IE瀏覽器問題
evt=window.event;
}else{
//解決w3c瀏覽器問題
evt=event;
}
}
6八、js中的事件冒泡機制與阻止冒泡:
<script type="text/javascript">
window.onload=function(){
document.getElementById('div1').onclick=function(){
alert('div1');
}
document.getElementById('div2').onclick=function(){
alert('div2'); //發生事件冒泡 依次彈出div三、div2
}
document.getElementById('div3').onclick=function(){
alert('div3'); //發生事件冒泡 依次彈出div三、div二、div1
}
}
</script>
<div id="div1">
div1
<div id="div2">
div2
<div id="div3">
div3
</div>
</div>
</div>
阻止冒泡發生
function stopBubble(evt){
if(window.event){
//ie瀏覽器
window.event.cancelBubble=true;
}else{
evt.stopPropagation();
}
}
6九、js 字符串的search方法:var str='try you best'; str.search('tr') 說明:該方法是查找字符串中匹配的字符
若是找到則返回索引位置,若是沒有找到則返回-1 實例:js版搜索功能
70、多關鍵字的搜索功能實現原理:將關鍵字字符串使用空格分隔,獲得數組,再for遍歷逐個匹配便可 如 str='中國 中華 臺灣' 使用空格分隔成數組再使用 for遍歷
搜索實例:
$link=mysql_connect('localhost','root','123456');
mysql_select_db('myshop');
mysql_query('set names utf8');
$str='諾基亞 三星';
$arr=explode(' ', $str);
$sql="select goods_name from ecs_goods where";
for ($i=0;$i<count($arr);$i++){
$key=$arr[$i];
$sql .=" goods_name like '%$key%' or";
}
$sql=substr($sql, 0,-2);
$result=mysql_query($sql);
while ($row=mysql_fetch_assoc($result)){
var_dump($row);
}
7一、背景透明度兼容性:IE:filter:alpha(opacity:30) 火狐、谷歌:opacity:0.3
7二、元素的:offsetLeft、offsetRight、offsetWidth、offsetHeight 的使用
7三、JS中根據類名篩選出指定的元素 通用方法
function getByClass(oParent,sClass){
var aEle=oParent.getElementsByTagName('*'); //從父節點中獲得全部的子節點,其中通配符「*」表示匹配全部的元素
var aResult=[];
for(var i=0;i<aEle.length;i++){
if(aEle[i].className==sClass){
aResult.push(aEle[i]);
}
}
return aResult;
}
7四、JS中判斷變量數據類型使用 typeof 例如:typeof str.match(book) 獲得的是一個object類型(數組對象模型)
7五、php中的析構函數,銷燬對象的順序是先定義的銷燬,緣由是對象是名是存在於棧中,棧是先進後出的,名存放在棧中,地址存放在堆中
變量存放在棧中,由於棧有着 小、快的特色,便於變量的反覆的讀取和寫入。堆相對於棧而言,有着大、慢的特色
所謂的引用傳遞是指:兩個棧中的對象指向堆中的同一個內存
按值傳遞:普通變量
按地址傳遞:對象變量
7六、JS正則表達式的分組匹配
var pattern=/^([a-z]+)\s([0-9]{4})$/i;
var str='google 2012';
// alert(pattern.exec(str));
alert(pattern.exec(str)[0]); //獲得的是所有字符
alert(pattern.exec(str)[1]); //獲得的是第一個分組匹配成功的字符
alert(pattern.exec(str)[2]); //獲得的是第二個分組匹配成功的字符
7七、JS中對象的方法就是屬性
function Person(p_name){
this.name=p_name;
}
var p1=new Person('xoazhang');
p1.say=function(){
alert('我叫'+this.name);
}
7八、JS中檢測數據類型:使用 typeof和 instanceof constructor
二者的區別:typeof運算符在檢查基本數據類型的時候很是好用,但檢測引用類型的時候,它就不是那麼好用
一般,咱們並不想知道它是否是對象,而是想知道它究竟是什麼類型的對象。由於數組也是object,null也是object
因此此時,你須要使用 instanceof 運算符來查看
//檢查數據類型,使用 typeof 和 instanceof
var str=new String('test');
alert(typeof str);
var arr=new Array();
alert(typeof null);
alert(str instanceof String);
alert(arr instanceof Array); //是不是數組
var obj={};
alert(obj instanceof Object); //是不是對象
var reg=/g/;
alert(reg instanceof RegExp); //是不是正則表達式
function Person(){ }
var person=new Person();
alert(person.constructor); //獲得person對象的構造器
7九、解決JS只能取得行內樣式的值,而不能取得外聯文件樣式的值的方法
if(typeof window.getComputedStyle!='undefined'){
//支持w3c瀏覽器
return window.getComputedStyle(this,null)[attr]; //其中this表示當前元素對象
}else if(typeof this.currentStyle!='undefined'){
//支持IE
return this.currentStyle[attr];
}
80、狀態碼的問題
8一、使用正則表達式將頁面中的js腳本清除掉
var str='2323<script>test<\/script>ssss';
var pattern=/(<script.*>.*<\/script>)/;
var result=str.replace(pattern,' ');
alert(result);
8二、eval()方法 檢查JS代碼並執行 如 eval('3+5') 獲得的結果不是字符串'3+5' 而是8 由於它執行了3+5這個運算
8三、css中設置透明色:IE:filter:alpha(opacity=30) W3C:opacity:0.3
8四、window.onresize=function(){窗體發生改變時的動做} window.onresize表示當窗體發生改變時調用的方法
8五、document.documentElement.clientWidth :獲得當前瀏覽器的最大寬度 document.documentElement.clientHeight:獲得當前瀏覽器的最大高度
8六、獲取網頁元素的絕對位置
網頁元素的絕對位置指該元素的左上角相對於整個網頁左上角的座標。首先每一個元素都有offsetTop和offsetLeft屬性,表示該元素的左上角與父容器
(offsetParent對象)左上角的距離。因此,只須要將這兩個值進行累加,就能夠獲得該元素的絕對座標
使用下面函數完成
//獲得元素左邊座標
function getElementLeft(element){
var actualLeft=element.offsetLeft;
var current=element.offsetParent;
while(current!=null){
actualLeft+=current.offsetLeft;
current=current.offsetParent;
}
return actualLeft;
}
//獲得元素上邊座標
function getElementTop(element){
var actualTop=element.offsetTop;
var current=element.offsetParent;
while(current!=null){
actualTop+=current.offsetTop;
current=current.offsetParent;
}
return actualTop;
}
8七、解決瀏覽器對事件對象的兼容問題
function(event){
var ev=event||window.event; //其中window.event支持IE瀏覽器,從匿名函數中傳過來的參數event支持W3C瀏覽器
}
8八、div拖拽效果的實現
//div拖拽效果實現
var login=document.getElementById('login');
login.onmousedown=function(event){
var e=event||window.event;
var diffX=e.clientX-login.offsetLeft;
var diffY=e.clientY-login.offsetTop;
document.onmousemove=function(event){
var e=event||window.event; //解決瀏覽器兼容問題,其中window.event表示支持IE,event表示支持w3c
login.style.left=e.clientX-diffX+'px';
login.style.top=e.clientY-diffY+'px';
}
document.onmouseup=function(){
this.onmousemove=null;
this.onmouseup=null;
}
}
8九、JS取消瀏覽器的默認行爲
var prevent=function(event){
var e=event||window.event;
if(typeof e.preventDefault !='undefined'){
//W3C
e.preventDefault();
}else{
//IE
e.returnValue=false;
}
}
90、js中取得字符串的第一個字母 如: string='test'; 獲得t這個單詞 使用 string.charAt(0)
9一、js檢查瀏覽器的兼容性
(function(){
var version=navigator.userAgent.toLowerCase();
window.sys={}; //其中{}表示申明爲一個對象
//IE瀏覽器
if((/msie ([\d.]+)/).test(version)){
var info=version.match(/msie ([\d.]+)/);
sys.ie=info[1];
}
//Firefox瀏覽器
if((/firefox\/([\d.]+)/).test(version)){
var info=version.match(/firefox\/([\d.]+)/);
sys.firefox=info[1];
}
//alert(version); chrome
if((/chrome\/([\d.]+)/).test(version)){
var info=version.match(/chrome\/([\d.]+)/);
sys.chrome=info[1];
}
})();
9二、filemtime、fileatime、filemtime
9三、定義常量經常使用代碼
if(!defined('SMARTY_DIR')){
define('SMARTY_DIR',dirname(__FILE__));
}
9四、定義操做系統文件分割符
if(!defined('DS')){
define('DS',DIRECTORY_SEPARATOR);
}
9五、strip_tags
9六、encodeURIComponent() JS中中文轉碼 此方法與php中的urlencode方法效果是同樣的
在ajax的get傳值中,若是值爲中文,則須要轉碼再在php文件中接收並解碼
html文件:
xhr.open('get','./01.php?name=xiaozhang&addr='+encodeURIComponent('北京'),true); //true表示異步傳輸
php文件:
$addr=urldecode($_GET['addr']);
9七、建立ajax對象
function createXHR(){
if(window.ActiveXObject){
//支持IE
var versions=['Microsoft.XMLHTTP','MSxml2.XMLHTTP','MSxml2.XMLHTTP2.0','MSxml2.XMLHTTP3.0','MSxml2.XMLHTTP4.0','MSxml2.XMLHTTP5.0'];
for(var i=0;i<versions.length;i++){
var xhr=new ActiveXObject(versions[i]);
return xhr;
}
}else{
//支持W3C
var xhr=new XMLHttpRequest();
return xhr;
}
}
9八、ajax之post請求
var xhr=createXHR();
xhr.open('post','./01.php',true); //true表示異步傳輸 設置爲post
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//表示已經ajax已經處理完成
alert(xhr.responseText);
}
}
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); //POST傳遞必須設置請求頭信息
xhr.send('name=xiaoli&age=20'); //這裏填寫post傳遞的數據,而不是null
9九、ajax之get請求
var xhr=createXHR();
//注意點:get地址欄傳值時,若是值爲中文則須要使用encodeURIComponent函數對中文字符編碼
xhr.open('get','./01.php?name=xiaozhang&addr='+encodeURIComponent('北京'),true); //true表示異步傳輸 設置爲get
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//表示已經ajax已經處理完成
alert(xhr.responseText);
}
}
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); //POST傳遞必須設置請求頭信息
xhr.send(null);
100、ajax中get與post請求的區別
一、get請求傳遞參數使用地址欄,post請求傳遞參數使用send()方法
二、get請求中文參數須要轉碼:使用encodeURIComponent()方法對中文字符轉碼
三、post請求須要設置請求頭信息使用:setRequestHeader('content-type','application/x-www-form-urlencoded');
10一、ajax中同步與異步請求的區別:同步:在一個時間段只有一個請求,彼此之間有前後的依賴關係。異步:在一個時間段能夠由多個請求,彼此之間沒有前後
的依賴關係。
10二、禁止瀏覽器緩存該頁面(ajax中解決IE緩存問題)
header('Cache-control:no-cache');
header('Pragma:no-cache');
header('Expires:-1');
解決ajax緩存第二種方法是:對每次請求時在地址欄後面加上一個隨機數 如:'data.php?num='+Math.random()
10三、JS中的eval()方法 :把參數當成表達式運行
10四、php中的模式修正符 s:表示化爲一行 U:表示禁止貪婪匹配
10五、border-collpase:collpase
10六、array_intersect(array array1,array array2) 計算數組的交集 array_diff(array array1,array array2) 計算數組的差集
10七、JS調試: console.log(調試的對象)
10八、dom中設置屬性 setAttribute(k,v)
10九、jQuery中ajax的實現 $.ajax({type:'get',url:'地址',dataType:'html',data:'傳遞的數據',success:function(msg){alert(msg)}})
1十、php中如何判斷一個字符串存在某個字符 strpos('須要查找的字符串','匹配的字符')
1十一、截取一個URL地址的後綴名
function getExt($url){
$extension_str=pathinfo($url,PATHINFO_EXTENSION);
$index=strpos($extension_str, '?');
if($index){
$arr=explode('?', $extension_str);
$ext=$arr[0];
}else{
$ext=$extension_str;
}
return $ext;
}
1十二、MVC框架中空方法、空模塊處理 使用魔術方法 __call() 若是爲出現空方法與空操做則會調用 __call()方法觸發
11三、get_defined_constancts(true)獲得系統定義和用戶自定義的的常量 使用這個函數去查全部用戶自定的常量再在模板中使用
在ThinkPHP模板中使用常量能代替不少繁雜的操做 : $Think.const.__GROUP__ 獲得的是定位到group目錄下路徑 : /10-15TP/shop/go/index.php/admin
$Think.const.__URL__ 獲得的路徑是:/10-15TP/shop/go/index.php/admin/Manager 定位到了控制器
11四、mysql中時間戳與通常時間格式的轉換:
unix_timestamp('1997-8-10 22:23:00') 獲得的是 875996580
from_unixtime(時間戳) 獲得的是以'YYYY-MM-DD HH:MM:SS'格式的日期
from_unixtime(時間戳)+0 獲得的是以'YYYYMMDDHHMMSS'格式的日期
11五、func_get_args() 獲得函數全部的參數數組
11六、php的做用域是不重疊的,相互之間不能訪問。因此在函數內部不能訪問函數外的全局變量,在函數外部
不能訪問函數內部的局部變量。 每一個函數都有獨立的局部做用域,相互之間不可訪問。
11七、array_merge(數組1,數組2) 合併數組
11八、js中的join()方法將數組以元素以指定分割符組成一個字符串
var arr=['apple','sanxin','huasuo'];
var new_arr=arr.join(','); //獲得的結果是 apple,sanxin,huasuo
11九、js將 "apple,sanxin,huasuo" 轉換爲js數組 str.split(',')
120、根據索引移除數組中的某個元素的方法:
function removeByIndex(arr,index){
arr.splice(index,1);
}
12一、根據值移除數組中的某個元素的方法
function removeByValue(arr,value){
for(var i=0;i<arr.length;i++){
if(arr[i]==value){
arr.splice(i,1);
}
}
}
12二、js中的splice(index,nums,item1)方法 該函數時想數組中刪除或添加項目,
其中index與nums兩個參數必選,item1爲可選。若是選了則先刪除指定索引元素,再將item1添加到刪除的位置。
index表示數組索引,nums表示個數,items表示添加的項目 該函數會改變原來的數組
var arr=['xiaozhang','xiaowu','xiaoli','xiaoliu'];
arr.splice(2,1); //刪除數組索引爲2的元素
arr.splice(1,2); //刪除數組索引以1開始以後的兩個元素
arr.splice(1,1,'xiaoluo') //刪除數組索引爲1並將xiaoluo添加到剛刪除的位置
12三、jq實現複選框開關效果
var flag=false;
$('a').click(function(){
$("input[type='checkbox']").attr('checked',!flag);
flag=!flag;
})
實現複選框反選效果
$('a').click(function(){
var inputs=$("input[type='checkbox']");
for(var i=0;i<inputs.length;i++){
if($(inputs[i]).attr('checked')){
$(inputs[i]).attr('checked',false)
}else{
$(inputs[i]).attr('checked',true);
}
}
});
12四、檢查圖像是否已經被徹底加載進來
$('#theImage').attr('src','image.jpg').load(function(){
alert('所有加載進來');
})
12五、數據庫查詢優化
使用索引:index
建立index:
方法1:create index index_name on users(username)
方法2:alter table tab_name add index[index_name](username)
使用索引須要注意的問題:若是表執行比較多的插入與修改數據時,不建議使用索引。索引主要用於查詢
12六、mysql優化七個發麪:
一、表的設計符合3NF
知足1NF:一、表的字段具備原子性,不能分割 二、表的字段不能重複
2NF:不能存在徹底相同的記錄(記錄惟一性),通常是給表一個主鍵來控制,非業務邏輯主鍵
3NF:表中不能由冗餘的數據
二、創建合理的索引
三、使用分表技術
四、優化SQL語句
五、建立適當存儲過程,觸發器,視圖
六、對my.ini的配置優化配置緩存大小
七、升級硬件與軟件
12七、explain 指令能夠來分析mysql是如何執行你的SQL語句 基本用法:explain sql語句
explain select * from table\G 其中 \G表示以樹形的方式查看sql語句結構
12八、數據庫以查詢爲主選擇數據庫引擎爲MyISAM
數據庫以插入與更新爲主選擇數據庫引擎爲InnoDB
mysiam 適用於效率比較高,安全性不夠的
innodb 適用於安全性高,效率稍微低點
12九、鏈接查詢
一、交叉鏈接:也稱笛卡爾積 獲得的結果是表1與表2的乘積 select * from 表1 cross join 表2 on 條件
二、內鏈接:兩個表中的只有知足條件的記錄纔會出如今結果集中,不知足條件的
無論是表1仍是表2都不會出現。
select * from 表1 inner join 表2 on 條件
三、左外鏈接 簡寫爲 left join 左邊會顯示左表的全部記錄,右邊顯示右表的匹配成功的記錄,匹配不成功的
則用null填充
四、右外鏈接 簡寫爲 right join 右邊會顯示右表的全部記錄,左邊顯示匹配成功的記錄,匹配不成功的用null填充
五、自鏈接 主要用於本身查詢本身
130 視圖:視圖是虛擬表 視圖是文本文件裏面存放的是sql語句 sql執行生成的是二進制文件
建立視圖:create view view1 as select * from table_name
刪除視圖:drop view view1
使用視圖:select * from view1
13一、單例模式
class MySQL{
private static $instance=null;
private static function __construct(){
mysql_connect('127.0.0.1','root','123456');
}
//公開實例化方法
public static function getInstance(){
if(!self::$instance instanceof self){
self::$instance=new self;
}
return self::$instance;
}
//禁止克隆
private function __clone(){
}
}
13二、多個進程同時寫入同一個文件成功
$fp=fopen('a.txt','w+');
if(flock($fp,LOCK_EX)){
//得到寫鎖 寫數據
fwrite($fp,'test');
//解除鎖定
flock($fp,LOCK_UN);
}else{
echo '文件鎖定中';
}
13三、獲得url地址的擴展名
function getExt($url){
$arr=parse_url($url); //將url轉換爲地址
$file=basename($arr['path']); //獲得文件
explode('.',$file);
}
13四、檢查合法日期
function checkDate($date){
if(date('Y-m-d H:i:s',strtotime($date))==$date){
return true;
}else{
return false;
}
}
13五、smarty模板內建函數
{foreach from=數組 key='key' item='value'}
{foreachelse}
{/foreach}
foreach的內置變量
$smarty.foreach.name.iteration:索引(從1開始)
$smarty.foreach.name.total: 循環的總次數
13六、smarty開啓緩存及緩存時間:
$smarty->caching=true;
$smarty->cache_lifetime=7200; //設置緩存時間
默認緩存時間爲3600秒 $cache_lifetime=3600
檢查緩存:$smarty->isCached("tpl.html")
清除緩存:$smarty->clearCached('tpl.html');
清除全部緩存:$smarty->clearAllCached();
局部緩存:$smarty->assign('var',$var,true); 第三個參數表示是否不緩存
{$var nocache=true} 指定$var不緩存
{nocache}
不緩存的內容
{/nocache}
13七、smarty模板fetch讀取某個文件內容並輸出 {fetch file='文件名' isassign='var'} 表示保存本次結果但不輸出
13八、json是屬性的集合
13九、prototype:使用緣由:擴展對象當前實例的屬性或方法。功能:返回對象構造器的引用
140、閉包原理:當一個函數裏面包含另外一個函數,而且返回裏面函數的值,則當在函數外部使用一個全局變量
指向返回的函數的首地址時,裏面的函數所佔用的內存不會被回收,而函數內部的局部變量也不會被回收。這就是閉包原理。
function f1(){
var i=10;
function f2(){
alert(i);
}
return f2;
}
var d=f1(); //獲得f2的首地址
d(); //執行f2()
14一、正則表達式的經常使用模式:
一、忽略大小寫模式(i) /^test$/i
二、多行模式(m) /^test$/m
三、懶惰模式(U) /^test$/U
四、支持UTF-8轉義表達式(u) /^test$/u
14二、過濾全部的html標籤的正則表達式:<\/?[^>]+> 其中:\/?表示斜槓可無可有,匹配開始和關閉標籤。[^>]+表示若是不是右尖括號的字符
重複一次或屢次。
14三、XSS攻擊:指的是css和javascript腳本攻擊,主要在地址欄和論壇留言表單中 ,解決方案是:對特殊字符「<」,「>」等html標籤過濾
可使用 htmlspecialchars() 或者使用正則表達式過濾。
14三、microtime(true) 表示微妙數。該函數主要用於測試一個過程的執行總時間。用結束時間減去開始時間。
14四、在使用Session中,session_start()必須在程序最開始執行,前面不能有任何輸出內容。可是有時候確實須要輸出或者不能肯定是否有輸出則能夠以下:
ob_start();
session_start();
$_SESSION['user']='xiaoluo';
ob_end_flush();
14五、禁用Cookie以後,傳遞SessionID能夠經過 URL或者表單來傳遞。以下
a.php:
echo "<a href=new.php>new1</a>";
$a=session_name();
$b=session_id();
echo "<a href=new.php?a=$b>new2</a>";
new.php:
$session_name=session_name();
//取得sessionid
$sessionID=$_GET[$session_name];
//使用session_id設置得到的Session
session_id($sessionID);
session_start();
var_dump($_COOKIE);
var_dump($_SESSION);
14六、javascript進行加密驗證和非平衡圖形驗證碼
14七、IP限制
14八、Token法
14九、表單欺騙
150、getenv('REMOTE_ADDR') 獲得環境變量的函數
15一、MySQL常見引擎對比:
MyISAM: 非事務存儲引擎,表鎖 支持小數據,小併發,適用於頻繁查詢
InnoDB: 支持事務引擎,行鎖 支持大數據,大併發,適用於插入更新比較多的應用
15二、SQL注入:
如:select * from table where user='xiao' and pwd='111'
下面的SQL語句能夠繞過驗證
select * from table where user='xiao' and pwd='111' or 1=1
這條語句能夠繞過用戶名和密碼的驗證。
通常而言,若是用戶名或密碼經過GET傳遞過來則 以下地址能夠繞過用戶名與密碼驗證
http://www.chuanzhi.com/10-25/06sql.php?user=xiao&pwd=admin' or '1=1
防SQL攻擊可使用函數 addslashes(string) 會把全部傳入全部的'(單引號)、"(雙引號)、\(反斜槓)和空字符
15三、文件緩存
15四、ignore_user_abort() 關閉瀏覽器時PHP腳本也將繼續執行
15五、set_time_limit() 設置腳本最大執行時間,默認值爲30秒,若是爲0表示沒有限制。
PHP定時執行任務的實現
config.php文件
<?php return 1; ?>
test.php文件
<?php
ignore_user_abort();
set_time_limit(0);
$interval=60*30;
do{
$run=require('config.php');
if(!$run){
die('process abort');
}else{
//要執行的代碼
sleep($interval); //等待5分鐘
}
}while(true)
?>
15六、javascript對URL編碼的函數:
編碼函數:encodeURI(string) 該函數是對整個URL編碼
解碼函數:decodeURI(string)
編碼函數:encodeURIComponent() 該函數是對組成部分進行個別編碼
15七、設置客戶端緩存:
注意:
header('Cache-Control:max-age=86000,must-revalidate');
header('Last-Modified:'.gmdate('D,d M Y H:i:s').'GMT');
header('Expires:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');
注意:HTTP的日期時間是格林威治時間(GMT),而不是本地時間
例如:Expires:Fri,30 Oct 1998 12:41:12 bm GMT
15八、日誌管理
PHP日誌:
打開PHP的Log記錄,只須要在php.ini文件中設置以下選項
Log_errors = On //開啓日誌記錄和記錄的錯誤等級
LogLevel warn
error_log = e:/error.log //記錄Log的位置。
15九、ThinkPHP中URL訪問的幾種模式
160、ThinkPHP中的令牌
16一、array_merge($arr1,$arr2) 合併數組
16二、設置PHP.ini文件最大併發數、apache最大併發數
16三、瀏覽器端使用JS正則表達式驗證 服務器端使用php正則表達式驗證
16四、PHP中多態的使用
function add(Person person){
if(person instanceOf chinese){
echo '中國人的類';
}
if(person instanceOf usa){
echo '美國人的類';
}
if(person instanceOf english){
echo '英國人的類';
}
}
16五、構建流暢類的接口
class Goods{
private $good_name;
private $good_price;
public function setName($good_name){
$this->good_name=$good_name;
return this;
}
public function setPrice($good_price){
$this->good_price=$good_price;
return this;
}
}
$goods=new Goods();
$goods->setName('xiaozhang')->setPrice('2000');
16六、PHP的斷點續傳
16七、關於虛擬主機的詳細配置信息(重要)、
16八、正則表達式反向引用:引用字表達式內容時,若是在正則表達式直接使用使用\1號,若是在另外地方使用用$1
16九、apache發生錯誤,看錯誤日誌能夠能夠方便調試
170、將session保存到memcached中
17一、對myisam的存儲引擎表,進行碎片整理。optimize table 表名
17二、create table table_1 like table_2 根據建立結構相同的表
17三、a標籤的href和onclick同時使用時會發生的問題:a標籤的href執行頁面跳轉,onclick執行ajax請求。
當二者同時使用時,a標籤會先執行跳轉,ajax請求會中斷,也就是說ajax請求不到數據。
解決方案是:阻止a標籤的默認行爲,當ajax請求數據完成後再再執行a標籤的頁面跳轉
17四、dede中在html模板頁面中引入某模板的標籤是 {dede:global.cfg_templets_skin/}
如:<link href="{dede:global.cfg_templets_skin/}/css/index.css" type="text/css" rel="stylesheet"/>
17五、網站圖片的現加載效果
17六、格式化小數的函數 round(數字,2) 表示保留兩位小數
17七、以換行轉化爲數組 explode("\r\n",$str) 使用\r\n的緣由是與操做系統有關。
17八、服務器優化措施:
一、查看慢查詢的條數,定位性能脖頸
show global status like '%slow%'
二、適當使用Query Cache
三、增長Mysql最大鏈接數
查看最大鏈接數:show variables like 'max_connections'
四、從表中刪除大量數據後,可運行 optimize table tab_name 進行碎片整理
五、對於MyISAM,適當設置 table_cache
17九、壓力測試軟件:ab.exe apache的bin目錄下。ab.exe -c 100 -n 1000 地址
180、刪除地址欄參數的算法
18一、Sphinx 詞庫 搜狗詞庫 語言包的製做
18二、把Sphinx 安裝成一個系統服務 --install
18三、ifnull(字段名,'test') 數據庫中判斷字段名若是爲空爲輸出test
18四、dedecms中的防腳本攻擊的函數:在include/helpers/filter.helper.php文件中
18五、filemtime()獲得文件最後修改時間
18六、緩存內容
ob_start(); //開啓緩存
include './test.html'; //將該數據寫到緩存中
$_content=ob_get_content(); //獲得緩存內容
ob_clear(); //清空緩存區
18七、實現局部不緩存的,使用ajax去實現。
18八、var_export()打印出帶有php語法格式的字符串
$content=var_export(數組,true) 不會直接輸出出來,可是能夠用變量接受
var_export(數組,false) 直接輸出
該函數能夠將數組信息以有效的PHP語法格式寫到文件中
18九、對數組作緩存
方案1:序列化數組存到文件中,用時再反序列化
方案2:直接使用var_export()格式化數組,再寫到文件中
190、TP框架中的實例化模型 $model=M('Model')與$model=D('model')的區別
若是須要要使用模型中的數據,則使用D,若是隻是須要使用TP模型中的方法則使用M
19一、如何取json得數據
var json={'person':[{'name'=>'xiaozhang','age':20,'sex':'male'},{'name':'xiaowu','age':20,'sex':'famale'}]}
取得json中的某一個值:json.person[0].name 獲得的是person節點下的第一個數組下的name的值 xiaozhang
19二、使用空模型,應用場合:帶有鏈接查詢的SQL語句的執行,能夠實例化空模型,再調用query()
19三、無限極分類
腳本延遲執行:sleep(10)延遲10秒 不定參數 func_get_args()
19四、ckeditor的使用
19五、$.ajax({
type:'post',
url:''
data:$('form').serilize(), //技巧部分 獲得表單中的全部序列化數據
success:function(msg){
}
})
19六、stript_tags()過濾html標籤
19七、$(str).each(function(k,v){
alert(v);
})
19八、set_time_limit(0) 設置腳本執行時間爲沒有限制
19九、parse_url($url) 解析域名 獲得的是一個數組:hhtp,wwww.baidu.com,/name/xiaoming
200、開啓安全模式下,有些函數是失敗的,如mkdir,fopen,fread,fwrite,exec,system等涉及到文件系統的系統函數不能執行
默認是關閉的safe_mode=off 開啓是safe_mode=on
20一、char、varchar、text的區別
char :255字符
varchar:65535字節
text:65535字符
20二、SQL注入攻擊:
當在URL地址提交 id=1 or 1=1時會產生SQL注入 防範方法是使用intval(value)將數據轉換成整數
使用 addslashes(str) 驗證字符串,將單引號」"「轉換成」\'「 雙引號「"」轉換爲」\"「
使用mysql_real_escape_string() 轉義sql語句中的特殊字符
20三、跨站腳本攻擊:使用htmlspecialchars函數來防範
20三、在php.ini文件中將magic_quotes_gpc=on時,它會把提交的變量中的全部的單引號,雙引號,反斜線和空字符會自動轉化爲含有反斜線的轉義字符。
20四、SQL注入專題
一、select注入:sql語句:select * from user where username like '%$search%' order by username
注入語句:aabb%' or 1=1 order by id#
注入成的語句是:select * from user where username like '%aabb%' or 1=1 order by id #order by username
加入沒有含有aabb的用戶名,那麼or 1=1使返回值依然爲真,使其返回全部值
還能夠注入:%' order by id#
注入成功的語句是:select * from user where username like '% %' order by id#order by username
二、update users set password='$pwd',
20五、char與varchar的區別:
char與varchar的區別在於二者的保存方式和檢索方式
char爲固定長度,varchar爲可變長度,如char(4),varchar(4) 若是爲'ab'則 char爲'ab '未知的長度以空格填充,而varchar爲'ab'不會以空格填充
檢索方式:'ab ' varchar數據類型檢索出來是原數據'ab ',而char數據類型檢索出來的是'ab'會刪除尾部的空格
float、decimal的區別
float爲浮點數,decimal爲定點數,float爲產生不精確的狀況,如111.32可能會變成111.31
20六、TP中打印出SQL語句信息$this->getLastsql()
20七、PHP中使用eval()能夠將字符串解釋爲php腳本執行 如
$str="echo 'xiaozhang';";
eval($str);
20八、SQL優化:
優化的通常步驟:一、使用show status瞭解SQL的執行效率 二、定位執行效率低的SQL語句(經過慢查詢日誌文件或slow processlist)
三、經過explain分析低效的SQL語句() 四、採起對應的優化措施
使用show status 命令瞭解各類SQL的執行頻率,其中show session status 顯示的是session級別的統計結果,show global status 顯示的是global級別的結果
在show status中 下面的參數對MyIsam和Innodb存儲引擎都有計數
一、Com_select 執行select操做的次數
二、Com_insert 執行insert操做的次數
三、Com_update 執行update操做的次數
四、Com_delete 執行delete操做的次數
如下幾個參數時對Innodb存儲引擎計數
一、Innodb_rows_read select查詢返回的行數
二、Innodb_rows_inserted 執行Insert操做插入的行數
三、Innodb_rows_updated 執行update操做更新的行數
四、Innodb_rows_deleted 執行delete操做刪除的行數
對於事物型的應用,經過Com_commit和Com_rollback能夠了解事務提交和回滾的狀況
如下幾個參數能夠了解數據庫的基本狀況
一、Connections 試圖鏈接Mysql服務器的次數
二、Uptime 服務器的工做時間
三、Slow_queries 慢查詢的次數
經過explain分析低效的SQL語句
select_type: select 類型
table: 輸出結果集的表
type: 表示表的鏈接類型 當表中只有一行是type的值時爲system是最佳的鏈接類型
當select的錶鏈接沒有使用索引時,type的值爲all,表示對該表爲全表掃描,這時須要經過建立索引
來提升錶鏈接的效率。
possible_keys: 表示查詢時,可使用的索引列
key: 表示使用的索引
key_len: 索引長度
rows: 掃描範圍
extra 執行狀況
索引的存儲類型目前只有兩種(btree和hash),具體和表的模式相關
myisam btree
innodb btree
memory hash,btree
btree爲二叉樹 hash爲哈希
查看索引使用狀況:若是索引正在工做,Handler_read_key的值將很高。這個值表明了一個行被索引值讀的次數
Handler_read_rnd_next的值高則意味着查詢運行低效,而且應該創建索引補救。
show status like 'Handler_read%'
優化措施:整理文件碎片:optimize table (刪除大量數據後)
優化group by語句:默認狀況下mysql排序全部group by col1,col2 查詢時會隱式的指定order by col1,col2 可是你又想
避免排序結果的消耗,能夠執行order by null禁止排序。
20九、字符串的反轉,如:$str='hello,world' 不使用php函數
function fn1($str){
$len=strlen($str);
$new_str='';
for($i=$len-1;$i>=0;$i--){
$new_str.=$str[$i];
}
return $new_str;
}
2十、php中操做mongodb
將對應的版本的mongodb.dll文件放入php的ext文件夾下,開啓mongodb.dll的擴展
$mongo=new Mongo(); //建立Mongo對象
$data=array('name'=>'xiaoming','age'=>20);
$mongo->cms->user->insert($data); //執行插入
//修改操做 在控制檯中的修改是:db.user.update({'name':'xiaoluo'},{'$set':'xiaoli'})
$mongo->cms->user->update(array('name':'xiaoluo'),array('$set':'xiaoli'))
//取出數據
$arr=$mongo->cms->user->find(); //獲得的是一個遊標
while($arr->hasNext()){
$d=$arr->getNext(); //取得下一條記錄是數據的格式
echo $d['name'];
echo $d['age'];
}
2十一、在控制檯下操做mongodb
切換數據庫:use cms 切換到cms數據庫中(因爲mongodb是無模式的數據庫因此若是不須要主動建立數據庫,只要裏面插入數據則會自動生成數據庫)
插入數據: db.user.insert({'name':'xiaozhang'},{'age':20})
刪除數據: db.user.remove({'name':'xiaoluo'}) //刪除了name爲xiaoluo的一條記錄
修改數據: db.user.update({'name':'xiaowu'},{'$set':{'age':20}}) //將name爲xiaowu的一條記錄修改name爲xiaoli 若是沒有age這個字段則主動添加上
查找數據: db.user.find() //查找出全部數據
按條件查詢:db.user.find({'name':'xiaoluo'}) //查找出name爲xiaoluo的記錄
查找數據: db.user.findOne() //查找出一條記錄
使用遊標查詢數據
var data=db.user.find(); //獲得一個遊標 不能使用for語句遍歷輸出
while(data.hasNext()){
var dd=data.next();
print(dd.name);
print(dd.age);
}
2十二、mongodb的特色:
一、面向文檔的數據庫
二、無模式(無需建表,也無需建數據庫)
三、以BSON格式存儲數據(一種類JSON的格式)
四、javascript做爲操做語言
五、支持多種語言:php、python、java、c++
六、支持GridFS
javascript