Day 60 - PHP 與 MySQL 入門


簡介

<?php
  // 包在裡面才會被當作是 php 的內容
  // 每行結尾必須要有分號 ;
  echo "123"; // 輸出 123
  echo "<h1>ABC</h1>";

  $a = "Za "; 
  // $ 代表設變數的意思,任何變數的最前面必定有 $
  $b = "Warudo!!!"
  echo $a . $b; // 輸出 $a 和 $b 兩個變數字串拼接的內容
?>

設變數

<?php
  $a = "Za "; 
  // $ 代表設變數的意思,任何變數的最前面必定有 $
  $b = "Warudo!!!"
  echo $a . $b; // 輸出 $a 和 $b 兩個變數字串拼接的內容
?>

陣列 array

<?php
  $arr = array(1, 2, 3, 4, 5);
  echo $arr[0]; // 輸出 arr 中 index 為 0 的內容
  echo "length" . sizeof($arr); // sizeof() 是 arr 的長度
  var_dump($arr); // 輸出 type, value
  print_r($arr); // 輸出 value
?>

資料庫系統 MySQL

SQL 與 NoSQL

  • SQL
    • 關聯式資料語言 (Structured Query Language)
    • 是一種專門拿來操作關聯式資料庫的程式語言,簡單來說就是用指令去操作資料庫
    • 其中比較有名的系統是 MySQL 與 PostgreSQL
  • NoSQL
    • 非關聯式資料語言 (Not Only SQL)
    • 相較於 SQL 只能儲存單一型態的資料,NoSQL 可以儲存的資料更複雜一些,比較常用於存 log 日誌
    • 優點是比較彈性,若要新增欄位則不用去更改資料庫設計
    • 比較有名的系統是 mongoldb

簡單來說

  • Server:專門處理 Request 和 Response 的程式
  • 資料庫系統:專門處理資料的程式

查詢資料 Select

語法:

SELECT column FROM table;

SELECT 語句由以下列表中所述的幾個子句組成:

  • SELECT 之後是逗號分隔列或星號( * )的列表,表示要返回所有列。
  • FROM 指定要查詢數據的表或視圖。
  • JOIN 根據某些連接條件從其他表中獲取數據。
  • WHERE 過濾結果集中的行。
  • GROUP BY 將一組行組合成小分組,並對每個小分組應用聚合函數。
  • HAVING 過濾器基於 GROUP BY 子句定義的小分組。
  • ORDER BY 指定用於排序的列的列表。
  • LIMIT 限制返回行的數量。

語句中的 SELECTFROM 語句是必須的,其他部分是可選的。

範例
SELECT * FROM `QQ`;
SELECT id as nama FROM `QQ` WHERE username = 'gg' and id = '2';

新增資料 Insert

  • 新增單行資料

語法:

INSERT INTO table(column1,column2...) VALUES (value1,value2,...);
  • 插入多行資料

語法:

INSERT INTO table(column1,column2...)
VALUES (value1,value2,...),
       (value1,value2,...),
...;

修改資料 Update

語法:

UPDATE [LOW_PRIORITY] [IGNORE] table_name 
SET 
    column_name1 = expr1,
    column_name2 = expr2,
    ...
WHERE
    condition;
  • 首先,在 UPDATE 關鍵字後面指定要更新數據的表名。
  • 其次,SET 子句指定要修改的列和新值。要更新多個列,請使用以逗號分隔的列表。以字面值,表達式或子查詢的形式在每列的賦值中來提供要設置的值。
  • 第三,使用 WHERE 子句中的條件指定要更新的行。WHERE 子句是可選的。 如果省略 WHERE 子句,則UPDATE語句將更新表中的所有行。

WHERE 非常重要,如果忘記寫上 WHERE 子句,會意外更新表中的所有行。


刪除資料 Delete

語法:

DELETE FROM table_name WHERE condition;

WHERE 在這一項非常重要,沒有加上 WHERE 則系統會對所有行進行動作,即會刪除所有資料。

一般不會使用 DELETE,因為一旦刪除了就找不回這筆資料;相對應的做法是在 table 中加上 is_deleted 這行來操作內容是否顯示該筆資料。


修改表格屬性

  • 修改表格名稱
ALTER TABLE old_table_name RENAME TO new_table_name;
  • 修改屬性(設定唯一值)
ALTER TABLE table_name ADD unique(`username`);

PHP 與 MySQL 的互動

連線

通常會另外寫一個連線的 php 檔(檔名 conn.php),其他 php 檔可以用 require_once('conn.php'); 來引用 conn.php

<?php
  $server_name = 'localhost';
  $username = 'DIO';
  $password = 'DIO';
  $db_name = 'DIO';

  $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"'); // 把時區設定為台灣時區
?>

因為 conn.php 內有包含密碼等敏感資料,所以要公開程式原始檔時(例如上傳 GitHub),會避免把這個 conn.php 也一起公開。

上傳到 GitHub 之後資料很難清掉,參考 [ 狀況題 ] 如何徹底將檔案從 Git 中移除?


讀取資料

  • fetch_array() 將讀出的資料同時以數字與欄位名稱各自存一次在陣列之中,相當於同一個值會出現兩次。
  • fetch_assoc() 將讀出的資料 Key 值設定為該欄位的欄位名稱。
  • fetch_row() 將讀出的資料 Key 值設定為依序下去的數字。
<?php
  require_once('conn.php');

  $result = $conn->query("select * from users;");
  if(!$result) {
    die($conn->error);
  }

// while 這個寫法把每一筆資料都撈出來
  while ($row = $result->fetch_assoc()) {
    echo "id: " . $row['id'] . '<br>';
    echo "username: " . $row['username'] . '<br>';
  }
?>

新增資料

建立一個新增資料的 add.php

<?php 
  require_once('conn.php');

  if (empty($_POST['username'])) {
    die('請輸入 username');
  }

  $username = $_POST['username'];

  $sql = "insert into users(username) values('" . $username ."')";
  // 或改寫為
  $sql = sprintf(
    "insert into users(username) values('%s')",
    $username
  );

  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  header("Location: index.php"); // 引導回 index.php
?>

刪除資料

建立一個刪除資料的 delete.php

<?php 
  require_once('conn.php');

  if (empty($_GET['id'])) {
    die('請輸入 id');
  }

  $id = $_GET['id'];
  $sql = sprintf(
    "delete from users where id = %d",
    $id
  );
  echo $sql . '<br>';

  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  if ($conn->affected_rows >= 1) { // 判斷被影響的列數
    echo '刪除成功';
  } else {
    echo '查無資料'; // 如果是零列那就是沒有東西被刪除(原本就不存在)
  }

  header("Location: index.php");
?>

編輯資料

建立一個編輯資料的 update.php

<?php 
  require_once('conn.php');

  if (empty($_POST['id']) || empty($_POST['username'])) {
    die('請輸入 id 與 username');
  }

  $id = $_POST['id'];
  $username = $_POST['username'];
  $sql = sprintf(
    "update users set username='%s' where id=%d",
    $username,
    $id
  );
  echo $sql . '<br>';

  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }

  header("Location: index.php");
?>

連結功能到主頁面 php

然後將上述功能的 php 檔都連結到 index.php

<?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'];
    echo " <a href='delete.php?id=" . $row['id'] . "'>刪除</a>";
    echo '<br>';
    echo "username: " . $row['username'] . '<br>';
  }

?>

<h2>新增 user</h2>
<form method="POST" action="add.php">
  username: <input name="username" />
  <input type="submit" />
</form>

<h2>編輯 user</h2>
<form method="POST" action="update.php">
  id: <input name="id" />
  username: <input name="username" />
  <input type="submit" />
</form>


參考
  1. MySQL是什麼?
  2. MySQL 基本運作介紹,從資料庫交易與 ACID 特性開始
  3. 該用 MySQL 或 MongoDB?選擇資料庫前你該了解的事
  4. MySQL教程
  5. [PHP][MySQL] 從MySQL取得資料 – fetch_array、fetch_assoc、fetch_row
#PHP #MySQL #Web Development #learning #後端 #Backend
從零學網頁開發
三十歲從零開始學網頁開發






Related Posts

作夢也在寫程式~讓 Siri 講睡前故事

作夢也在寫程式~讓 Siri 講睡前故事

Markdown Notes || 語法整理

Markdown Notes || 語法整理

Vue.js 學習旅程Mile 8 – Class & Style Binding

Vue.js 學習旅程Mile 8 – Class & Style Binding



Comments