PHP

whoami

  •   fallnight

  •   資工二甲

  •   113屆  會長

  •   女婕思

outline

  • 什麼是PHP

  • 怎麼撰寫並執行PHP

  • 語法教學 ~

  • 一些酷酷的東西

PHP是什麼?

PHP

  • 世界上最好的語言

  • 用於開發網頁應用程式

    • ​ex. 購物網站、社群媒體

  • 腳本語言

  • 弱型別語言

  • 高容錯率

舉個栗子

網頁架構

HTTP請求方法

GET 取得資料
POST 提交資料
HEAD 要求與 GET 請求完全相同的回應
PUT 取代現有資料
DELETE 刪除資料
CONNECT 與目標資源識別的伺服器建立隧道
OPTIONS 描述目標資源的通信選項
TRACE 在目標資源的路徑上執行消息回送測試
PATCH 修改資料

GET & POST

  • GET 通常用於請求簡單的資訊,例如連結或圖片,以及查詢資源的信息

  • 請求時資料會附在URL上,就像明信片上的地址

  • 缺點:

    • 大家都看得到訊息內容

    • 會受 URL 的最大長度限制

       

GET & POST

  • POST 通常用於傳送登入的帳密、送出HTML表單

  • 資料會寫在封包內部,就像裝進信封袋的信件

  • 可傳遞的資訊較多,安全性也較高

  • 不是絕對安全,可透過封包攔截找到相關資訊

     

看看 PHP 怎麼跟 POST 打配合 

  • 首先需要一個使用 POST 方法傳遞資料的表單

<form action="output.php" method="post">
    <input type="text" name="username">
    <input type="submit" value="傳送!">
</form>

實際在網頁中的效果 →

這就是前端

看看 PHP 怎麼跟 POST 打配合 

  • 然後要寫處裡表單資訊的 PHP

<?php
	//output.php
	$username = $_POST["username"];
    echo "Hello, " . $username;
?>

實際在網頁中的效果 →

按下傳送後

這裡是後端  

如何執行 PHP ?

下載 XAMPP

  • 過程教學

  • 下載完畢後按 Apache 的 Start 按鈕

  • 去瀏覽器打 http://localhost/
    會自動導到 http://localhost/dashboard/
    這個頁面,就代表安裝成功!

試著打開自己寫的PHP

  • 去C槽找到剛剛下載的XAMPP的資料夾

  • 在裡面找到 htdocs 這個資料夾

  • 所有要執行的檔案都必須放在 htdocs

  • 新增一個 php 檔案,
    之後的課程就用它來測試 php 程式

<?php
	echo 'Hello World!';
?>

試著打開自己寫的PHP

  • 去瀏覽器打 http://localhost/(剛剛創建的檔名)
    ex. http://localhost/php0304.php

  • 看到 Hello World,就代表執行成功!

檔案路徑與網址的對應關係

  • 以剛剛的檔案為例,它的檔案路徑是
    C:\xampp\htdocs\php0304.php

  • 網址是
    http://localhost/php0304.php

替換成

照抄

跟HTML同時使用?

<!DOCTYPE html>
<html lang="zh-Hant-TW">
	<head>
		<meta charset="utf-8">
		<title>TRY!!</title>
		<style>
			h1{color: pink;}
		</style>
	</head>
	<body style="background-color: powderblue;">
    
		<h1 style="color: red;">fallnight</h1>
        
		<img src="https://i.imgur.com/bp1EmIa.jpg" width="10%" height="10%" id=pic>
		<h2>輔大資工二年級</h2>
		<br>
		<h1>Interest</h1>
		<ul >
			<li>遊戲 (原神啟動!</li>
			<li>音樂</li>
			<li>追劇</li>
		</ul>
		<br>
		<h1>Who are u?</h1>
		<input type="text" id=inputname>
		<button onclick="change()">Hi</button>
		<br>
		<label id=who>(你誰)</label>
		<label>, hello!</label>
	</body>
</html>
<!DOCTYPE html>
<html lang="zh-Hant-TW">
	<head>
		<meta charset="utf-8">
		<title>TRY!!</title>
		<style>
			h1{color: pink;}
		</style>
	</head>
	<body style="background-color: powderblue;">
		<h1 style="color: red;">
        
			<?php
				echo 'Welcome PHP';
			?>
            
		</h1>
		<img src="https://i.imgur.com/bp1EmIa.jpg" width="10%" height="10%" id=pic>
		<h2>輔大資工二年級</h2>
		<br>
		<h1>Interest</h1>
		<ul >
			<li>遊戲 (原神啟動!</li>
			<li>音樂</li>
			<li>追劇</li>
		</ul>
		<br>
		<h1>Who are u?</h1>
		<input type="text" id=inputname>
		<button onclick="change()">Hi</button>
		<br>
		<label id=who>(你誰)</label>
		<label>, hello!</label>
	</body>
</html>

語法教學時間~

變數

<?php
	echo "echo 可以顯示文字<br>";
    
    $num1 = 1;
    $num2 = 0.123;
    $str = "NISRA";
    $c = true;
    
    echo "整數num1 = $num1<br>";
    echo "浮點數num2 = $num2<br>";
    echo "字串str = $str<br>";
    echo '單引號會將裡面的東東視為字串輸出,就算打上已宣告的變數 $str 也會直接顯示<br>';
    echo "改成雙引號,就會輸出變數的值 $str ";
?>
  • 結尾記得加上分號 ;

  • 變數名稱前面要加錢字號 $

  • // 註解
    /* ... */ 多行註解

  • 換行要使用 HTML 的 <br>

字串相連?相加?

<?php
    $str = "123";
    
    echo $str+"4"; // 127
    echo "<br>";
    echo $str."4"; // 1234
?>
  • 加號 + 是數學上的相加

  • 想要連接多個字串、變數
    可以用小數點 .

if 判斷式

<?php
	date_default_timezone_set("Asia/Taipei");
	$t = date("H");
	if("6" <= $t && $t < "12"){
		echo "Good morning!";
	}
	elseif("12" <= $t && $t < "18"){
		echo "Good afternoon!";
	}
	else{
		echo "Good night!";
	}
?>

迴圈

<?php
    $num = array(1,2,3,4,5);
    /*
    $num = []; // 空陣列
	$num[] = 1; // 索引值為0 = 1
	$num[] = 2; // 索引值為1 = 2
    $num[] = 3; // 索引值為2 = 3
    $num[] = 4; // 索引值為3 = 4
    $num[] = 5; // 索引值為4 = 5
	*/
    foreach($num as $n){
        echo $n;
    }
?>
<?php
    $i = 1;
    while($i < 10){
         echo $i++;
	}
?>
<?php
    for($k = 1 ; $k <= 5 ; $k++)
	{
		if($k==5)
		{
			break;
		}
		elseif($k==3)
		{
			continue;
		}
		echo $k;
	}
?>
<?php
    $j = 9;
    do{
    	echo $j--;
    }while($j > 0);
?>
  • while
  • do-while
  • for
  • foreach

Superglobal

名稱 說明
$GLOBALS 以陣列 (array) 方式儲存全域變數,變數 (variable) 名稱為字串 (string) 索引值
$_SERVER 以陣列方式儲存跟伺服器有關的變數,如使用者的 IP 、瀏覽器等
$_GET 以陣列方式儲存利用表單 get 傳送的變數
$_POST 以陣列方式儲存利用表單 post 傳送的變數
$_FILES 以陣列方式儲存利用表單檔案處理方面的變數
$_COOKIE 以陣列方式儲存利用 cookie 的變數
$_SESSION 以陣列方式儲存利用 session 的變數
$_REQUEST 接收 $_GET 、 $_POST 、 $_COOKIE 等變數
$_ENV 以陣列方式儲存環境相關變數

$_GET

<?php
  if(isset($_GET['user']) && isset($_GET['age'])){
  	$name = $_GET['user'];
    $years = $_GET['age'];
  	echo "Hello, $name<br>";
    echo "U are $years years old.";
  }
  else echo "Who are you?";
?>
  • isset(變數) → 檢查變數是否已宣告,且其值不為NULL

  • $_GET = [ 'user'  =>  'fallnight' , 'age'  =>  '20' ]

索引鍵

索引鍵

URL

  • "統一資源定位器"  =  網址

  • 像地址可以在地圖找到正確的地點,透過網址可以找到對應的網頁

  • 格式:
    [協定類型]://[伺服器位址]:[埠號]/[檔案路徑][檔名]?[參數]#[片段ID]

  • 範例:
    http://nisra.net:443/tmp/test.php?p=0&q=1#1

$_POST

<!-- php0304.php -->
<p>請輸入姓名:</p>
<form action="output.php" method="post">
	<input type="text" name="user">
	<input type="submit" value="確定">
</form>
<?php
	//output.php
	echo "Helloooooooo,".$_POST['user'];
?>
  • 先創建表單
  • 新增 output.php,用來處理接收的表單內容
  • 建議放在同一層資料夾且必須在 htdocs 裡面

放在一起

$_SERVER

<?php
  echo $_SERVER['PHP_SELF']; // 當前正在執行的網頁檔案名稱
  echo "<br>";
  echo $_SERVER['SERVER_NAME']; // 當前運行網頁檔案所在的主機名稱
  echo "<br>";
  echo $_SERVER['HTTP_USER_AGENT']; // 瀏覽器的相關資訊
  echo "<br>";
  echo $_SERVER['SERVER_PORT']; // 伺服器網域的埠號
?>

其他函式

<?php
    date_default_timezone_set('Asia/Taipei');
    echo date('Y/m/d H:i:s')."<br>"; // Y 年 m 月 d 日   H 點 i 分 s 秒
    
    echo rand(1,10)."<br>"; // 1~10 內隨機輸出一個數字
    
    $a = 1;
    $b = 1.23;
    $c = "NISRA";
    var_dump($a,$b,$c);
?>

preg_match()

  • 用於比對字串是否與指定的模板格式相符

  • 若相符函式會回傳 1 ,不符則回傳 0

  • preg_match(模板,輸入字串)

  • 模板的頭尾要用 '/ 和 /' 框住

  • ex. 只能輸入5個0~9的數字
    =>  
    '/^[0-9]{5}$/'

  • ex. 開頭必須是大寫,且只能輸入英文字母,字數不限
    =>  '
    /^[A-Z][a-zA-Z]*$/'

檢查輸入密碼的格式

<?php
//output.php
	$pwd = $_REQUEST["pwd"];
	if(preg_match('/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}/',$pwd)){
		echo "你輸入的密碼是: $pwd<br>格式正確!";
	}
	else{
		echo "你輸入的密碼是: $pwd<br>格式錯誤!";
	}
?>
<!-- php0304.php -->
<form action="output.php" method="post">
	<p>請輸入密碼</p>
    <p>密碼需要8個字以上,且包含小寫、大寫英文字母及數字至少各一個</p>
	<input type="password" name="pwd">
    <input type="submit" value="確定">
</form>
  • 先創建表單
  • 新增 output.php,用來處理接收的表單內容

== vs ===

  • 因為 PHP 是弱型別語言
  • ==   只比較值
    === 比較值跟型態
<?php
  $a = 5;
  $b = "5";
  var_dump($a == $b);
  var_dump($a === $b);
?>

這是使用 == 的各種結果

"php" == 0  是 TRUE???

如果是用 === 就非常嚴謹

MD5 驗證繞過

  • 什麼是MD5 ?

Lab time - MD5 0x1

<?php
    highlight_file(__FILE__);
    $FROM_INCLUDE = true;
    include("flag.php");
    $msg = "";
    if (isset($_GET['user']) && isset($_GET['password'])) {
        $user = $_GET['user'];
        $password = $_GET['password'];
        $check = "QNKCDZO";
        // the md5 of "QNKCDZO" is 0e830400451993494058024219903391

        if ($user == "admin" && $password != $check && md5($password) == md5($check)) {
            $msg = "Flag: ".$flag;
        } else {
            $msg = "Keep trying!";
        }
    }
    echo $msg;
?>

Lab time - MD5 0x2

<?php
    highlight_file(__FILE__);
    $FROM_INCLUDE = true;
    include("flag.php");
    $msg = "";
    if (isset($_GET['user']) && isset($_GET['password'])) {
        $user = $_GET['user'];
        $password = $_GET['password'];
        if($user === $password){
            echo "user can not equal to password";
        }
        else if(md5($user) === md5($password)){
            $msg = "Flag: ".$flag;
        }
        else{
            $msg = "Keep trying!";
        }
    }
    echo $msg;
?>

PHP

By fallnight

PHP

  • 91