<?php
/**
* 創建多級目錄
* @param $path string 要創建的目錄
* @param $mode int 創建目錄的模式,在windows下可忽略
*/
function create_dir($path,$mode = 0777)
{
if (is_dir($path)) {
# 如果目錄已經存在,則不創建
echo "該目錄已經存在";
} else {
# 不存在,創建
if (mkdir($path,$mode,true)) {
echo "創建目錄成功";
} else {
echo "創建目錄失敗";
}
}
}
?>
速度快,編譯型,緩存技術,插件機制,強大的表現邏輯
safe_mode,php安全模式,它提供一個基本安全的共享環境,在一個有多個用戶賬戶存在的php開發的web服務器上。當安全模式打開的時候,一些函數將被完全的禁止,而另一些函數的功能將會受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性完全去除了。
file_get_contents或者curl
PHP可以自動進行內存管理,清除不再需要的對象。
PHP使用了引用計數(reference counting)這種單純的垃圾回收(garbage
collection)機制。每個對象都內含一個引用計數器,每個reference連接到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器減1。當某個對象的引用計數器為零時,PHP知道你將不再需要使用這個對象,釋放其所占的內存空間。
核心思路:加鎖
<?php
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//獲得寫鎖,寫數據
fwrite($fp, "write something");
// 解除鎖定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
?>
<?php
// 方案一
function getExt1($url){
$arr = parse_url($url);
//Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )
$file = basename($arr['path']);
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
// 方案二
function getExt2($url){
$url = basename($url);
$pos1 = strpos($url,'.');
$pos2 = strpos($url,'?');
if (strstr($url,'?')) {
return substr($url,$pos1+1,$pos2-$pos1-1);
} else {
return substr($url,$pos1);
}
}
$path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
echo getExt1($path);
echo "<br />";
echo getExt2($path);
?>
<?php
function my_scandir($dir){
$files = array();
if(is_dir($dir)){
if ($handle = opendir($dir)) {
while (($flie = readdir($handle))!== false) {
if ($flie!="." && $file!="..") {
if (is_dir($dir."/".$file)) {
$files[$file] = my_scandir($dir."/".$file);
} else {
$files[] = $dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
?>
創建類別表如下:
CREATE TABLE category(
cat_id smallint unsigned not null auto_increment primary key comment'類別ID',
cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱',
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID'
)engine=MyISAM charset=utf8;
編寫一個函數,遞歸遍歷,實現無限分類
<?php
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是頂級分類,則將其存到$list中,並以此節點為根節點,遍歷其子節點
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
?>
<?php
function releative_path($path1,$path2){
$arr1 = explode("/",dirname($path1));
$arr2 = explode("/",dirname($path2));
for ($i=0,$len = count($arr2); $i < $len; $i++) {
if ($arr1[$i]!=$arr2[$i]) {
break;
}
}
// 不在同一個根目錄下
if ($i==1) {
$return_path = array();
}
// 在同一個根目錄下
if ($i != 1 && $i < $len) {
$return_path = array_fill(0, $len - $i,"..");
}
// 在同一個目錄下
if ($i == $len) {
$return_path = array('./');
}
$return_path = array_merge($return_path,array_slice($arr1,$i));
return implode('/',$return_path);
}
$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
$c = '/e/b/c/d/f.php';
$d = '/a/b/c/d/g.php';
echo releative_path($a,$b);//結果是../../c/d
echo "<br />";
echo releative_path($a,$c);//結果是a/b/c/d
echo "<br />";
echo releative_path($a,$d);//結果是./
echo "<br />";
?>
mysql_fetch_row()把數據庫的一列儲存在一個以零為基數的數組中,第一欄在數組的索引0,第二欄在索引1,依此類推。
mysql_fetch_assoc()把數據庫的一列儲存在一個關聯數組中,數組的索引就是字段名稱,例如我的數據庫查詢送回“first_name”、“last_name”、“email”三個字段,數組的索引便是“first_name”、“last_name”和“email”。
mysql_fetch_array()可以同時送回mysql_fetch_row()和mysql_fetch_assoc()的值。
方法1(對於PHP5及更高版本):
$readcontents=fopen("http://www.phpres.com/index.html","rb");
$contents=stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");
由模型(model),視圖(view),控制器(controller)完成的應用程序。
model層負責提供數據,和數據庫有關的操作都交給模型層來處理,view層則提供交互的界面,並輸出數據,而controller層則負責接收請求,並分發給相應的model來處理,然後調用view層來顯示。
GD庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。自從PHP 4.3.0版本後GD便內建在PHP系統中。
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()這不是一個PHP函數,會引致執行錯誤。
file_open()這不是一個PHP函數,會引致執行錯誤。
fopen()這是正確答案,fopen()可以用來開啟檔案以便讀寫。
open_file()這不是一個PHP函數,會引致執行錯誤。
smarty是一個模板引擎,使用smarty主要是為了實現邏輯和外在內容的分離,如果不使用模板的話,通常的做法就是php代碼和html代碼混編。使用了模板之後,則可以將業務邏輯都放到php文件中,而負責顯示內容的模板則放到html文件中。
Smarty在執行display方法的時候,讀取模板文件,並進行數據替換,生成編譯文件,之後每次訪問都會直接訪問編譯文件,讀取編譯文件省去了讀取模板文件,和字符串替換的時間,所以可以更快,編譯文件裡時間戳記錄模板文件修改時間,如果模板被修改過就可以檢測到,然後重新編譯(編譯是把靜態內容保存起來,動態內容根據傳入的參數不同而不同)。
如果啟用了緩存,則會根據編譯文件生成緩存文件,在訪問的時候如果有緩存文件並且緩存文件沒有過期,則直接訪問緩存文件。
smarty,phplib等
Smarty
方法一:php函數跳轉,缺點,header頭之前不能有輸出,跳轉後的程序繼續執行,可用exit中斷執行後面的程序。
header("Location:網址");//直接跳轉
header("refresh:3;url=http://axgle.za.net");//三秒後跳轉
方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=網址'>";
可以
SVN或者CVS
TortoiseSVN-1.2.6
過濾javascript腳本參考:
<?php
header("content-type:text/html;charset=utf-8");
$script = "以下內容不顯示:<script type='text/javascript'>alert('cc');</script>";
$pattern = '/<script[^>]*?>.*?</script>/si';
echo preg_replace($pattern, "腳本內容", $script);//以下內容不顯示:腳本內容
?>
方案一,使用PHP內建函數strip_tags()除去HTML標簽
方案二,自定義函數,如下:
<?php
header("content-type:text/html;charset=utf-8");
function strip_html_tags($str){
$pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/';
return preg_replace($pattern,'',$str);
}
// 實例
$html = '<p id="">ddddd<br /></p>';
echo strip_html_tags($html);
echo "<br />";
$html = '<p id=">">bb<br />aaa<br /></p>';
echo strip_html_tags($html);
?>
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);
主要區別有以下三種:
使用Perl兼容正則表達式語法的preg_match()函數通常是比ereg()更快的替代方案。
首先進入php安裝目錄
php -f d:/wamp/www/1.php 其中-f參數指定要執行的php文件
php -r phpinfo(); 其中-r表示直接執行php代碼,無需寫開始結束標記
編寫如下函數:
<?php
header("content-type:text/html;charset=utf-8");
function getAttrValue($str,$tagName,$attrName){
$pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i";
$arr=array();
$re=preg_match($pattern1,$str,$arr);
if($re){
echo"<br/>\$arr[6]={$arr[6]}";
}else{
echo"<br/>沒找到。";
}
}
// 示例
$str1="<test attr='ddd'>";
getAttrValue($str1,"test","attr");//找test標簽中attr屬性的值,結果為ddd
$str2="<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>";
getAttrValue($str2,"test2","t1");//找test2標簽中t1屬性的值,結果為t1 value
?>
這是把一個日期從MM/DD/YYYY的格式轉為DD/MM/YYYY格式。
輸出26/08/2003
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()這不是一個PHP函數,會引致執行錯誤。
header()這個是正確答案,header()函數發送頭信息,可以用來使浏覽器轉向到另一個頁面,例如:header("Location:http://www.search-this.com/")。
location()這不是一個PHP函數,會引致執行錯誤。
redirect()這不是一個PHP函數,會引致執行錯誤。
28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(騰訊)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C
29.一個函數的參數不能是對變量的引用,除非在php.ini中把____設為on。
allow_call_time_pass_reference
是否啟用在函數調用時強制參數被按照引用傳遞
<META http-equiv='Content-Type'content='text/html;charset=gbk'>
,請使用PHP語言寫一個函數,把一個標准HTML頁面中的類似meta標記中的charset部分值改為big5。(新浪)請注意:
(1)需要處理完整的html頁面,即不光此meta語句
(2)忽略大小寫
(3)'和"在此處是可以互換的
(4)'Content-Type'兩側的引號是可以忽略的,但'text/html;charset=gbk'兩側的不行
(5)注意處理多余空格
編寫正則表達式如下:
$reg1="/(<meta\\s*http-equiv\\s*=\\s*(['\"]?)Content-Type(\\2)\\s*content\\s*=\\s*(['\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";
<?php
function checkDateTime($data){
if (date('Y-m-d H:i:s',strtotime($data)) == $data) {
return true;
} else {
return false;
}
}
// 示例
$data = '2015-06-20 13:35:42';
var_dump(checkDateTime($data));//bool(true)
$data = '2015-06-36 13:35:42';
var_dump(checkDateTime($data));//bool(false)
?>
使用key()可以獲得數組中當前元素的鍵名,使用current()則可以返回當前元素的值。
使用array_keys()則可以得到數組中所有的鍵名。
使用foreach結構foreach($arr as $key=>$value)可以通過$key和$value分別獲取鍵名和值。
$data=array(
0=>array('id'=>8,'name'=>'name1'),
1=>array('id'=>10,'name'=>'name2'),
2=>array('id'=>15,'name'=>'name3')
);
寫出在模板頁的代碼?若用foreach語句又要怎樣顯示呢?
用section語句:
<{section name=test loop=$data start=0 step=1}>
id:<{$data[test].id}><br/>
name:<{$data[test].name}><br/><br/>
<{sectionelse}>
數組為空
<{/section}>
用foreach語句:
<{foreach from=$data item=test}>
id:<{$test.id}><br/>
name:<{$test.name}><br/><br/>
<{foreachelse}>
數組為空
<{/foreach}>
B.*****xyz1
C.******xyz2
D.*xyz
答案:C
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C
匹配以0個或多個空白符開頭或者0個或多個空白符結尾的字符串
<?php
date_default_timezone_set('PRC');
/**
* 獲取給定月份的上一月最後一天
* @param $date string 給定日期
* @return string 上一月最後一天
*/
function get_last_month_last_day($date = ''){
if ($date != '') {
$time = strtotime($date);
} else {
$time = time();
}
$day = date('j',$time);//獲取該日期是當前月的第幾天
return date('Y-m-d',strtotime("-{$day} days",$time));
}
// 測試
echo get_last_month_last_day();
echo "<br />";
echo get_last_month_last_day("2013-3-21");
?>
可以,還可以在需要控制的子目錄下創建.htaccess文件,寫入訪問控制。
從以下幾個方面考慮:
urlencode()
md5($str);
sha1($str);
<?php
date_default_timezone_set("PRC");
// 將字符串轉成Unix時間戳
$unix_time = strtotime("2009-9-2 10:30:45");
echo $unix_time;
echo "<br />";
// 格式化Unix時間戳為正常時間格式
echo date("Y-m-d H:i:s",$unix_time);
?>
<?php
iconv('GB2312','UTF-8','悄悄是別離的笙箫');
?>
htmlspecialchars或者htmlentities
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等
FleaPHP、Zend Framework、CakePHP、Symfony、ThinkPHP、YII、CodeIgniter等
上傳文件的表單使用post方式,並且要在form中添加enctype='multipart/form-data'
。
一般可以加上隱藏域:<input type=hidden name='MAX_FILE_SIZE' value=dddddd>
,位置在file域前面。
value的值是上傳文件的客戶端字節限制。可以避免用戶在花時間等待上傳大文件之後才發現文件過大上傳失敗的麻煩。
使用file文件域來選擇要上傳的文件,當點擊提交按鈕之後,文件會被上傳到服務器中的臨時目錄,在腳本運行結束時會被銷毀,所以應該在腳本結束之前,將其移動到服務器上的某個目錄下,可以通過函數move_uploaded_file()來移動臨時文件,要獲取臨時文件的信息,使用$_FILES。
限制上傳文件大小的因素有:
UBB代碼是HTML的一個變種,通過程序自定義我們的標簽,比如“[a]PHP中UBB的使用[/a]
”這樣的標簽,其實質就是查找[a][/a]
標簽,將其替換成的標准html,說白了,就是將標准的html標記通過技術手段使其簡化,其輸出出來的結果還是標准的html。
明白了ubb的原理,那麼再制作一個簡單的ubb編輯器就不難了,和fck之類的編輯器比較起來,ubb代碼最大的優點就是代碼簡單,功能很少,簡單的ubb只需要一個文件,而且ubb標簽可以自己來定義,更改起來很方便,在php中就是利用替換函數就可以將
html進行標簽化,輸出時進行標簽的轉化。
可以自己設置上傳文件的保存目錄,與文件名拼湊形成一個文件路徑,使用move_uploaded_file(),就可以完成將文件保存到指定目錄。
可以通過上傳的文件名獲取到文件後綴,然後使用時間戳+隨機數+文件後綴
的方式為文件重新命名,這樣就避免了重名。
debug_print_backtrace()
設數組分配過來的數組名為$ids
{section name=temp loop=$ids}
{if $ids[temp].id==500}
<span style=‘color:#f00;’>{$ids[temp].id}</span>
{esle}
{$ids[temp].id}
{/if}
{/section}
使用{$smarty.now}
來獲取當前時間,得到的是unix系統時間戳
使用變量調節器進行格式化,如下:
{$smarty.now|date_format:“%Y-%m-%d%H:%M:%S”}
$smarty.get.變量 #顯示通過get方式傳過來的指定變量的值
$smarty.post.變量 #顯示通過post方式傳過來的指定變量的值
$smarty.cookies.變量 #顯示通過cookie中指定變量的值
$smarty.server.SERVER_NAME #顯示server變量值,$_SERVER系列變量
$smarty.env.PATH #顯示系統環境變量值,$_ENV系列變量
$smarty.session.變量 #顯示session中指定變量的值
$smarty.request.變量 #顯示通過post、get、cookie中指定變量的值
使用模板分隔符包含,傳遞參數則使用HTML屬性的方式,例如:
{html_image file="pumpkin.jpg"}
mysql,gd,pdo,XML,zip,filesystem,mail等
utf8_to_gb2312或者utf8togb2312
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接訪問文件,不進行下面的rewrite規則,
如果REQUEST_FILENAME目錄存在,就直接訪問目錄,不進行下面的rewrite規則,
RewriteRule./index.php[L]的意思是把所有的請求都給index.php處理。
一般是在header、set_cookie以及session_start函數前面有輸出(包括空格)的情況下,會報該警告信息。