PHP & Mysql/Mariadb 連線

 


今天我們來討論如何用原生的PHP與Mysql/Mariadb做連線 , 直接上程式碼~

<?php
	$server = "localhost";         # MySQL/MariaDB 伺服器
	$dbuser = "root";       # 使用者帳號
	$dbpassword = ""; # 使用者密碼
	$dbname = "test";    # 資料庫名稱

	# 連接 MySQL/MariaDB 資料庫
	$connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

	# 檢查連線是否成功
	if ($connection->connect_error) {
	  die("連線失敗:" . $connection->connect_error);
	}

	# MySQL/MariaDB 指令
	$sqlQuery = "資料庫的程式碼打在這邊";

	# 執行 MySQL/MariaDB 指令
	if ($connection->query($sqlQuery) === TRUE) {
	  echo "成功建立資料表。";
	} else {
	  echo "執行失敗:" . $connection->error;
	}

	# 關閉 MySQL/MariaDB 連線
	$connection->close();
?>


一起來製作一個簡單的筆記本範例吧!

創建一個名叫 notes的資料表

<?php
	$server = "localhost";         # MySQL/MariaDB 伺服器
	$dbuser = "root";       # 使用者帳號
	$dbpassword = ""; # 使用者密碼
	$dbname = "test";    # 資料庫名稱

	# 連接 MySQL/MariaDB 資料庫
	$connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

	# 檢查連線是否成功
	if ($connection->connect_error) {
	  die("連線失敗:" . $connection->connect_error);
	}

	# MySQL/MariaDB 指令
	$sqlQuery = "CREATE TABLE `notes` (
		`id` INT(11) NOT NULL AUTO_INCREMENT,
		`title` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_unicode_ci',
		`content` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
		PRIMARY KEY (`id`)
	)";

	# 執行 MySQL/MariaDB 指令
	if ($connection->query($sqlQuery) === TRUE) {
	  echo "成功建立資料表。";
	} else {
	  echo "執行失敗:" . $connection->error;
	}

	# 關閉 MySQL/MariaDB 連線
	$connection->close();
?>



加入一些資料吧~

<?php
	$server = "localhost";         # MySQL/MariaDB 伺服器
	$dbuser = "root";       # 使用者帳號
	$dbpassword = ""; # 使用者密碼
	$dbname = "test";    # 資料庫名稱

	# 連接 MySQL/MariaDB 資料庫
	$connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

	# 檢查連線是否成功
	if ($connection->connect_error) {
	  	die("連線失敗:" . $connection->connect_error);
	}

	# MySQL/MariaDB 指令
	$sqlQuery = "INSERT INTO notes (title,content) VALUES 
		('早上','打掃'),
		('中午','看書'),
		('晚上','打籃球');";

	# 執行 MySQL/MariaDB 指令
	if ($connection->query($sqlQuery) === TRUE) {
	  	echo "成功建立資料表。";
	} else {
		# 執行失敗並顯示錯誤訊息
	  	echo "執行失敗:" . $connection->error;
	}

	# 關閉 MySQL/MariaDB 連線
	$connection->close();
?>


是不是很簡單呢 ~ 但是這樣還不是一個完整的網站 , 應該要有一個畫面讓使用者直接新增吧 , 那我們繼續來實作~

加入畫面 , 並且使用 ajax 來完成新增資料

如果還不熟悉 ajax 可以看這篇 jquery & ajax教學

這邊我們有兩個檔案 , index.php(畫面) 和 insert.php(新增進資料庫)

index.php

<!doctype html>
<html lang="en">
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">

        <title>Notes</title>
    </head>
    <body>
        <div class="container">
            <div class="row mt-5">
                <div class="col">
                    <h1 style="text-align: center;">筆記本</h1>
                    <!-- 以下為php從資料庫撈取資料並且輸出畫面的程式碼 -->
                    <?php
                        $server = "localhost";         # MySQL/MariaDB 伺服器
                        $dbuser = "root";       # 使用者帳號
                        $dbpassword = ""; # 使用者密碼
                        $dbname = "test";    # 資料庫名稱

                        $connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

                        # 檢查連線是否成功
                        if ($connection->connect_error) {
                          die("連線失敗:" . $connection->connect_error);
                        }

                        # MySQL/MariaDB 指令
                        $sqlQuery = "SELECT title,content FROM notes";

                        # 執行 MySQL/MariaDB 指令
                        if ($result = $connection->query($sqlQuery)) {
                          # 取得結果
                            
                        // output data of each row
                        while($row = $result->fetch_assoc()) {
                            //輸出html畫面
                            echo "<h5 style='color: red;'>標題</h5>" . $row["title"].'<br>'. "<h5 style='color: red;'>內容</h5>" . $row["content"]."<hr>";
                        }

                          # 釋放資源
                          $result->close();
                        } else {
                          echo "執行失敗:" . $connection->error;
                        }

                        # 關閉 MySQL/MariaDB 連線
                        $connection->close();
                    ?>
                </div>
            </div>
            <div class="row mt-5">
                <div class="col">
                    <div class="form-group">
                        <label for="title">標題</label>
                        <input type="email" class="form-control" id="title" placeholder="最多100字...">
                    </div>
                    <div class="form-group">
                        <label for="content">內容</label>
                        <textarea class="form-control" id="content" rows="3" placeholder="請填寫內容"></textarea>
                    </div>
                    <button type="submit" class="btn btn-primary" id="enter">送出資料</button>
                </div>
            </div>
        </div>
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
    </body>
</html>

<script type="text/javascript">
    // 等全部的DOM元素下載完後就會觸發,觸發時間較早 
    // 補充 : window.onload是等整個網站都下載完成才會跑,如果有100張圖 , 要等100張圖下載完才會執行 , 適合用在廣告的載入
    $(document).ready(function() {
        $("#enter").click(function() { //ID 為 submitExample 的按鈕被點擊時
            $.ajax({
                type: "POST", //傳送方式 , 常用的傳送方式有 post 和 get
                url: "insert.php", //傳送目的地
                dataType: "json", //資料格式 , 傳送文字訊息都用json , 圖片的話用formdata
                data: { //傳送資料
                    title: $("#title").val(), //表單欄位 ID title
                    content: $("#content").val() //表單欄位 ID content
                },
                success: function(data) {
                    if (data.result == 'success') { //如果後端回傳 json 是成功的話
                        //回傳正確資料的話 , 重新整理畫面
                        location.reload();
                    }
                    if (data.result == 'error') {
                        //彈跳視窗顯示錯誤訊息
                        alert(data.errorMsg);
                    }
                },
                error: function(jqXHR) {
                    alert('發生錯誤');
                }
            })
        })
    });
</script>

insert.php

<?php
    $title = $_POST["title"]; //取得 nickname POST 值
    $content = $_POST["content"]; //取得 gender POST 值
	
	if (empty($title)) {
        echo json_encode(array(
        	'result' => 'error',
            'errorMsg' => '請輸入標題 !'
        ));
        //因為資料錯誤所以強制停止程式碼
        exit();
	}
	if (empty($content)) {
        echo json_encode(array(
        	'result' => 'error',
            'errorMsg' => '請輸入內容 !'
        ));
        exit();
	}

	$server = "localhost";         # MySQL/MariaDB 伺服器
	$dbuser = "root";       # 使用者帳號
	$dbpassword = ""; # 使用者密碼
	$dbname = "test";    # 資料庫名稱

	# 連接 MySQL/MariaDB 資料庫
	$connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

	# 檢查連線是否成功
	if ($connection->connect_error) {
	  	die("連線失敗:" . $connection->connect_error);
	}

	# MySQL/MariaDB 指令 , 使用 '' 來放PHP變數
	$sqlQuery = "INSERT INTO notes (title,content) VALUES ('$title','$content')";
		
	# 執行 MySQL/MariaDB 指令
	if ($connection->query($sqlQuery) === TRUE) {
        echo json_encode(array(
        	'result' => 'success'
        ));
	} else {
		# 執行失敗並顯示錯誤訊息
        echo json_encode(array(
        	'result' => 'error',
            'errorMsg' => '資料庫錯誤訊息 : '.$connection->error
        ));
	}

	# 關閉 MySQL/MariaDB 連線
	$connection->close();
?>

刪除文章

1. 我們先在index.php新增刪除按鈕 , 使用者才能點按鈕來刪除文章

2. 然後再增加一個delete.php的檔案來執行刪除資料

index.php

<!doctype html>
<html lang="en">
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">

        <title>Notes</title>
    </head>
    <body>
        <div class="container">
            <div class="row mt-5">
                <div class="col">
                    <h1 style="text-align: center;">筆記本</h1>
                    <!-- 以下為php從資料庫撈取資料並且輸出畫面的程式碼 -->
                    <?php
                        $server = "localhost";         # MySQL/MariaDB 伺服器
                        $dbuser = "root";       # 使用者帳號
                        $dbpassword = ""; # 使用者密碼
                        $dbname = "test";    # 資料庫名稱

                        $connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

                        # 檢查連線是否成功
                        if ($connection->connect_error) {
                          die("連線失敗:" . $connection->connect_error);
                        }

                        # MySQL/MariaDB 指令
                        $sqlQuery = "SELECT id,title,content FROM notes";

                        # 執行 MySQL/MariaDB 指令
                        if ($result = $connection->query($sqlQuery)) {
                          # 取得結果
                            
                        // output data of each row
                        while($row = $result->fetch_assoc()) {
                            //輸出html畫面
                            echo "<div class='col-12 text-right'><button type='button' class='btn btn-danger' onclick=deleteArticle('".$row["id"]."')>刪除</button></div>"."<h5 style='color: red;'>標題</h5>" . $row["title"].'<br>'. "<h5 style='color: red;'>內容</h5>" . $row["content"]."<hr>";
                        }

                          # 釋放資源
                          $result->close();
                        } else {
                          echo "執行失敗:" . $connection->error;
                        }

                        # 關閉 MySQL/MariaDB 連線
                        $connection->close();
                    ?>
                </div>
            </div>
            <div class="row mt-5">
                <div class="col">
                    <div class="form-group">
                        <label for="title">標題</label>
                        <input type="email" class="form-control" id="title" placeholder="最多100字...">
                    </div>
                    <div class="form-group">
                        <label for="content">內容</label>
                        <textarea class="form-control" id="content" rows="3" placeholder="請填寫內容"></textarea>
                    </div>
                    <button type="submit" class="btn btn-primary" id="enter">送出資料</button>
                </div>
            </div>
        </div>
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
    </body>
</html>

<script type="text/javascript">
    // 等全部的DOM元素下載完後就會觸發,觸發時間較早 
    // 補充 : window.onload是等整個網站都下載完成才會跑,如果有100張圖 , 要等100張圖下載完才會執行 , 適合用在廣告的載入
    $(document).ready(function() {
        $("#enter").click(function() { //ID 為 submitExample 的按鈕被點擊時
            $.ajax({
                type: "POST", //傳送方式 , 常用的傳送方式有 post 和 get
                url: "insert.php", //傳送目的地
                dataType: "json", //資料格式 , 傳送文字訊息都用json , 圖片的話用formdata
                data: { //傳送資料
                    title: $("#title").val(), //表單欄位 ID title
                    content: $("#content").val() //表單欄位 ID content
                },
                success: function(data) {
                    if (data.result == 'success') { //如果後端回傳 json 是成功的話
                        //回傳正確資料的話 , 重新整理畫面
                        location.reload();
                    }
                    if (data.result == 'error') {
                        //彈跳視窗顯示錯誤訊息
                        alert(data.errorMsg);
                    }
                },
                error: function(jqXHR) {
                    alert('發生錯誤');
                }
            })
        })
    });

    function deleteArticle(id) {
        $.ajax({
            type: "POST",
            url: "delete.php",
            dataType: "json",
            data: {
                id: id,
            },
            success: function(data) {
                if (data.result == 'success') {
                    location.reload();
                }
                if (data.result == 'error') {
                    //彈跳視窗顯示錯誤訊息
                    alert(data.errorMsg);
                }
            },
            error: function(jqXHR) {
                alert('發生錯誤');
            }
        })
    }
</script>

delete.php

<?php
    $id = $_POST["id"]; //取得 nickname POST 值
	
	if (empty($id)) {
        echo json_encode(array(
        	'result' => 'error',
            'errorMsg' => '請輸入標題 !'
        ));
        //因為資料錯誤所以強制停止程式碼
        exit();
	}

	$server = "localhost";         # MySQL/MariaDB 伺服器
	$dbuser = "root";       # 使用者帳號
	$dbpassword = ""; # 使用者密碼
	$dbname = "test";    # 資料庫名稱

	# 連接 MySQL/MariaDB 資料庫
	$connection = new mysqli($server, $dbuser, $dbpassword, $dbname);

	# 檢查連線是否成功
	if ($connection->connect_error) {
	  	die("連線失敗:" . $connection->connect_error);
	}

	# MySQL/MariaDB 指令 , 使用 '' 來放PHP變數
	$sqlQuery = "DELETE FROM notes WHERE id = '$id'";
		
	# 執行 MySQL/MariaDB 指令
	if ($connection->query($sqlQuery) === TRUE) {
        echo json_encode(array(
        	'result' => 'success'
        ));
	} else {
		# 執行失敗並顯示錯誤訊息
        echo json_encode(array(
        	'result' => 'error',
            'errorMsg' => '資料庫錯誤訊息 : '.$connection->error
        ));
	}

	# 關閉 MySQL/MariaDB 連線
	$connection->close();
?>


終於做出一個簡單的網站了~ 💯 💯 💯

但是您會發現 , 程式碼是不是有點亂呢 , 如果是一個大型的專案 , 每個開發者都依照自己的開發模式 , 開了一堆的檔案 , 又不寫註解 , 最後程式碼會變得非常地難維護.....

所以PHP出現了非常多的框架(framework) ,在開發的時候 , 大家都照著這個框架的開發模式去開發 , 維護和開發上就會變得非常的有效率 , 現在最有名的應該就是 laravel 了吧 ~

下次有機會在介紹給大家 ~

留言

這個網誌中的熱門文章

網頁入門教材目錄

什麼是HTML?

網頁是怎麼運作的呢?