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

2023年11月15日 星期三

(Centos-7) CentOS7上安裝 PHP 7.4

前言:
幹! 顛覆了我對 xampp的使用經驗.. (以前一直是在 Windows上用的);
現在用了 Centos7 下裝的 xampp, 一切似乎變得很卡! 不僅目錄位置移開了傳統 linux之 /var/www/html 外, 今天讓我最訝異的是: (前幾天在 Centos7上試跑簡單的 php程式, 老說我沒有權限!?... 你他媽的. 都已是 root了. 還要誰才能有權限ㄚ?!... 換軟體就是幹!!~ )
裝了 xampp. 還需要令外裝 php嗎?...
(依下文安裝教學後. 已可試跑 php程式了! 但裝了 xampp. 又裝了 php, 待後續試用觀查會不會有問題...)
 
(Centos-7) CentOS7上安裝 PHP 7.4

2023年10月17日 星期二

(PHP) 某台主機上不太能跑網頁裡的 PHP ???

透過設定 Apache 的 httpd.conf, 可以讓 Apache 將 .html 格式檔案視爲 PHP 原始碼程式碼,也就是將 .html 檔案當作 .php 檔案處理

=> 將 httpd.conf 組態檔中的"AddType application/x-httpd-php"項修改爲:
AddType application/x-httpd-php .php .html
如果沒有該項設定. 可自行在檔尾加上;

修改完成後需要重新啓動 Apache 設定纔會生效; 則本機上. 嵌入到 HTML 中的 PHP 程式碼就可以執行了。

2023年10月11日 星期三

(PHP_範例) 歌曲資料庫

https://www.mysql.tw/2021/12/mysql-php-example.html

歌曲資料庫的新增/修改/刪除/顯示。

首先我們先把登入登出的功能做出來。

預計要有幾個檔案 : 

login.php 用來顯示登入表單,以及進行登入驗證。
logout.php 用來登出,清除已登入的狀態。
check.inc.php 用來檢查是否為登入狀態。
process.php 當完成登入後的處理作業。

2021年12月22日 星期三

(PHP 與 MySQL 的互動) 2_新增資料

新增資料 (文末有完整版程式碼)

add.php:

  • insert into users(username) values("apple") 這就是一個 SQL query
  • 要放入的 values 會是一個字串,所以要用單引號或是雙引號包起來
<?php    require_once('conn.php');    $result = $conn->query('insert into users(username) values("apple")');    if (!$result) {      die($conn->error);    }      print_r($result);    ?>  

print_r($result); 的 output 會是 1,
1 就代表 true (有成功)的意思

會發現,當我在 add.php 的頁面第二次重新整理後,回到 phpMyAdmin 看,就會出現第二個 apple

優化上方的程式碼

add.php:

  • 把要放入的 values 用變數 $username 取代

在 debug 時,可以先把 $sql 印出來,看是不是正確的 SQL query

把 SQL query 獨立出來變成一個變數 $sql,這樣程式碼的可讀性比較高。在 debug 時,也可以先把 $sql 印出來 echo $sql;,看是不是正確的 SQL query

debug 完之後,記得要把 echo $sql; 拿掉

sprintf() 函式來寫 SQL query,提高程式碼可讀性

在 PHP 有一個叫做 sprintf() 的函式,建議是把 SQL query 用 sprintf() 來寫,讓整個 SQL query 字串更好寫也更好看懂:

  • 第一個參數是字串,把「動態要塞值進去的地方」變成 %d"%s",類似於 placeholder 的感覺
    • %d 代表:我要放入的是一個 number (這裡的 d 是 decimal 十進位的意思)
    • "%s" 代表:我要放入的是一個 string
  • 從第二個參數開始依序放「我要塞進去的值」

會按照順序,把 15 帶到 %d 的位置,把 $username 帶到 "%s" 的位置

<?php    require_once('conn.php');    $username = 'apple';    $sql = sprintf(      'insert into users(id, username) values(%d, "%s")',      15,      $username    );    echo $sql;    exit();    $result = $conn->query($sql);    if (!$result) {      die($conn->error);    }      print_r($result);    ?>  

組出來的 SQL query 會長這樣:

動態新增 username 到資料庫的表單

index.php:

<?php    require_once('conn.php');    $result = $conn->query('select * from users;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      echo 'id: '. $row['id'] . '<br>';      echo 'username: ' . $row['username'] . '<br>';    }  ?>    <h2>新增 user</h2>  <form method="POST" action="add.php">    username: <input name="username">    <input type="submit">  </form>  

加上「自動跳轉的 response Header」

header('Location: index.php'); 意思就是:我要回傳一個 response Header 叫做 Location: index.php。瀏覽器接收到這個 response Header 後,就知道我的目的是要跳轉到 index.php,因此就會自動幫我跳轉回到 index.php 這個檔案去 (因為跳轉的太快了,甚至不會看到中間的 add.php 的畫面,就直接跳轉到 index.php 去了)

add.php:

<?php    require_once('conn.php');      if (empty($_POST['username'])) {      die('請輸入 username');    }    $username = $_POST['username'];    $sql = sprintf(      'insert into users(username) values("%s")',      $username    );    echo 'sql: ' . $sql. '<br>';    $result = $conn->query($sql);    if (!$result) {      die($conn->error);    }      // 如果有新增成功    echo '新增成功!';    header('Location: index.php');  ?>  

錯誤處理

上面 add.php 的程式碼,做錯誤處理的地方有兩個:

  1. 檢查 $_POST['username'] 是否為空值
  2. 檢查 SQL query 是否有執行成功,也就是 $conn->query($sql); 這段

如果 SQL query 沒有執行成功,也就是 $result 是 false,那就會執行 die($conn->error);


現在,我把 username 欄位設為 unique (代表:不能有重複的 username)
然後我到 index.php 輸入一個重複的 username 叫做 aaa,按下 submit 後就會出現一行錯誤訊息「Duplicate entry 'aaa' for key 'username'」,就是因為在執行到 $conn->query($sql); 時發生錯誤($result 會是 false),因此這行錯誤訊息就是從 die($conn->error); 這行印出來的

排序「資料庫的讀取結果」

「資料庫的讀取結果」的排序不一定會按照 id 順序,如果想要按照 id 排序的話,就在 index.php 的 SQL query 加上 order by id asc 或是 order by id desc

  • asc 是「由小到大」排列
    ascending 就是 increasing 的意思
<?php    require_once('conn.php');    $result = $conn->query('select * from users order by id asc;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      echo 'id: '. $row['id'] . '<br>';      echo 'username: ' . $row['username'] . '<br>';    }  ?>    <h2>新增 user</h2>  <form method="POST" action="add.php">    username: <input name="username">    <input type="submit">  </form>  
  • desc 是「由大到小」排列
    descending 就是下降的意思
<?php    require_once('conn.php');    $result = $conn->query('select * from users order by id desc;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      echo 'id: '. $row['id'] . '<br>';      echo 'username: ' . $row['username'] . '<br>';    }  ?>    <h2>新增 user</h2>  <form method="POST" action="add.php">    username: <input name="username">    <input type="submit">  </form>  

新增資料的程式碼,完整版如下:

conn.php:

<?php    $server_name = 'localhost';    $username = 'saffran';    $password = 'rox';    $db_name = 'saffran_db';      $conn = new mysqli($server_name, $username, $password, $db_name);      if ($conn->connect_error) {      die('資料庫連線錯誤:' . $conn->connect_error);    }      $conn->query('SET NAMES UTF8');    $conn->query('SET time_zone = "+8:00"');  ?>  

index.php:

<?php    require_once('conn.php');    $result = $conn->query('select * from users order by id desc;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      echo 'id: '. $row['id'] . '<br>';      echo 'username: ' . $row['username'] . '<br>';    }  ?>    <h2>新增 user</h2>  <form method="POST" action="add.php">    username: <input name="username">    <input type="submit">  </form>  

add.php:

<?php    require_once('conn.php');      if (empty($_POST['username'])) {      die('請輸入 username');    }    $username = $_POST['username'];    $sql = sprintf(      'insert into users(username) values("%s")',      $username    );    $result = $conn->query($sql);    if (!$result) {      die($conn->error);    }      // 如果有新增成功    header('Location: index.php');  ?>  

2021年12月14日 星期二

(PHP) 以程式碼 [插入資料] 卻變成亂碼

糊里糊塗地參考網路資料處理後. 反正問題就是解決了!!~
 
編輯 mysql 的 my.in 檔案裡:
1)
(如果沒有該行設定. 就自己加上去)
 
2) 找到這 utf8 區的預設內容:
(把這些設定句前面的 # 都取消掉)
 
3) 關閉 mysql. 重啟 -> ok

2021年11月30日 星期二

(PHP 與 MySQL 的互動) 1_在 PHP 裡面 select MySQL 的資料

(源自: Saffran's blog )

後端最基本的這四個功能,就是 CRUD
Create 新增
Read 讀取
Update 編輯
Delete 刪除

讀取資料(PHP 與 MySQL 的互動)

在 PHP 裡面 select MySQL 的資料

從資料庫取得現在的時間

透過 PHP 從 MySQL 資料庫拿資料的步驟如下:

  1. 先下 query()
    $conn->query('select now();'); 就是在「向資料庫拿資料」
  2. 檢查 $result 是否有拿到結果
    如果沒有拿到任何結果($result 是空的)就代表 query() 發生錯誤。這時,就把錯誤印出來,程式碼不再繼續往下執行
  3. 如果 $result 有拿到結果,就用 $row = $result->fetch_assoc();
    fetch_assoc() 是在把相對應的結果取出來放到 $row 裡面。$row 就是 MySQL query 之後的結果,會根據我 select 的東西給我一個 array,陣列的 key 就是「我 select 的東西 now()」,value 就是「now() 所對應到的值」

now() 是 MySQL 提供的一個 function,可以取得現在的時間

data.php:

<?php    require_once('conn.php');    $result = $conn->query('select now() as n;');    if (!$result) {      die($conn->error);    }      $row = $result->fetch_assoc();    print_r($row);    echo '<br> now: ' . $row['n'];  ?>  

output:

取得 table 的第一筆資料

現在,在 MySQL 資料庫裡有這三筆資料:

<?php    require_once('conn.php');    $result = $conn->query('select * from users;');    if (!$result) {      die($conn->error);    }      $row = $result->fetch_assoc();    print_r($row);  ?>  

output:
可以看到,每執行一次 $row = $result->fetch_assoc(); 只會印出一筆資料而已

因此,如果想要取得每一筆資料,就需要跑 while 迴圈

while 迴圈取得 table 中的每一筆資料

在跑每圈 while 迴圈時,實際上是分成兩個步驟

  1. 步驟一:每圈都會先執行一次 $result->fetch_assoc(),並把結果放到 $row
  2. 步驟二:while 實際上會判斷的是 $row,判斷 $row 是否為空(當資料都拿完後,$row 就會是空的),$row 是空的就是 false
<?php    require_once('conn.php');    $result = $conn->query('select * from users;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      print_r($row);    }  ?>  

output:
可以看到,這樣就可以拿到 table 中的每一筆資料了

把資料用自訂的樣子顯示出來:

<?php    require_once('conn.php');    $result = $conn->query('select * from users;');    if (!$result) {      die($conn->error);    }      while ($row = $result->fetch_assoc()) {      echo 'id: '. $row['id'] . '<br>';      echo 'username: ' . $row['username'] . '<br>';    }  ?>  

output:

2021年11月23日 星期二

(學習蒐文) php怎麼在指定位置輸出

Q:  php怎麼在指定位置輸出
比如說在網頁中坐標為(100,100)的地方輸出hello world!
 
A: 這其實是css幹的事
<?php
echo '<div style="position:absolute;top:100px;left:100px">Hello World!</div>';
?>

2021年11月21日 星期日

(學習蒐文) PHP/HTML混寫的四種方式

1、單/雙引號包圍法
這是最初級的方法了,用法就像下面這樣

代碼:
<?php
echo '
<!DOCTYPE html>
<html>
<head>
<title> </title>
</head>
<body>
<span>測試頁面</span>
</body>
</html>
';
?>

這樣是最簡單的一種方法了,直接用單引號包裝上就行了

至於雙引號和單引號的區別,就在於前者解析引號內的變數,而後者不解析引號內的變數,參看下面的例子

代碼:
<?php
$Content='Hello!';
echo "$Content";
echo '<br>';
echo '$Content';
?>


輸出
代碼:
1 Hello!
2 $Content

由此可見,用雙引號包圍的字串中的變數名自動解析為了變數值,而用單引號包圍則依然顯示變數名

這樣書寫的缺點有兩點
1、如果輸出內容中包含單/雙引號將極難處理,因為PHP無法判斷這個引號是屬於程式的還是輸出內容的,所以會報錯
2、這樣書寫一些現代文字編輯器(如SublimeText)將無法對引號包圍的輸出的內容進行語法著色,如果出現一些格式問題將極難發現。圖中為SublimeText3的一張截圖,上面的是正常的著色,下面則是用引號包圍的著色

2、使用HEREDOC/NOWDOC
HEREDOC和NOWDOC是PHP5.3開始支援的一種新特性,它允許在程式中使用一種自定義的標誌符來包圍文字,而HEREDOC和NOWDOC的關係就類似於雙引號包圍和單引號包圍一樣,前者解析區塊內的變數,而後者不解析區塊內的變數
下面介紹HEREDOC和NOWDOC的用法

代碼:
<?php
$Content='Hello!';
//下面寫出了一個HEREDOC,其中標識LABEL可以自定義為任何字串,但要保證�}頭的標識和結尾的標識一樣
echo <<<LABEL
$Content
LABEL;
//結尾的方法:另起一行,打上LABEL。注意結尾的標識前面和後面不要插入任何字元,空格�]不行
echo '<br>';//為了演示方便換行
//NOWDOC和HEREDOC的書寫方式差別在於NOWDOC的識別符號需要用單引號�]圍
echo <<<'LABEL'
$Content
LABEL;
//其他無異
?>

也可以參考PHP.net上的關於這兩個的wiki:https://wiki.php.net/rfc/heredoc-with-double-quotes

用HEREDOC/NOWDOC書寫極好的解決了包圍引號的問題,但依然沒有解決語法著色失效的問題

3、HTML中嵌入PHP程式塊(推薦)
這是一種非常合適的辦法,並且這種方法廣泛用在了諸如WordPress模板等場合中。書寫起來也較為方便,直接在需要輸出的地方寫上相關的程式碼就行了,就像下面這樣

代碼:
<?php
//首先在這裡寫好相關的呼叫�{式碼
function OutputTitle(){
echo 'TestPage';
}
function OutputContent(){
echo 'Hello!';
}
//然後再下面呼叫相關函式就可以了
?>
<!DOCTYPE html>
<html>
<head>
<title><?php OutputTitle(); ?></title>
</head>
<body>
<span><?php OutputContent(); ?></span>
</body>
</html>

我認為這種方法是在這三種方法中最好的,但是這樣做的缺點是如果這樣的程式碼塊一多了就會嚴重影響程式閱讀。

4、使用前端模板引擎
由於前端的重要性在整個Web開發中日益上升,現在前/後端工程師逐漸在分離成兩個職業,所以說為了確保前/後端工程師能夠相互配合,使前端開發和後端開發出來的東西對接更完美,逐漸催生出了一系列前端模板引擎,比如Smarty。使用Smarty書寫的實現程式碼可讀性非常的高,這使前/後端的分離也更加的高效和便捷。有興趣的同學可以去搜尋瞭解

(學習蒐文) 將PHP程式與HTML分開編寫!!

透過下面寫法可以直接用將PHP程式與HTML分開編寫!!


閱覽選擇後的資料內容
<?php
// 連結資料庫
include("adodb/adodb.inc.php");
$dbhost = "localhost"; //資料庫網址或IP
$dbusername = "root"; //資料庫帳號
$dbuserpassword = "test"; //資料庫密碼
$default_dbname = "board";//資料庫名稱
$conn = &ADONewConnection("mysql");
$link = $conn -> Connect($dbhost,$dbusername,$dbuserpassword,$default_dbname);

$sql = "select * from board";
$rs = $conn -> Execute($sql); //取出資料
while(!$rs->EOF){
  $tpl -> assign (number, $rs -> fields['MID']);//序號
  $tpl -> parse (FPING, ".fping");//動態資料送入
  $rs -> MoveNext();
}
// 將資料全部送到樣本上
$tpl -> assign (link_url, $down_page_url);//超連結
$tpl -> parse (MAIN, "main");
$tpl -> FastPrint();
?>
 

2021年10月31日 星期日

(PHP) isset() 函數

isset() 函數用於檢測變量是否已設置. 並且非 NULL
 
如果已經使用 unset() 釋放了一個變量之後,再通過 isset() 判斷將返回 FALSE
若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE
 
要注意的是 null 字符("\0")並不等同於 PHP 的 NULL 常量
 
 
PHP 版本要求: PHP 4, PHP 5, PHP 7
語法
bool isset ( mixed $var [, mixed $... ] )
 
參數說明:
    $var:要檢測的變量。
如果一次傳入多個參數,那麼 isset() 只有在全部參數都被設置時返回 TRUE,計算過程從左至右,中途遇到沒有設置的變量時就會立即停止

返回值
如果指定變量存在且不為 NULL,則返回 TRUE,否則返回 FALSE。

實例
<?php
$var = '';
 
// 結果為 TRUE,所以後邊的文本將被打印出來。
if (isset($var)) {
    echo "變量已設置。" . PHP_EOL;
}
 
// 在後邊的例子中,我們將使用 var_dump 輸出 isset() 的返回值。
// the return value of isset().
 
$a = "test";
$b = "anothertest";
 
var_dump(isset($a));      // TRUE
var_dump(isset($a, $b)); // TRUE
 
unset ($a);
 
var_dump(isset($a));     // FALSE
var_dump(isset($a, $b)); // FALSE
 
$foo = NULL;
var_dump(isset($foo));   // FALSE
?>
 
輸出結果為:
 
變量已設置。
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
 
這對於數組中的元素也同樣有效:
實例
<?php
$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple'));
 
var_dump(isset($a['test']));            // TRUE
var_dump(isset($a['foo']));             // FALSE
var_dump(isset($a['hello']));           // FALSE
 
// 鍵 'hello' 的值等於 NULL,所以被認為是未設置的
// 如果想檢測 NULL 鍵值,可以試試下邊的方法。
var_dump(array_key_exists('hello', $a)); // TRUE
 
// 更深層次檢測
var_dump(isset($a['pie']['a']));        // TRUE
var_dump(isset($a['pie']['b']));        // FALSE
var_dump(isset($a['cake']['a']['b']));  // FALSE
?>
 
輸出結果為:
 
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
bool(false)
 
在字符串位移中使用 isset()
 
PHP 5.4 改變了傳入字符串位移時 isset() 的行為。
實例
<?php
$expected_array_got_string = 'somestring';
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));
?>
 
以上實例在 PHP 5.3 中的輸出:
 
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
 
以上實例在 PHP 5.4 中的輸出:
 
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

2021年9月27日 星期一

(PHP-參) php.ini 翻譯與設定

php.ini 的設定
 
每次剛灌完xampp通常會這麼習慣設定:
 
    修改 httpd.conf
    DocumentRoot "C:/xampp/htdocs" 改為    DocumentRoot "C:/xampp/htdocs/www"
    習慣用www包起來所寫的專案

    若有固定IP要開放伺服器外連
    修改httpd-xampp.conf 
    <LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
    #Order deny,allow
    Allow from all
    #Deny from all
    #Allow from ::1 127.0.0.0/8
    #fc00::/7 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
    #fe80::/10 169.254.0.0/16#ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
    </LocationMatch>

    允許所有人使用
    修改php.ini (PHP 7 適用)
    short_open_tag = On
    open_basedir = 請指定
    max_execution_time = 60; 每個腳本的最大執行時間, 按秒計.
    max_input_time = 60 ; 每個腳本的最大讀取資料時間, 按秒計.
    memory_limit = 800M; 一個腳本可使用記憶體的最大值
    display_errors = On 遇到 PHP 語法解析錯誤,會顯示錯誤訊息。建議正式環境改為 Off
    post_max_size = 200M
    default_charset = "UTF-8"
    max_input_vars = 100000 指定每次傳送最大的表單數量,如多少比筆<input type="text"> 或註解掉
    upload_max_filesize = 200M 允許上傳檔案的最大值.
    date.timezone = Asia/Taipei

2021年9月7日 星期二

(PHP) Filesystem 函數總表

PHP 5 Filesystem 函數總表 (取自中國 菜鳥教程)
 
函數 描述
basename() 返迴路徑中的文件名部分。
chgrp() 改變文件組。
chmod() 改變文件模式。
chown() 改變文件所有者。
clearstatcache() 清除文件狀態緩存。
copy() 複製文件。
delete() 參見 unlink() 或 unset()
dirname() 返迴路徑中的目錄名稱部分。
disk_free_space() 返回目錄的可用空間。
disk_total_space() 返回一個目錄的磁盤總容量。
diskfreespace() disk_free_space() 的別名。
fclose() 關閉打開的文件。
feof() 測試文件指針是否到了文件末尾。
fflush() 向打開的文件刷新緩衝輸出。
fgetc() 從打開的文件中返回字符。
fgetcsv() 從打開的文件中解析一行,校驗 CSV 字段。
fgets() 從打開的文件中返回一行。
fgetss() 從打開的文件中返回一行,並過濾掉 HTML 和 PHP 標籤。
file() 把文件讀入一個數組中。
file_exists() 檢查文件或目錄是否存在。
file_get_contents() 把文件讀入字符串。
file_put_contents() 把字符串寫入文件。
fileatime() 返回文件的上次訪問時間。
filectime() 返回文件的上次修改時間。
filegroup() 返回文件的組 ID。
fileinode() 返回文件的 inode 編號。
filemtime() 返回文件內容的上次修改時間。
fileowner() 返回文件的用戶 ID (所有者)。
fileperms() 返回文件的權限。
filesize() 返回文件大小。
filetype() 返回文件類型。
flock() 鎖定或釋放文件。
fnmatch() 根據指定的模式來匹配文件名或字符串。
fopen() 打開一個文件或 URL。
fpassthru() 從打開的文件中讀數據,直到文件末尾(EOF),並向輸出緩衝寫結果。
fputcsv() 把行格式化為 CSV 並寫入一個打開的文件中。
fputs() fwrite() 的別名。
fread() 讀取打開的文件。
fscanf() 根據指定的格式對輸入進行解析。
fseek() 在打開的文件中定位。
fstat() 返回關於一個打開的文件的信息。
ftell() 返回在打開文件中的當前位置。
ftruncate() 把打開文件截斷到指定的長度。
fwrite() 寫入打開的文件。
glob() 返回一個包含匹配指定模式的文件名/目錄的數組。
is_dir() 判斷文件是否是一個目錄。
is_executable() 判斷文件是否可執行。
is_file() 判斷文件是否是常規的文件。
is_link() 判斷文件是否是連接。
is_readable() 判斷文件是否可讀。
is_uploaded_file() 判斷文件是否是通過 HTTP POST 上傳的。
is_writable() 判斷文件是否可寫。
is_writeable() is_writable() 的別名。
lchgrp() 改變符號連接的組所有權。
lchown() 改變符號連接的用戶所有權。
link() 創建一個硬連接。
linkinfo() 返回有關一個硬連接的信息。
lstat() 返回關於文件或符號連接的信息。
mkdir() 創建目錄。
move_uploaded_file() 把上傳的文件移動到新位置。
parse_ini_file() 解析一個配置文件。
parse_ini_string() 解析一個配置字符串。
pathinfo() 返回關於文件路徑的信息。
pclose() 關閉由 popen() 打開的進程。
popen() 打開一個進程。
readfile() 讀取一個文件,並寫入到輸出緩衝。
readlink() 返回符號連接的目標。
realpath() 返回絕對路徑名。
realpath_cache_get() 返回高速緩存條目。
realpath_cache_size() 返回高速緩存大小。
rename() 重命名文件或目錄。
rewind() 倒回文件指針的位置。
rmdir() 刪除空的目錄。
set_file_buffer() 設置已打開文件的緩衝大小。
stat() 返回關於文件的信息。
symlink() 創建符號連接。
tempnam() 創建唯一的臨時文件。
tmpfile() 創建唯一的臨時文件。
touch() 設置文件的訪問和修改時間。
umask() 改變文件的文件權限。
unlink() 刪除文件。 
 

2021年8月25日 星期三

(PHP) preg_replace_callback() 函數

preg_replace_callback 函數: 執行一個正則表達式. 搜索. 並且使用一個回調進行替換。

語法
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
 
這個函數的行為除了可以指定一個 callback. 替代 replacement 進行替換字符串的計算,其他方面相同於 preg_replace()
 
參數說明
    $pattern: 要搜索的模式,可以是字符串. 或一個字符串數組。
    $callback: 一個回調函數; 調用時函數得到的參數是從 subject中匹配到的結果。
    $subject: 要搜索替換的目標字符串或字符串數組。
    $limit: 可選,對於每個模式用於每個 subject 字符串的最大可替換次數。默認是-1(無限制)。
    $count: 可選,為替換執行的次數。
 
返回值
如果 subject是一個數組, preg_replace_callback()返回一個數組;
其他情況返回字符串。
錯誤發生時返回 NULL。
 
如果找到了匹配,返回替換後的目標字符串(或字符串數組);
其他情況subject 將會無變化返回。

實例

<?php
// 將文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回調函數
function next_year($matches)
{
  // 通常: $matches[0]是完成的匹配
  // $matches[1]是第一個捕獲子組的匹配
  // 以此類推
  return $matches[1].($matches[2]+1);
}
echo preg_replace_callback( "|(\d{2}/\d{2}/)(\d{4})|", "next_year", $text); 
?>
執行結果如下所示:
April fools day is 04/01/2003
Last christmas was 12/24/2002

2021年8月18日 星期三

(PHP語法) $_SERVER 的詳細用法

 
$_SERVER['PHP_SELF'] #當前正在執行腳本的文件名,與 document root相關。
$_SERVER['argv'] #傳遞給該腳本的參數。
$_SERVER['argc'] #包含傳遞給程序的命令行參數的個數(如果運行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #服務器使用的 CGI 規範的版本。例如,「CGI/1.1」。
$_SERVER['SERVER_NAME'] #當前運行腳本所在服務器主機的名稱。
$_SERVER['SERVER_SOFTWARE'] #服務器標識的字串,在響應請求時的頭部中給出。
$_SERVER['SERVER_PROTOCOL'] #請求頁面時通信協議的名稱和版本。例如,「HTTP/1.0」。

2021年7月3日 星期六

06_發送電子郵件(後試)

mail()函數用於在PHP中發送電子郵件。 mail()函數可送短信. HTML消息. 和附件。
PHP mail()函數
 
語法
 
    $to:指定郵件的接收者或接收者。 收信者格式:
        user@example.com
        user@example.com, anotheruser@example.com
        User user@example.com
        User user@example.com, User2 anotheruser@example.com
    $subject: 郵件主題。
    $message: 發送的郵件內容
    $additional_headers(可選):指定附加頭,如From,CC,BCC等。附加頭也用CRLF(\r\n)分隔。
    注意:消息的每一行應使用CRLF(\r\n)分隔,並且行不應大於70個字符。
 
PHP郵件範例
 
文件:mailer.php
 
<?php 
   ini_set("sendmail_from", "rh3@dyhms.no-ip.org"); 
   $to = "joke111.y@gmail.com"; //receiver address 
   $subject = "郵件主旨"; 
   $message = "從 localhost 轉 NAT server 發信"; 
   $header = "發信者: rh3@dyhms.no-ip.org\r\n"; 
 
   $result = mail ($to,$subject,$message,$header); 
 
   if( $result == true ){ 
      echo "Message sent successfully..."; 
   }else{ 
      echo "Sorry, unable to send mail..."; 
   } 
?>
 
如果在運行服務器上運行此代碼,它將向指定的接收方發送電子郵件。
PHP郵件:發送HTML消息
 
要發送HTML消息. 則需在消息標題中提及Content-type text/html。
 
<?php 
   $to = "joke111.y@gmail.com";//change receiver address 
   $subject = "This is subject"; 
   $message = "<h1>This is HTML heading</h1>"; 
 
   $header = "From: rh3@dyhms.no-ip.org\r\n"; 
   $header .= "MIME-Version: 1.0 \r\n"; 
   $header .= "Content-type: text/html;charset=UTF-8 \r\n"; 
 
   $result = mail ($to,$subject,$message,$header); 
 
   if( $result == true ){ 
      echo "Message sent successfully..."; 
   }else{ 
      echo "Sorry, unable to send mail..."; 
   } 
?>
 
PHP郵件:使用附件發送郵件
 
要發送附件, 則需提及許多標題信息,參示例:
 
<?php 
  $to = "joke111.y@gmail.com"; 
  $subject = "This is subject"; 
  $message = "This is a text message."; 
  # Open a file 
  $file = fopen("/tmp/test.txt", "r" );//change your file location 
  if( $file == false ) 
  { 
     echo "Error in opening file"; 
     exit(); 
  } 
  # Read the file into a variable 
  $size = filesize("/tmp/test.txt"); 
  $content = fread( $file, $size); 
 
  # encode the data for safe transit 
  # and insert \r\n after every 76 chars. 
  $encoded_content = chunk_split( base64_encode($content)); 
 
  # Get a random 32 bit number using time() as seed. 
  $num = md5( time() ); 
 
  # Define the main headers. 
  $header = "From:xyz@example.com\r\n"; 
  $header .= "Content-Type: multipart/mixed; "; 
  $header .= "boundary=$num\r\n"; 
  $header .= "--$num\r\n"; 
 
  # Define the message section 
  $header .= "Content-Type: text/plain\r\n"; 
  $header .= "Content-Transfer-Encoding:8bit\r\n\n"; 
  $header .= "$message\r\n"; 
  $header .= "--$num\r\n"; 
 
  # Define the attachment section 
  $header .= "Content-Type:  multipart/mixed; "; 
  $header .= "name=\"test.txt\"\r\n"; 
  $header .= "Content-Transfer-Encoding:base64\r\n"; 
  $header .= "Content-Disposition:attachment; "; 
  $header .= "filename=\"test.txt\"\r\n\n"; 
  $header .= "$encoded_content\r\n"; 
  $header .= "--$num--"; 
 
  # Send email now 
  $result = mail ( $to, $subject, "", $header ); 
  if( $result == true ){ 
      echo "Message sent successfully..."; 
   }else{ 
      echo "Sorry, unable to send mail..."; 
   } 
?>

(Centos-7s) 更新: 網卡名稱改回 eth0 的方法

將 CentOS 7 網卡名稱修改, 用回 Eth0 的方法:   1) # vi /etc/sysconfig/grub 內容大概是這樣:   GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release...