PHP字串長度找子字串與取代字串的常用函數

PHP在字串的操作上,有非常多的相關函數可以使用,我們在這裡只介紹經常會使用到的字串操作函數。像是如何取得字串的長度、在某一個字裏面尋找子字串首次出現的位置、以及字串的取代函數...等等。這些都是在編寫程式的時候,頻繁被程式設計師使用到的基礎函數。 取得字串長度 <?...

顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2018年2月16日 星期五

PHP字串長度找子字串與取代字串的常用函數

PHP在字串的操作上,有非常多的相關函數可以使用,我們在這裡只介紹經常會使用到的字串操作函數。像是如何取得字串的長度、在某一個字裏面尋找子字串首次出現的位置、以及字串的取代函數...等等。這些都是在編寫程式的時候,頻繁被程式設計師使用到的基礎函數。

取得字串長度
<?php
$str_len = strlen('abc');
echo '長度:'.$str_len;
?>
輸出結果:
長度:3

在某字串中,找出一個子字串第一次出現的位置
<?php
$str = 'abcdefg';
$str_pos = strpos($str, 'd');
echo '位置:'.$str_pos;
?>
輸出結果:
位置:3

在某字串中,找出一個子字串最後一次出現的位置
<?php
$str = 'abcdeDdfg';
$str_rpos = strrpos($str, 'd');
echo '位置:'.$str_rpos;
?>
輸出結果:
位置:6

找出一個不區分大小寫的子字串第一次出現的位置
<?php
$str = 'abDcdefg';
$str_ipos = stripos($str, 'd');
echo '位置:'.$str_ipos;
?>
輸出結果:
位置:2

找出一個不區分大小寫的子字串最後一次出現的位置
<?php
$str = 'abDcdefDg';
$str_ripos = strripos($str, 'd');
echo '位置:'.$str_ripos;
?>
輸出結果:
位置:7

字串取代
表示取代所有已找到的字串為新字串
<?php
$str = "abc中文def";
$new_str = str_replace('中文', '功夫', $str);
echo '新字串:'.$new_str;
?>
輸出結果:
新字串:abc功夫def

字串取代 (不區分大小寫)
<?php
$str = "abDcDdefd";
$new_str2 = str_ireplace('d', 'x', $str);
echo '新字串:'.$new_str2;
?>
輸出結果:
新字串:abxcxxefx


PHP字串去除空白與字串轉大小寫

PHP字串去除空白可以依編寫程式的需要來去除左右邊的空白,亦或是只去除左邊還是右邊的空白。也可以對字串進行完全大寫或小寫的轉換,或是在字串中對第一個字元轉大寫或小寫,如果你要將字串裡面的每一個字的的第一個字元都轉成大寫也是有對映的函數可以運用。

去除字串左右空白
<?php
$str = ' abc ';
echo trim($str);
?>
輸出結果:
abc

去除字串左邊空白
<?php
$str = ' abc ';
echo ltrim($str);
?>
輸出結果:
abc

去除字串右邊空白
<?php
$str = ' abc ';
echo rtrim($str);
?>
輸出結果:
 abc

字串轉小寫
<?php
$str = 'ABC';
echo strtolower($str);
?>
輸出結果:
abc

字串轉大寫
<?php
$str = 'abc';
echo strtoupper($str);
?>
輸出結果:
ABC

字串的字首大寫
<?php
$str = 'abc';
echo ucfirst($str);
?>
輸出結果:
Abc

字串的字首小寫
<?php
$str = 'ABC';
echo lcfirst($str);
?>
輸出結果:
aBC

字串中的每一個字的開頭字元大寫
<?php
$str = 'apple newsletter';
echo ucwords($str);
?>
輸出結果:
Apple Newsletter





PHP字串分割與組合函數

字串的分割、組合函數,在開發PHP的程式設計當中是經常運用的程式開發技巧,可以將一個字串切割成多段子字串,再儲存於陣列中。相反的,也可以將一個陣列內的元素,重新組合成為一個字串,亦或直接從CSV檔案中取出每一個資料元素合成一個新的陣列。

透過字串來分割字串
<?php
$arr1 = explode("|", "A|B|C");
print_r($arr1);
?>
輸出結果:
Array ( [0] => A [1] => B [2] => C )


組合陣列為一個字串
<?php
$arr1 = array('A','B','C');
$str1 = implode("|", $arr1);
echo $str1.'<br/>';

// 表示implode的別名
$str2 = join("|", $arr1);
echo $str2;
?>
輸出結果:
A|B|C
A|B|C


剖析CSV檔案格式為一個陣列
<?php
$csv_str = "a,b,c,d,e";
$arr2 = str_getcsv($csv_str);
print_r($arr2);
?>
輸出結果:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )


轉換一個字串為一個陣列
<?php
// 依3個字元長度進行字串切割
$str3 = "abcdef";
$arr3 = str_split($str3,3);
print_r($arr3);
?>
輸出結果:
Array ( [0] => abc [1] => def )


剖析字串為變數
主要是將PHP網頁請求的$_GET或$_POST方法所傳入的Query String的網頁傳遞的編碼參數進行格式化的陣列轉換。
<?php
// 表單請求的Query String
$str4 = "user=monkey&phone=7533967";
$arr4 = parse_str($str4, $result);
print_r($result);
?>
輸出結果:
Array ( [user] => monkey [phone] => 7533967 )




2018年2月13日 星期二

PHP自定函數的使用

PHP的自定函數的名稱,可以是英文字數、數字、或底線的字元組合而成,前綴字必須是function為開頭,中間為函數名稱,括孤內為要傳遞的參數,傳遞參數的方式可以分為傳值呼叫(Call by value)或傳址呼叫(Call by reference),一般我們常見到的函數使用都是傳值呼叫的方式。接下來我們就來自定義一下我們的第一支PHP函數:

第一支PHP自定函數 (或傳值呼叫函數)
以下的範例是一個簡單與典型的傳值呼叫方式的自定義函數。在呼叫該函數時會傳入$user這個全域性變數,然而$user這個字串變數值不會因為執行該函數後,產生任何的改變。這個就是傳值呼叫函數的重要特徵。
<?php
// 我的自定函數 (傳值函數)
function my_function($name) {
  echo $name."歡迎光臨!<br/>";
  $user = "大毛";
}

// 呼叫自定函數
$user = "小明";
my_function($user);
echo $user;
?>
輸出畫面:
小明歡迎光臨!
小明


傳址呼叫函數
何謂傳址呼叫函數? 故明思義,就是傳遞參數的記憶體的參考位置給自定函數使用的意思,如果還是以上面的例子來改寫說明如下,請仔細注意my_function函數的$name參數左邊多了一個&字母,表示當再次呼叫該自定函數後,$user這個全域性字串變數值會因為執行而結果產生變化。

<?php
// 我的自定函數 (傳址函數)
function my_function(&$name) {
  echo $name."歡迎光臨!<br/>";
  $name = "大毛";
}

// 呼叫自定函數
$user = "小明";
my_function($user);
echo $user;
?>
輸出畫面:
小明歡迎光臨!
大毛



2018年1月14日 星期日

PHP日期Date的常用函數

在PHP的程式語言裡,早期就是採用Date函數來處理日期的產生、格式化以及字串轉換成日期型態。
  1. 可以利用time()或mktime()獲得當前的時間戳記
  2. 或者使用date()來針對特定日期進行格式化
  3. 若要把字串轉換成為日期就要透過strtotime()函數
以下為簡單的指令操作範例:
<?php
// 取得目前時間的timestamp
$now = time();
$now2 = mktime();

// 對現在的日期進行格式化
echo date("Y-m-d H:i:s", $now);

// 將字串轉換成日期
echo strtotime("2018-01-02");
?>

如果要採行新的作法,也可以考慮改用DateTime日期類別,PHP 5.2.x版本以後開始支援。

PHP日期DateTime的常用函數

從PHP 5.2.x開始以後, 我們可以使用DateTime類別來產生某特定日期、日期格式化與日期的加減操作, 過去習慣利用Date函數來幫我們完成這些任務。

產生今天的日期函數

<?php
// 取得目前時間的timestamp
$now = time();
$now2 = mktime();
?>

透過DateTime產生日期和日期格式化

<?php
// 建立DateTime型別的日期
//$date = DateTime("2018-01-02");
$date = date_create("2018-01-02");

// 針對DateTime型別的日期進行格式化
$date_ft = date_format($date,"Y-m-d");
echo $date_ft;
?>

運用DateTime進行日期加、減運算

<?php
// 某特定日期增加6天
$date_m6 = date_modify($date,"+6 days");
// 某特定日期減少3天
$date_m3 = date_modify($date,"-3 days");
?>
我們在透過DateTime進行日期、時間的算術運算操作時,若要將剛才生成的DateTime實體物件打印出來可以使用print_r($date_m3)來觀察該物件內存放了那些資料,要不然必須先把日期物件格式化為字串,才能順利輸出到電腦螢幕畫面上顯示。

PHP常用輸出指令

在PHP程式語言的世界裡,若要將程式執行的結果輸出到電腦螢幕上,就需要以下6個經常使用的輸出資料串流的指令。由於這些指令除了可以讓我們除錯程式碼,也可以讓我們預覽準備要傳送到列表機列印的欄位、資料、格式正確與否。

  • echo  輸出一個字串或多個字串
  • print  輸出一個字串
  • print_r  列印一個陣列
  • var_dump  輸出一個變數的相關資訊
  • die  輸出結果並且終止程式
  • exit 當參數為0時,等同die的作用

使用範例說明:

<?php
// 輸出字串
echo "你好嗎?";
print "I am fine.";

// 輸出陣列
print_r(array('apple','android'));

// 輸出變數型別、長度等明細資訊
$str = "開心果";
var_dump($str);

// 輸出變數且終止程式
$str2 = "Happy Birthday";
die($str2);

// 也可以使用exit(0)終止程式
echo $str2;
exit(0);
?>

PHP輸出格式化字串

想要讓字串可以進行格式化的編排、組合,並且能夠傳回字串變數、輸出到螢幕或輸出到文字檔案裏面。
一定要記得使用以下4種格式化字串的指令操作方式:

  • printf  輸出格式化的字串
  • sprintf  回傳格式化的字串
  • sscanf  將字串輸入格式化,回傳對映的變數
  • fprintf  將格式化字串寫入文字檔案

使用範例說明:

<?php
// 列印格式化的字串到電腦螢幕上
$name = "小明";
$number = 6;
$dollar = 177.6;
printf("%s有%d張一塊美鈔,折合新台幣%f元", $name, $number, $dollar);

// 組合格式化的字串
$combine_str = sprintf("%s有%d張一塊美鈔,折合新台幣%f元", $name, $number, $dollar);
echo $combine_str;

// 棓析格式化字串為相映數位
$today = "2017-01-14";
list($year, $month, $day) = sscanf($today, "%d-%d-%d");
echo $year. $month. $day;

// 將19.88寫入balance.txt檔案內
$fp = fopen('balance.txt', 'w');
$revenue = 19.8756;
fprintf($fp, '%01.2f', $revenue);
?>

2018年1月6日 星期六

PHP的JSON編碼使用

JSON(JavaScript Object Notation)它是一種羽量級的資料交換語言,類似於XML的易於人類閱讀與使用,屬於Javascript的一個子集合,JSON的資料格式獨立於語言,目前被很多程式語言(PHP,ASP,JAVA,C...等等)所支援的資料交換格式。JSON的MIME 類型是application/json。

事前的準備工作:
  1. 建立一個$arr陣列物件
  2. 使用json_encode函數,把$arr陣列編碼成$json字串
  3. 再運用json_decode函數,把$json字品解碼回$arr_new陣列
首先,我們來使用PHP Array創建一個$arr的關連一維陣列,
<?php
// 建立$arr陣列
$arr = array("name"=>"Monkey boy", "tel"=>3829389);
?>

然後,以json_encode函數,把剛才建好的$arr陣列物件編碼成$json字串
<?php
// JSON編碼
$json = json_encode($arr);
?>

最後,透過json_decode函數,把$json字串解碼回$arr_new陣列物件
<?php
// JSON解碼
$arr_new = json_decode($json);
echo $arr_new;
?>

PHP陣列Array的使用

PHP語言當中,陣列是一種很常使用的資料型態,通常用來儲存一組資料或資料的集合。一般分為三種類型的陣列:
  1. 索引陣列
  2. 關聯陣列
  3.  多維陣列
索引陣列(或稱一維陣列)
<?php
// 建立一個$fruit陣列存放三個元素到陣列中
$fruit = array("香蕉","西瓜","蘋果");
echo $fruit[0];
?>

關聯陣列
它是由多組的鍵/值所組合而成的資料集合。
<?php
// 建立一個$member陣列存放二個元素到陣列中
$member = array("name"=>"Jerry","tel"=>"3924350");
echo $member["name"];
?>

多維陣列
顧名思義列陣裡面還有陣列的意思。我們就簡單實作一個二層次的两維陣列,如下所示。
<?php
// 產生一個$order两維陣列存放二個訂單明細陣列
$order = array(

           "order_id"=>"order0001",

           "total_amount"=>998,

           "detail0001"=>array("goods_name"=>"白上衣","price"=>299),

           "detail0002"=>array("goods_name"=>"牛仔褲","price"=>699),

          );

echo $order[detail0001]["goods_name"];
?>

陣列的基本操作
<?php
// 計算陣列的長度
echo count($order);

// 利用foreach讀取陣列元素
foreach($order as $key=>$value) {
    echo $value["order_id"];
    echo $value["total_amount"];
}

// 判斷'西瓜'元素是否在$fruit陣列中
if(in_array("西瓜", $fruit)) {
    echo "答對了!"
} else {
    echo "答錯了!"
}

// 將陣列內的元素重新賦於新的變數
list($banana,$watermelon,$apple) = $fruit;
echo $banana;
?>

2018年1月2日 星期二

PHP的序列化Serialize使用

首先,我們需要建立一個User的類別,便於後續物件序列化與反序列化的作業,

<?php
class User {
  private $name;
  private $pass;
  
  function __construct($name, $pass) {
      $this->name = $name;
      $this->pass = $pass;
  }

  public function getName() {
      return $this->name;
  }
  
  public function setName($name) {
      $this->name = $name;
  }

  public function getPass() {
      return $this->pass;
  }
  
  public function setPass($pass) {
      $this->pass = $pass;
  }
}
?>

以它來實體化一個新的$user物件,
<?php
$user = new User("Jerry", "adioirq386hsakhd");
echo $user->getName();
?>

然後我們使用serialize函數將$user物件序列化為字串,
<?php
//物件的序列化
$user_str = = serialize($user);
?>

最後可以利用unserialize函數把$user_str字串反序列化為$obj物件。
<?php
//物件的反序列化
$obj = unserialize($user_str);
?>

2017年12月25日 星期一

PHP使用$_SERVER取得主機IP與網址

<?php
// 取得server ip
echo $_SERVER['SERVER_ADDR'];

// 取得目前請求的PHP頁面的完整URI
echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
echo $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

// 取得目前請求的PHP頁面的完整實體路徑
echo $_SERVER['SCRIPT_FILENAME'];

// 取得網站的根目錄
echo $_SERVER['DOCUMENT_ROOT'];

// 取得目前請求的PHP頁面的相對URI
echo $_SERVER['REQUEST_URI'];
echo $_SERVER['SCRIPT_NAME'];
echo $_SERVER['PHP_SELF'];
?>

PHP取得隨機時間的函數

<?php
// 取得隨機時間的函數
function get_rand_time($st_time, $ed_time)
{  
  $nums = ($ed_time - $st_time)/(24*60*60);
  //echo  '1 ~ ' . $nums . '<br/>';

  $rd_num = rand(1,$nums);
  //$rand_time = $st_time + ($rd_num - 1) * 24*60*60;
  $rand_time = $st_time + ($rd_num - 1) * 24*60*60 + (rand(1,86399));
  if($rand_time > time()) $rand_time = time();
  //echo $rand_time . ' ('.$rd_num.') <br/>';
  //echo date("Y-m-d H:i:s", $rand_time);
  
  return date("Y-m-d H:i:s", $rand_time);
}

// 執行函式呼叫
$ed_time = strtotime(date("Y-m-d"));
$st_time = $ed_time - 30*24*60*60;

get_rand_time($st_time, $ed_time);

?>

PHP日期DATE指令的操作

<?php
// 取得現在時間時間戳記(Unix timestamp)
echo time();
echo mktime();

// 格式化時間
echo date('Y-m-d H:i:s', '1461827400');
echo date("Y-m-d H:i:s");

// 字串轉時間
echo strtotime("10:30pm April 15 2014");

// 設定timestamp
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

// 設定預設的時區
date_default_timezone_set();

// 設定timezone和format
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

?>

PHP與SimpleXml使用CRUD

<?php
// 建立SimpleXmlElement
$config = new SimpleXmlElement('');
$config->setting1 = 'setting1 value';         
$config->saveXML('config.xml');               

// 讀取SimpleXmlElement
$config = new SimpleXmlElement('config.xml');
echo $config->setting1;
echo $config->asXml();

// 更新SimpleXmlElement
$config->setting1 = 'new value';
$config->setting2 = 'setting2 value';
echo $config->asXml();

// 刪除SimpleXmlElement
unset($config->setting1);
$config->setting2 = NULL;
echo $config->asXML();
unlink('config.xml');

?>

PHP常用字串指令的使用

<?php
$str = "電腦專家,是PRO訓練,有素的人才!";

// 字串轉小寫
echo strtolower($str);

// 字串轉大寫
echo strtoupper($str);

// 從左邊開始找PRO字串片段
echo strpos($str,'PRO');

// 從右邊開始找PRO字串片段
echo strrpos($str,'PRO');

// 取長度為5的子字串
echo substr($str, 5);

// 字串取代
echo str_replace("PRO", "專業", $str);

// 字串分割為陣列
$ss = explode(',',$str);

?>

2015年4月30日 星期四

實用Swift Mailer類庫用來發送php電子郵件

        Swift Mailer是一款功能特別強大的PHP物件導向的發送電子郵件的類別函式庫。它可以讓你透過內建的mail()函數、SMTP、postfix、甚至是你自己客製化的通訊協定來達到寄送email的目的。還可以有效的阻擋email的表頭遭到注入式攻擊,真的確是一個簡單容易使用的PHP郵件發送類庫。下載連結:http://swiftmailer.org/download

一個簡單發送SMTP Gmail電子郵件的範例

<?php
require_once 'swiftmailer-5.x/lib/swift_required.php';
 
// 採用預設的mail()數函發email
// $transport = Swift_MailTransport::newInstance();

// 使用SMTP的方式來發送gmail
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('Your username')
  ->setPassword('Your password')
  ;
 
// 填寫email的主旨、內容、寄件者、收件者 
$message = Swift_Message::newInstance();  

$message->setTo(array(
  "jason@gmail.com" => "Jason.Terry"
  //,"abc@yahoo.com" => "Mike.Porter"
));
$message->setSubject("Swift Mail測試中...");
$message->setBody("恭喜您! Swift測試郵件發送成功。");
$message->setFrom("swiftmailer@gamil.com", "Swift-mailer");
 
// Send the email
$mailer = Swift_Mailer::newInstance($transport);
$mailer->send($message);

echo 'Send Swift mail successfully!!';




2015年4月29日 星期三

常用的三種PHP加解密方法

        談起PHP的資料加密、解密方式,一般我們會聯想到的一定是私密的資料或是重要的數據,才需要經過加密的演算,產生一串人肉眼無法辯識的字串編碼,透過網路傳遞到接收端,再經過解密的演算,還原回原始的內容。就目前而言mcrypt_encrypt, md5與base64是PHP常常使用到的加解密方法,下面我們會個別介紹:

1. MD5
它是一種以128bit的固定長度表示字串的密碼雜湊函數。

<?php
    // 加密
    echo md5("測試字元!");
?>

2. Base64
Base64是一種採用英文字母大小寫、阿拉伯數字、加號「+」或斜槓「/」,所組合而成的字串編碼方式,習慣應用於MIME格式的email、儲存於XML的複雜資料。

<?php
    // base64加密
    echo base64_encode("測試字元!");

    // base64解密
    echo base64_decode("測試字元!");
?>

3. mcrypt_encrypt
一個簡單PHP內建加密、解密的函數。

<?php
    
    // 設定金鑰, 負責對資料進行加解密 
    $key = "ac181c517bdf24ce053556bb280a2dcb";

    /**
     * 加密函數
     */
 function encrypt($str)
 {
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  
  return base64_encode(trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, self::$key, $str, MCRYPT_MODE_ECB, $iv)));  
 }

      /**
     * 解密函數
     */
 function decrypt($str)
 {
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::$key, base64_decode($str), MCRYPT_MODE_ECB, $iv));  
 } 
?>




2014年8月26日 星期二

PHP下載檔案實作

概要


如何讓我們能夠以PHP從伺服器下載檔案到用戶端(Client side)的電腦呢?那第一個要映入你的眼簾的必定是HTTP(Hypertext Transfer Protocol)通訊協定的表頭(header),因為PHP就是透過HTTP協定來與用戶端進行資料交換,在下面我們提供兩個下載檔案的作法給各位參考。

建立檔案下載頁面


撰寫一支index_df.html的檔案下載網頁,在這個頁面中需要有兩個下載檔案的超連結,分別指向方法一和方法二的下載檔案的程式代碼。

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>檔案下載頁面</title>
</head>
<body>
<p><strong>方法一:簡單組合字串變數</strong></p>

<p><a href="download_sf1.php" target="_blank">下載mycontacts.csv檔案</a></p>

<p>&nbsp;</p>

<p><strong>方法二:透過讀取某檔案串流</strong></p>

<p><a href="download_sf2.php" target="_blank">下載mydoc.csv檔案</a></p>
</body>
</html>


下載檔案程式邏輯


方法一:簡單組合字串變數 (download_sf1.php)

<?php
  // 把目前的字串串流輸出到檔案
  header('Content-Description: File Transfer');
  header("Content-type: text/csv; charset=big5");  
  header("Content-disposition: attachment; filename=mycontacts.csv");
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');   

  // 這裏要注意是\r\n是Windows的換行符號,\n為Unix的換行符號
  $content = "姓名,電話,住址,備註"."\r\n";
  $content .= "N111,tel008,台北,nothing"."\r\n";
  $content .= "N222,tel009,高雄,N/A"."\r\n";

  // 將字串編碼由utf-8轉為big5(非必要)
  $content = iconv("utf-8","big5",$content);
  echo $content;   
?>


方法二:透過讀取某檔案串流 (download_sf2.php)

<?php
  // 把伺服器的檔案串流輸出為指定檔案
  header('Content-Description: File Transfer');
  header("Content-type: text/csv; charset=big5");
  //header('Content-Type: application/octet-stream');
  header("Content-disposition: attachment; filename=mydoc.csv");
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');   
  
  $filename = "D:\\test_doc.csv";
    
  if (file_exists($filename)) 
  {
   // 讀取某一檔案且輸出檔案串流
   readfile($filename);    
  }  
?>


(下載test_doc.csv檔案連結)

結論


總而言之,各位在進行網頁程式設計時,基礎的HTTP通訊協定的知識必不可少,不僅可以增進自己對用戶端(Client)與伺服器(Server)之間的互動關係之了解,還可以提升程式開發的效率。

PHP上傳檔案範例

前言


一般我們要透過PHP實現上傳檔案的任務,通常需要利用HTML的form元素裏面的enctype屬性設置為multipart/form-data,讓該表單可以傳遞檔案資料型態。後端在以一支PHP程式負責處理表單傳來的檔案數据的更改名檔、放置路徑等等的邏輯處理作業。

選取要上傳的檔案


首先,建立一支index_uf.html程式,讓它包含一個可以上傳檔案的表單(form),於表單內增加input元素type屬性設為file,這樣一來用戶就能從用戶端選取想要上傳的檔案,最後再加入input元素type屬性為submit,讓用戶擁有提交檔案到伺服器的能力。 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>選取欲上傳的檔案...</title>
</head>
<body>
<form action="upload_file.php" enctype="multipart/form-data" method="post">
<label for="file">檔名:</label>
<input id="file" name="file" type="file" />
<input name="submit" type="submit" value="提交" />
</form>
</body>
</html>


上傳程式邏輯


寫一支upload_file.php程式,開頭先設置utf-8編碼,再來判斷由用戶端傳來的submit按鈕的狀態是否為true,若為true時,於伺服器建立upload目錄、且把暫存檔名更改為用戶指定的檔案名稱(move_uploaded_file函數);反之將連結重新導回選取要上傳檔案畫面。

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");

if(isset($_POST["submit"])){
$sitepath = realpath($_SERVER["DOCUMENT_ROOT"]);
$up_dir = $sitepath . DIRECTORY_SEPARATOR . "upload". DIRECTORY_SEPARATOR;
if(!file_exists($up_dir)){
mkdir($up_dir);
}
$up_file = $up_dir . $_FILES["file"]["name"];
if (file_exists($up_file)) {
echo $_FILES["file"]["name"] . " 已經存在了!";
} else {
move_uploaded_file($_FILES["file"]["tmp_name"], $up_file);
echo "上傳檔案 " . $_FILES["file"]["name"] . "成功!!<br/>";
echo "儲存在: " . $up_file;
}
} else {
header("Location: index_uf.html");
}

?>


總結


上述只是一個簡單的HTML from的檔案上傳的教學文章,除了採用此種上傳檔案方法,你也可以使用jQuery upload或Flash的方式,來完成上傳檔案到伺服器的作業。