PHP 基礎教學

許桔

建置環境

匯入資料

基礎語法


<html>
    <head>

        <title>測試文件</title>
        <link href="..." rel="stylesheet" >
        <script src="..."></script>

    </head>

    <body>

        <p>HTML呈現資料</p>
        
        <p><?php echo "PHP呈現資料"; ?></p>
    
    </body>
</html>

PHP 基礎語法

<?php

    //直接指定變數的型態
    $i = 0;
    $str = "單引號和雙引號有差!";
    
    /*
    檢視一下變數呈現的方式
    */

?>

<p><?php echo $i; ?></p>
<p><?php echo $str; ?></p>
<p><?php echo '$str'; ?></p>
<p><?php echo "$str"; ?></p>

PHP的所有變數都是以$符號開始的

PHP 基礎語法

<?php 
    $bookname = "PHP入門教學書籍";
    $price = 350;
?>
<table border="1">
    <tr>
        <td> <?php echo "書名"; ?> </td>
        <td> <?php echo "價格"; ?> </td>
    </tr>
    <tr>
        <td> <?php echo $bookname; ?> </td>
        <td> <?php echo $price; ?> </td>
    </tr>
</table>

把PHP輸出和HTML輸出區隔開來

PHP 基礎語法

<?php 

    $bookname = "PHP入門教學書籍";
    $price = 350;

    echo "<table border='1'><tr><td>";
    echo "書名";
    echo "</td>";
    echo "<td>";
    echo "價格"; 
    echo "</td></tr>";
    
    echo "<tr><td>";
    echo $bookname;
    echo "</td>";
    echo "<td>";
    echo $price; 
    echo "</td></tr></table>";

?>

PHP 基礎語法

<?php 

    $bookname="書名";
    $value="PHP網頁程式設計入門";

    echo $bookname.":".$value;

?>

PHP字串的連結,使用.來連接

PHP 基礎語法

<?php

    $i=1;
    $i++;
    
    echo $i."<br />";
    
    $i = $i+10;
    
    echo $i;

?>

PHP的運算子和C一樣

主要注意變數前面要加$就好

PHP 基礎語法

<?php 
    $i = 10;
    
    if($i<10) {
        echo "第一個條件".$i."<10成立";
    }
    //else if 和 elseif 之間是相同的,但使用上還是建議使用elseif
    elseif($i>10) {
        echo "第二個條件".$i.">10成立";
    }
    else {
        echo "最後一個條件".$i."=10成立";
    }
?>

判斷式的邏輯的變化也不大

<?php 

    $name = array("許桔","怡如","姿伸","敬嘉","佳妤","群仁");

    echo "大帥哥".$name[0];

?>

陣列

PHP 基礎語法

<b>五人小組</b>
<br /><br />

<b>(For迴圈抓):</b>
<?php
    for($i=1; $i<6; $i++) {
        echo $name[$i]." ";
    }
?>

<br /><br />

<b>(While迴圈):</b>
<?php 
    $i=1;
    while($i<6) {
        echo $name[$i]." ";
    $i++;
    }
?>

迴圈(延伸陣列抓取)

PHP 基礎語法

<b>Foreach迴圈抓陣列:</b><br /><br />

<?php
    $name = array("許桔","怡如","姿伸","敬嘉","佳妤","群仁");

    foreach($name as $num) {
        echo $num." <br />";
    }
?>

<br />

<?php

    foreach($name as $num => $value) {
        echo "筆數:".$num.",";
        echo "值:".$value."<br />";
    }

?>

Foreach 迴圈

PHP 基礎語法

<?php
 
    function Callinfo() {
        echo "我叫許桔";
    }


    echo "Hello~";

    echo Callinfo();
?>

函數

PHP 基礎語法

<?php
 
    function Callinfo($call) {
        echo $call.",大家好<br />";
    }


    echo "Hello~<br />";
    
    echo Callinfo("我叫許桔");
    echo Callinfo("我叫怡如");

?>

函數-帶參數

PHP 基礎語法

<?php
 
    function sum($x,$y){
        $total=$x+$y;
        return $total;
    }

    echo "10 + 20 = ".sum(10,20);

?>

函數-帶參數+回傳值

PHP 基礎語法

<?php 
    
    include 'yoursite.php';

    require 'yoursite.php';

?>

引入

透過PHP來跟資料庫溝通

  • Connection
  • Query
  • Insert Into
  • Update
  • Delete

Connection - 建立PDO連線 db_connection.php


<?php

	$config_set['db_connection']['dsn'] = 'mysql:dbname=school;host=127.0.0.1;charset=utf8';
	$config_set['db_connection']['user_name'] = 'root';
	$config_set['db_connection']['password'] = '';

	$dbh = new PDO (
		$config_set['db_connection']['dsn'],
		$config_set['db_connection']['user_name'],
		$config_set['db_connection']['password'],
		array (
			PDO::ATTR_EMULATE_PREPARES => false, 
			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
			)
		);
?>


<?php
        //要與資料庫連線,均需使用該以下方式來引入
        require('db_connection.php');
?>

Try Catch - db_connection.php

<?php

    function error_login($log){
        echo 'Log:'.$log.'<br />';
    }
	
    try{
        ...
    }
    catch(PDOException $error){
	echo "Something Error!!<br />";
	error_login($error->getMessage());
    }

?>

QUERY

  1. 透過PHP使用字串方式傳遞SQL語法至資料庫
  2. 資料庫回傳接收之SQL
<?php

    require("db_connection.php");

    $sql = $dbh->query("SELECT * FROM student"); 

    foreach($sql as $row) {
    	echo $row['no'].", ".$row['educational_system'].", ".$row['department'].
        ", ".$row['class'].", ".$row['num'].", ".$row['name']."<br />"; 
    }
    
?>

INSERT INTO


<?php
    
    //也可以使用別頁面傳來的資料
    $educational_system = $_POST['educational_system'];

    $insert = $dbh->prepare("INSERT INTO
                            `student` (`educational_system`, `department`, `class`, `num`, `name`)
                            VALUES (:educational_system, :department, :class, :num, :name)
                            ");
    $insert->execute(
                        array(
                           ':educational_system' => $educational_system,
                           ':department' => '資管系',
                           ':class' => '資五甲',
                           ':num' => '12345678',
                           ':name' => '王大明'
                 )
                    );

?>

UPDATE


<?php

    require("db_connection.php");

    $educational_system = "test";
    $num = "s1803B102";

    $update = $dbh->prepare("UPDATE `student` 
                            SET `educational_system` = :educational_system 
                            WHERE `num` = :num
                            ");
        
    $update->execute(
                     array(
                           ':educational_system' => $educational_system,
                           ':num' => $num
                           )
                    );

?>

DELETE

<?php

    require("db_connection.php");

    $educational_system = '四技1' 

    $delete = $dbh->prepare("DELETE FROM `student`
    		            WHERE `educational_system` = :educational_system
                            ");

    $delete->execute(
                     array(
                           ':educational_system' => $educational_system
                          )
                    );

?>

建置基礎的後台系統

檔案

會員權限機制

Session

  • 存在Server端
  • 客戶端看不到
  • 由Server控制

Cookie

  • 存在客戶端
  • 可以直接看見
  • 可以偽造

但是Session的使用時機和用法錯誤,還是一樣會有危險

Session

  • 記錄較敏感的資料,不能給使用者觀看的
  • 例如:登入資訊、驗證碼的答案、流程控管

Cookie

  • 不敏感、涉及到安全性的資料
  • 例如:佈景主題...等
  • 適時的使用Cookie來減少伺服器負擔

使用時機

補充

開 始 製 作

完成之範例檔

建置登入頁 - login.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>登入</title>
</head>
<body>
	<form method="post" action="login_session.php">
		帳號:<input name="id" type="text" placeholder="" />
		<br /> <br />
		密碼:<input name="psw" type="password" placeholder="" />
		<br /> <br />
		<button>登入</button>
		  
		<a href="register.php">註冊</a>
	</form>
</body>
</html>

建置檢查帳號頁 - login_session.php

<?php
        require('db_connection.php');

        $id = $_POST['id'];
        $psw = $_POST['psw'];

	$sql = $dbh->prepare("SELECT * FROM `member` WHERE `sid` = :sid");
	$sql->execute(array(':sid' => $id));
        //檢查帳號是否存在
	if($sql->rowCount() == 1) { 
		$user = $sql->fetch(); 
		password_verify($psw, $user['psw']);
		$_SESSION['user'] = $user['sid'];
		if($user['iden'] == 1) {
			$_SESSION['permissions'] = 1;
			echo "<script>alert('登入成功!');</script>";
	                header("refresh:0; url=student.php");
		}
		else {
    	                echo "<script>alert('登入成功!');</script>";
    	                header("refresh:0; url=teacher.php");
		}
	}
	else {
    		echo "<script>alert('登入失敗!');</script>";
	        header("refresh:0; url=login.php");
	}
?>

整理檢查帳號頁1 - login_session.php

<?php
require('db_connection.php');

function login($dbh, $id, $psw) {
	$sql = $dbh->prepare("SELECT * FROM `member` WHERE `sid` = :sid");
	$sql->execute(array(':sid' => $id));

        //查詢帳號是否存在
	if($sql->rowCount() == 1) { 
		$user = $sql->fetch(); 
		password_verify($psw, $user['psw']);
		$_SESSION['user'] = $user['sid'];
		if($user['iden'] == 1) {
			$_SESSION['permissions'] = 1;
			return 1;
		}
		else {
			$_SESSION['permissions'] = 0;
			return 2;
		}
	}
	else {
		return 0;
	}
}

...

整理檢查帳號頁2 - login_session.php

...

$id = $_POST['id'];
$psw = $_POST['psw'];

//判斷權限而導入不同頁面
switch (login($dbh, $id, $psw)) {
	case '1':
	echo "<script>alert('登入成功!');</script>";
	header("refresh:0; url=student.php");
	break;

	case '2':
	echo "<script>alert('登入成功!');</script>";
	header("refresh:0; url=teacher.php");
	break;

	case '0':
	echo "<script>alert('帳號或密碼錯誤!');</script>";
	header("refresh:0; url=login.php");
	break;

	default:
	echo "<script>alert('登入失敗!');</script>";
	header("refresh:0; url=login.php");
	break;
}
?>

建置登出頁面 - logout.php

<?php

    session_start(); 
    unset($_SESSION['s_id']);
    unset($_SESSION['permissions']);
    header("refresh:0; url=index.php");

?>
<scrpit>
    alert('登入資訊錯誤,請重新登入!');
</script>
<?php

    session_start(); 
    unset($_SESSION['s_id']);
    unset($_SESSION['permissions']);
    header("refresh:0; url=index.php");

?>

建置錯誤頁面 - error.php

建置學生觀看頁 - student.php ( 原index.php )

//在 <body> 後撰寫判斷SESSION
<?php
if(@isset($_SESSION['user'])) { 
    echo "<b>Hi  " . $_SESSION['user'] . 
         ", <a href='logout.php'>登出</a></b><br /><br />";
    $session_user = $_SESSION['user'];
?>

//更改讀取的SQL
$sql = $dbh->query("SELECT * FROM `member`, `student` 
                    WHERE `sid` = `num` AND `sid` = '$session_user' 
                    ");

//拿掉刪除的欄位,以及 更改修改的欄位
    <form method="post" action="update.php">
        <input type="text" name="edit" value="<?php echo $row['num'] ?>" hidden="hidden" />
        <button>修改</button>
    </form>

//在 </body> 前引入登入錯誤資訊
<?php
}
else {
    require('error.php');
}
?>
//在 <body> 後撰寫判斷SESSION
<?php
if(@isset($_SESSION['user']) and @$_SESSION['permissions'] == 0) { 
    echo "<b>Hi  " . $_SESSION['user'] .
         ", <a href='logout.php'>登出</a></b><br /><br />";
    $session_user = $_SESSION['user'];
?>

//更改修改的欄位
    <form method="post" action="update.php">
        <input type="text" name="edit" value="<?php echo $row['num'] ?>" hidden="hidden" />
        <button>修改</button>
    </form>

//在 </body> 前引入登入錯誤資訊
<?php
}
else {
    require('error.php');
}
?>

建置學生觀看頁 - teacher.php ( 原index.php )

建置註冊頁 - register.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>註冊</title>
</head>
<body>
	<form method="post" action="register_session.php">
		學號:<input name="id" type="text" placeholder="" />
		<br /> <br />
		<!--重複輸入密碼的驗證這邊就不做了-->
		密碼:<input name="psw" type="password" placeholder="" />
		<br /> <br />
		學制:<input name="es" type="text" placeholder="" />
		<br /> <br />
		科系:<input name="dep" type="text" placeholder="" />
		<br /> <br />
		班級:<input name="cls" type="text" placeholder="" />
		<br /> <br />
		姓名:<input name="name" type="text" placeholder="" />
		<br /> <br />
		<button>註冊</button>
	</form>
</body>
</html>

(原insert.php)

<?php
    require('db_connection.php');    

    $id = $_POST['id'];
    //用sha256的方式進行密碼加密
    $psw = password_hash($_POST['psw'], PASSWORD_DEFAULT);
    $educational_system = $_POST['es'];
    $department = $_POST['dep'];
    $class = $_POST['cls'];
    $name = $_POST['name'];

    $sql = $dbh->prepare("SELECT * FROM `member` WHERE `sid` = :sid");
    $sql->execute(array(':sid' => $id));
    
    //如果帳號沒有人註冊才可以註冊
    if($sql->rowCount() != 1) {
        ...
    }
    else {
	echo "<script>alert('註冊失敗,該帳號已有人註冊');</script>";
	header('refresh:0;url=register.php');
    }
    
?>

建置註冊處理 register_session.php

 (原insert_fin.php)

//...內,代表帳號沒有存在,因此可以進行新增之動作

    $insert = $dbh->prepare("INSERT INTO 
			    `member` (`sid`, `psw` ,`iden`) 
			    VALUES (:sid, :psw, :iden)
			    ");
    $insert->execute(array(':sid' => $id, ':psw' => $psw, ':iden' => '1'));

    $insert = $dbh->prepare("INSERT INTO 
			    `student` (`educational_system`, `department` ,`class`, `num`, `name`)
			    VALUES (:educational_system, :department, :class, :num, :name)
			    ");
    $insert->execute(
		    array
                          (
			    ':educational_system' => $educational_system,
			    ':department' => $department,
			    ':class' => $class,
			    ':num' => $id,
			    ':name' => $name,
			  )
	            );

建置註冊處理2 register_session.php

<?php
require('db_connection.php');

function check($dbh, $id) {
	$sql = $dbh->prepare("SELECT * FROM `member` WHERE `sid` = :sid");
	$sql->execute(array(':sid' => $id));

    //查詢帳號是否存在
	if($sql->rowCount() != 1) {
		return 1;
	}
	else {
		return 0;
	}
}

    $id = $_POST['id'];
    $psw = password_hash($_POST['psw'], PASSWORD_DEFAULT);
    $educational_system = $_POST['es'];
    $department = $_POST['dep'];
    $class = $_POST['cls'];
    $name = $_POST['name'];

    check($dbh, $id);

...

整理註冊處理1 - register_session.php

function insert($status, $dbh, $id, $psw, $educational_system, $department, $class, $name) {
	if($status == 1) {
		$insert = $dbh->prepare("INSERT INTO 
			`member` (`sid`, `psw` ,`iden`) 
			VALUES (:sid, :psw, :iden)
			");
		$insert->execute(array(':sid' => $id, ':psw' => $psw, ':iden' => '1'));
		$insert = $dbh->prepare("INSERT INTO 
			`student` (`educational_system`, `department` ,`class`, `num`, `name`)
			VALUES (:educational_system, :department, :class, :num, :name)
			");
		$insert->execute(
			array(
				':educational_system' => $educational_system,
				':department' => $department,
				':class' => $class,
				':num' => $id,
				':name' => $name,
		        ));
		return 1;
	}
	else {
            return 0;
        }
}

$status = check($dbh, $id);
$register_status = insert($status, $dbh, $id, $psw, $educational_system, $department, $class, $name);
...

整理註冊處理2 - register_session.php

if($register_status == 1) {
	echo "<script>alert('註冊成功');</script>";
	header('refresh:0;url=login.php');
}
else {
	echo "<script>alert('註冊失敗,該帳號已有人註冊');</script>";
	header('refresh:0;url=register.php');
}
?>

整理註冊處理3 - register_session.php

更改修改頁 - update.php

//sutdent.php 和 teacher.php,兩個頁面共用

//移除GET傳值update的方法、移除no的

//在 <body> 下,新增判斷SESSION存在與否
<?php if(@isset($_SESSION['user'])) { ?>

//更改 讀取資料的方式
<?php
    $num = $_POST['edit'];
    $sql = $dbh->query("SELECT * FROM student WHERE num = '$num' ");
?>

//在 </body> 前,引入登入錯誤
<?php
}
else {
    require('error.php');
}
?>
<?php

    require("db_connection.php");

    $session_users = $_SESSION['user'];

    $educational_system = $_POST['es'];
    $department = $_POST['dep'];
    $class = $_POST['cls'];
    $num = $_POST['num'];
    $name = $_POST['name'];

...

更改修改處理1 - update_fin.php

...

    $update = $dbh->prepare("UPDATE `student` 
                            SET `educational_system` = :educational_system,
                            `department` = :department,
                            `class` = :class,
                            `name` = :name
                            WHERE `num` = :session_users
                            ");

    $update->execute(
                    array(
                          ':educational_system' => $educational_system,
                          ':department' => $department,
                          ':class' => $class,
                          ':name' => $name,
                          ':session_users' => $num
                         )
                    );

    if(@$_SESSION['permissions']==0) {
        header('refresh:0;url = teacher.php');
    }
    else {
        header('refresh:0;url = student.php');   
    }
?>

更改修改處理2 - update_fin.php

更改刪除頁 - delete_fin.php

<?php
    require('db_connection.php');

    if(@isset($_SESSION['user']) and @$_SESSION['permissions'] == 0) { 

    //改用學號(帳號)驗證
    $num = $_GET['del']; 
    
    $delete = $dbh->prepare("DELETE FROM `student` WHERE num = :num");
    $delete->execute(array(':num' => $num));

    $delete = $dbh->prepare("DELETE FROM `member` WHERE sid = :sid");
    $delete->execute(array(':sid' => $num));

    header('refresh:0;url = teacher.php');
    
    }
    else{
	require('error.php');
    }
?>

PHP

By nicky30102

PHP

  • 1,294