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

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

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

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的方式,來完成上傳檔案到伺服器的作業。

PHP&MySQL物件導向應用

簡介


PHP的物件導向技術是從PHP3以後開始支援,到了PHP5得到了大力的發展,而且整個模組化的物件結構逐漸完善。記得在PHP存取MySQL資料庫文章中已向大家介紹過非物件導向的DB操作方式。在本篇文章中將採用mysqli類別來示範如何以物件的方式進行MySQL資料庫的存取服務。它屬於PDO(PHP Data Objects)存取資料庫的延伸函式庫的一部份。

以物件向導向存取MySQL


1.設定連結DB的共用常數

<?php
define("host","localhost", false);
define("username","root", false);
define("password","mysql", false);
define("dbname","test", false);
?>


2.查詢作業(query_ext.php)

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常變數
require_once '../db_configs.php';

$mysqli = new mysqli(host, username, password, dbname);

// 檢查連線態狀
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

// 設定MySQL為utf8編碼
$mysqli->set_charset("utf8");

// 查詢user_info資料表所有記錄
$sql = "SELECT * FROM user_info";
$result = $mysqli->query($sql);

echo "<h2>查詢範例(object)</h2>";
echo "========================";
echo "<table border='1'>
<tr>
<th>Username</th>
<th>Password</th>
</tr>";

while($row = $result->fetch_array()) {
echo "<tr>";
echo "<td>" . $row['username'] . "</td>";
echo "<td>" . $row['password'] . "</td>";
echo "</tr>";
}

echo "</table>";

// 關閉MySQL資料庫連線
$mysqli->close();
?>


3.新增作業(add_ext.php)

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once '../db_configs.php';

$mysqli = new mysqli(host, username, password, dbname);

// 檢查連線態狀
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

// 設定MySQL為utf8編碼
$mysqli->set_charset("utf8");

// 新增一筆記錄到user_info資料表
$sql = "INSERT INTO user_info (username, password, birth_date, sex, age) VALUES ('Eric','eric12345','1995-02-24',1,19)";
$mysqli->query($sql);

echo "<h2>新增範例(object)</h2>";
echo "========================<br/>";
echo '新增一筆記錄成功!!';

// 關閉MySQL資料庫連線
$mysqli->close();
?>


4.更新作業(update_ext.php)

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once '../db_configs.php';

$mysqli = new mysqli(host, username, password, dbname);

// 檢查連線態狀
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

// 設定MySQL為utf8編碼
$mysqli->set_charset("utf8");

// 更新某一筆記錄到user_info資料表
$sql = "UPDATE user_info SET password='pt54321' WHERE user_id=1";
$mysqli->query($sql);

echo "<h2>更新範例(object)</h2>";
echo "========================<br/>";
echo '更新user_id=1的記錄成功!!';

// 關閉MySQL資料庫連線
$mysqli->close();
?>


5.刪除作業(delete_ext.php)

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once '../db_configs.php';

$mysqli = new mysqli(host, username, password, dbname);

// 檢查連線態狀
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

// 設定MySQL為utf8編碼
$mysqli->set_charset("utf8");

// 刪除某一筆記錄
$sql = "DELETE FROM user_info WHERE username='Eric'";
$mysqli->query($sql);

echo "<h2>刪除範例(object)</h2>";
echo "========================<br/>";
echo "刪除username='Eric'的記錄成功!!";

// 關閉MySQL資料庫連線
$mysqli->close();
?>


結論


透過PHP以物件的方式來操作MySQL資料庫的數據,的確讓人比較不容易很直觀的理解,不過如果只是單純要使用PHP現有的類別函數庫,仔細了解程式代碼應該還是可以很快上手。在此還是建議各位先去充實PHP物件導向的程式設計知識,以利進階的模組化程式設計觀念的建立。

2014年8月22日 星期五

PHP存取MySQL資料庫

前言


PHP(Hypertext Preprocessor)是一種動態式的互動網頁開發技術,可以籍由向應用伺服器(Application Server)請求資料庫的數据交換服務,達到與客戶端互動的效果。

存取資料庫作業


1.MySQ連線的共用常數

寫一支db_config.php的資料庫連線參數設定檔,記得在建立資料庫連線時將它引入:

<?php
define("host","localhost", false);
define("username","root", false);
define("password","mysql", false);
define("dbname","test", false);
?>


2.查詢資料表

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once 'db_configs.php';

// 建立MySQL資料庫連線
$con=mysqli_connect(host,username,password,dbname) or die("Error " . mysqli_error($con));

// 檢查連線態狀
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// 設定MySQL為utf8編碼
mysqli_query($con,"SET NAMES 'utf8'");

// 查詢user_info資料表所有記錄
$sql = "SELECT * FROM user_info";
$result = mysqli_query($con,$sql) or die("Error in the consult.." . mysqli_error($con));

echo "<h2>查詢範例</h2>";
echo "========================";
echo "<table border='1'>
<tr>
<th>Username</th>
<th>Password</th>
</tr>";

while($row = mysqli_fetch_array($result)) {
echo "<tr>";
echo "<td>" . $row['username'] . "</td>";
echo "<td>" . $row['password'] . "</td>";
echo "</tr>";
}

echo "</table>";

// 關閉MySQL資料庫連線
mysqli_close($con);
?>


3.新增一筆記錄

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once 'db_configs.php';

// 建立MySQL資料庫連線
$con=mysqli_connect(host,username,password,dbname) or die("Error " . mysqli_error($con));

// 檢查連線態狀
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// 設定MySQL為utf8編碼
mysqli_query($con,"SET NAMES 'utf8'");

// 新增一筆記錄到user_info資料表
$sql = "INSERT INTO user_info (username, password, birth_date, sex, age) VALUES ('Eric','eric12345','1995-02-24',1,19)";
mysqli_query($con,$sql) or die("Error in the consult.." . mysqli_error($con));

echo "<h2>新增範例</h2>";
echo "========================<br/>";
echo '新增一筆記錄成功!!';

// 關閉MySQL資料庫連線
mysqli_close($con);
?>


4.更新某一記錄

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once 'db_configs.php';

// 建立MySQL資料庫連線
$con=mysqli_connect(host,username,password,dbname) or die("Error " . mysqli_error($con));

// 檢查連線態狀
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// 設定MySQL為utf8編碼
mysqli_query($con,"SET NAMES 'utf8'");

// 更新某一筆記錄到user_info資料表
$sql = "UPDATE user_info SET password='pt54321' WHERE user_id=1";
mysqli_query($con,$sql) or die("Error in the consult.." . mysqli_error($con));

echo "<h2>更新範例</h2>";
echo "========================<br/>";
echo '更新user_id=1的記錄成功!!';

// 關閉MySQL資料庫連線
mysqli_close($con);
?>


5.刪除一筆記錄

<?php
// 設定文件utf-8編碼
header("Content-Type:text/html; charset=utf-8");
// 加入DB共用常數
require_once 'db_configs.php';

// 建立MySQL資料庫連線
$con=mysqli_connect(host,username,password,dbname) or die("Error " . mysqli_error($con));

// 查連線態狀
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// 設定MySQL為utf8編碼
mysqli_query($con,"SET NAMES 'utf8'");

// 刪除某一筆記錄
$sql = "DELETE FROM user_info WHERE username='Eric'";
mysqli_query($con,$sql) or die("Error in the consult.." . mysqli_error($con));

echo "<h2>刪除範例</h2>";
echo "========================<br/>";
echo "刪除username='Eric'的記錄成功!!";

// 關閉MySQL資料庫連線
mysqli_close($con);
?>


結論


經由上述PHP操作MySQL資料庫的新增/刪除/更改/查詢的示範,讓我們很容易理解程式編碼所要代表的意義,就那麼短短的幾行程式碼就能完成存取資料庫表格的任務。