[BE101] PHP 與 MySQL (語法)


Posted by s103071049 on 2021-06-09

PhpMyAdmin 提供網頁介面存取資料庫,這套軟體也提供地方下 sql 指令
點 sql => 執行,可以看到語法出來結果

MySQL 語法基礎

固定的 SQL 語法會以大寫表示以跟自定義的區隔。

一、查詢資料 Select

SELECT 欄位名稱 FROM `table名稱` WHERE 1

# * 表示所有欄位
SELECT * FROM `columns_priv`
# 表示選多個欄位
SELECT id, title FROM `columns_priv`

# id 的資料不會變,只是欄位名稱變成 name
SELECT id as name FROM `columns_priv`

# where 接查詢條件,舉例:id = 4 的那筆資料
SELECT id FROM `columns_priv` where id = 4

# 條件也可以串在一起
# 同時符合 id = 4 且女性
SELECT * FROM `columns_priv` where gender = 'female' and id = '4'
# 同時符合 id = 4 或女性
SELECT * FROM `columns_priv` where gender = 'female' or id = '4'

PhpMyAdmin 提供很多內建函式在 sql 查詢上,基本會用到的查詢形式如上。

二、新增資料 Insert

INSERT INTO `table 名稱`(`插入資料的欄位名稱1`, `插入資料的欄位名稱2`) VALUES ('實際值1','實際值2')
# 插入資料的欄位名稱1 是實際值1
# 插入資料的欄位名稱2 是實際值2
# 大多數情況,不用反引號包住也 ok,除非名稱有特殊字元

三、修改資料 Update

UPDATE `table名稱` SET 一系列想更新的欄位(用逗號分隔) WHERE 1

# 不加 where => 所有 username 都變成 'aaa',影響到整個 table
UPDATE `qoo` SET username = 'aaa'

# 加 where => 指定改變哪一個資料
# 只更新 qoo 這個 table id = 1 的資料
UPDATE `qoo` SET username = 'aaa' WHERE id = 1

# 一次 update 多個欄位 => 用 , 分開
UPDATE `qoo` SET username = 'aaa', content = 'content02' WHERE id =1

UPDATE 某個 TABLE,SET 欄位名稱和我要改變的值,加上 WHERE 條件指定我要改變符合哪個條件的欄位,如果沒有 WHERE 會 UPDATE 整個 TABLE

四、刪除資料 Delete

# DELETE FROM 哪個 TABLE,後面接甚麼條件
DELETE FROM `table 名稱` WHERE 條件 

DELETE FROM `qoo` WHERE id = 2

指定條件,只要符合條件的都會被刪掉。

小補充、

很多系統的刪除,未必是真正的刪除,為了怕使用者誤刪以及重要資料無法挽回的錯誤,會放個標誌來判斷他是否被刪除掉。

具體作法:在資料庫的結構中新增欄位 is_deleted type 是布林,0 表示還沒刪掉,當我在前台刪除資料,他只是把 is_deleted 設為 1。

# 將沒有被刪除的資料顯示到我們面前
SELECT * FROM `TABLE` WHERE is_deleted = 0
  • 優點:如果誤刪,還有救的回來的空間。可以解決用 deleted 刪掉,資料庫沒有備份就救不回來了的窘境
  • 缺點:資料只會多不會少。

初探 PHP

前置作業:檢視 => 開發人員工具 => net work => disable cache 打勾

因為我們不要瀏覽器暫存的快取。可以解決一些靈異現象,改了東西但沒有顯示。若重新載入還是錯的,就表示不是快取的問題。

一、再次複習 PHP 執行流程

XAMPP 究竟是如何運作 ?

使用者發一個 request 指定要 style.css 這支檔案,request 就會被傳到 server 去,server 去找我所要的檔案,找到後回傳給 clinet 端,形成一個 response。

靜態網頁,server 做的事很簡單就是找檔案,檔案內容是甚麼就回傳甚麼。

動態網頁與靜態網頁的差別在於,回傳之前會先執行 php 檔,再把執行完的結果丟回 client 去。每發一次 request 都會重新解析 php。

style.css 裡面放了 php 的程式碼,對我們目前的 webserver 而言, .css 結尾都是靜態檔案。他並沒有指定用 php 執行,所以會將檔案直接丟回來。

body {
    background: <?php echo 'red'?>;
}

他輸出的是 i am angela 而不是一整段代碼,這是因為 server 在回傳 php 之前有先執行 php 檔,再將執行過的結果丟回來。

<?php
  echo 'i am angela';
?>

小試身手、動態的網頁

<h1> now: <?php echo date("Y-m-d h:i:s")?> </h1>

根據 server 設定的不同,php 檔也有可能變成靜態的檔案,如果 server 沒有設定,就會將檔案內容直接傳回去。

XAMPP 只有 .php 檔會做執行 php 的動作。我們之所以可以看到動態內容,就是因為 server 有經過設定。

檢視會發現,瀏覽器幫補一些 tag,我們輸出的只有 body。

php 重點整理

  1. php 如何被執行、背後有哪個步驟
  2. server 有經過設定,才會執行 php 檔,然後把執行完的結果丟回去

二、從前端傳資料給後端:GET 與 POST

php 與網頁前端如何交換資料 ?

瀏覽器發 request,request 有攜帶內容,內容中有一個欄位是 url,表示我請求的網址是哪一個,server 看到這個網址後,再去找尋對應的檔案,找到後執行完再回傳。

url 可以加上 query string , ?想要傳的參數,想要傳的參數格式為key = value query string 會自動存到 data.php 裡面的這個特殊的變數 $_GET

<?php
  echo 'i am angela';
  # print_r() 可以將有結構的東西印出來
  print_r($_GET); # Array ( [a] => 1 ) 印出一個 Arr 裡面 key 是 A 的值是 1
?>

要傳不同的值,可以用 &

# http://localhost/angela/a.php?a=1&b=3
<?php
  echo 'i am angela';
  # print_r() 可以將有結構的東西印出來
  print_r($_GET); #  ( [a] => 1 [b] => 3 )
?>

可以利用$_GET[key],取得用 query string 傳的參數

<?php
# http://localhost/angela/a.php?a=1&b=3
  echo 'i am angela <br>';
  echo "a:" . $_GET['a'] . '<br>';
  echo "b:" . $_GET['b'] . '<br>';
  print_r($_GET);
/*
i am angela
a:1
b:3
Array ( [a] => 1 [b] => 3 )
*/
?>

承上,我將 url 換成 http://localhost/angela/a.php?c=5,出現警告訊息
Warning: Undefined array key "a" in C:\Xammp\htdocs\angela\a.php on line 5 a: ......

<?php
# http://localhost/angela/a.php?c=34
# 如果 a 有傳進來就執行這裡面
  if (isset($_GET['a'])) {
    echo "a:" . $_GET['a'] . '<br>';
    # 原本的警告就不見了
  }
  if (isset($_GET['b'])) {
    echo "b:" . $_GET['b'] . '<br>';
    # 原本的警告就不見了
  }
  echo 'i am angela <br>';

  print_r($_GET);
/*
i am angela
Array ( [c] => 5 )
*/
?>

所以可以透過這樣的方式,從網址列傳參數到 php,php 可以利用這樣的方式拿到內容。

前端一般來說會用表單的方式。
form 有幾個參數要填,第一個 method (參照 NET101)、第二個 action,表示將表單的內容傳到哪裡去、
name 是 a.php 裡面 get 會接受到的參數,

# data.php
<form method="GET" action="a.php">
  a: <input type="text" name='a'/> 
  age: <input type="text" name='age'/>
  <input type="submit">
</form>

兩個都輸入xxx 提交後,會到這個頁面 http://localhost/angela/a.php?a=xxx&age=xxx,瀏覽器會將填的表單內容自動帶到網址列去,所以 a.php 就可以拿到我剛剛填的東西

可以在 data.php 打開 dev-tool,將 preserve.log 勾選

表單只是把參數放到網址列上面 query string 然後幫你送出。
透過表單,進行前後端溝通,只要將 method, action(送資料去的網址) 指定好即可。

小試身手

利用上述表單的方式傳遞資料。

# a.php
<?php
  if (empty($_GET['name']) || empty($_GET['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_GET['name'] . "<br>";
  echo "your age is " . $_GET['age'] . "<br>";

?>
# data.php
<form method="GET" action="a.php">
  name: <input type="text" name='name'/> 
  age: <input type="text" name='age'/>
  <input type="submit">
</form>

我也可以直接改網址列,讓他直接顯示。

現在,將 method 改成 post,發現網址列沒東西了 => a.php 抓不到任何東西 http://localhost/angela/a.php

# data.php
<form method="POST" action="a.php">
  name: <input type="text" name='name'/> 
  age: <input type="text" name='age'/>
  <input type="submit">
</form>

ev-tool => NET => Preserve log => FORM DATA 進行檢視

以 post 方式將表單的資料送到 a.php,只是目前的 a.php 沒有處理這件事情。
php 有一個 $_post 的變數,會自動儲存 FORM 傳過來的資料。

<?php
  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_POST['name'] . "<br>";
  echo "your age is " . $_POST['age'] . "<br>";


  print_r($_POST);
?>

GET 與 POST 可以混用。但不代表真正實作開發就要混用。因為混用會變得雜亂,不好維護與閱讀。

# 表單不能混用。
# data.php
<form method="POST" action="a.php">
  name: <input type="text" name='name'/> 
  age: <input type="text" name='age'/>
  <input type="submit">
</form>

method="POST" 底下,手動加上去,資料不會放進來。可以這樣修改

# 提交一個表單到這個網址,然後再帶上 post 的參數
<form method="POST" action="a.php?school=kghs">

三、從 PHP 連線到 MySQL 資料庫

前置作業、
打開 phpMyAdmin => 創一個新的使用者帳號 (打勾建立與使用者同名的資料庫,並授予所有權限;全域權限:全選) => 多了一個新的 database (新增一個 table、2個欄位) => table 中,第一個欄位(id/ int/ autoincreament)、第二個欄位(user_name/ varchar/ 長度64),編碼排序(utf8mb4_general_ci) => 儲存後產生 users 的 table

第一步、進入 php
在之前建立的 a.php 檔案中,增加下列代碼 $conn = new mysqli(server名稱, 帳號, 密碼, database名稱)

<?php
  $conn = new mysqli('localhost', 'angela', 'angela', 'angela');

  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_POST['name'] . "<br>";
  echo "your age is " . $_POST['age'] . "<br>";
  echo "your school is " . $_GET['school'] . "<br>";  
  print_r($_POST);
?>

用宣告變數的方式,讓代碼更好維護

  $server_name = 'localhost';
  $user_name = 'angela';
  $password = 'angela';
  $db_name = 'angela';
  $conn = new mysqli($server_name, $user_name, $password, $db_name);

檢查不同的錯誤訊息

db_name 錯誤

<?php
  $server_name = 'localhost';
  $user_name = 'angela';
  $password = 'angela';
  $db_name = 'angelaxx';
  // new 一個 mysql i 的 instance 出來
  // 建立連線完的東西,會回傳給 $conn 這個變數
  $conn = new mysqli($server_name, $user_name, $password, $db_name);
  // $conn 上有一個屬性叫做 connet_error
  // 物件上存取屬性是用 -> 符號,因為 . 代表字串拼接
  echo $conn -> connect_error;
  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_POST['name'] . "<br>";
  echo "your age is " . $_POST['age'] . "<br>";
  echo "your school is " . $_GET['school'] . "<br>";  
  print_r($_POST);
?>
# 顯示結果
# Warning: mysqli::__construct(): (HY000/1049): Unknown database 'angelaxx' in C:\Xammp\htdocs\angela\a.php on line 8
# Unknown database 'angelaxx'資料有缺,請再次填寫

Unknown database 'angelaxx' 是 echo $conn -> connect_error; 印出的錯誤信息;因為 php 有打開設定,所以顯示 Warning: mysqli::__construct(): (HY000/1049): Unknown database 'angelaxx' in C:\Xammp\htdocs\angela\a.php on line 8 ,若有些 php 的 server 沒有打開設定,就不會有這行,不易除錯

解決方式、自己把錯誤信息印出來

  if (!empty($conn -> connect_error)) {
    echo '資料庫連線錯誤: ' .$conn->connect_error . '<br>';
  }

更好的做法是,將 echo 換成 die(),他執行完 die 的內容,整個 php 都死掉,不會再往下執行。當資料庫錯誤,不希望程式再繼續往下執行,資料庫都死了,下面程式碼又需要用到資料庫,沒有必要這麼做,所以會用 die 讓程式將錯誤訊息輸出、並且停止在這一行。

  if (!empty($conn -> connect_error)) {
    die( '資料庫連線錯誤: ' .$conn->connect_error);
  }

可以簡化邏輯,如果$conn -> connect_error 有值(true),就 die

if ($conn -> connect_error) {
    die( '資料庫連線錯誤: ' .$conn->connect_error);
  }

通常會有很多個 php 檔都用到資料庫,所以會把連線部分分開寫。

// conn.php (連線檢查部分)
<?php 
  $server_name = 'localhost';
  $user_name = 'angela';
  $password = 'angela';
  $db_name = 'angela';
  $conn = new mysqli($server_name, $user_name, $password, $db_name);

  if ($conn -> connect_error) {
    die( '資料庫連線錯誤: ' .$conn->connect_error);
  }
?>
// a.php
<?php
  require_once('conn.php');

  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_POST['name'] . "<br>";
  echo "your age is " . $_POST['age'] . "<br>";
  echo "your school is " . $_GET['school'] . "<br>";  
  print_r($_POST);
?>

四、PHP 與 MySQL 的互動:讀取資料

補充

加上這兩行,改變 db 的設定,避免亂碼與時區不對的問題

# conn.php
<?php 
  $server_name = 'localhost';
  $user_name = 'angela';
  $password = 'angela';
  $db_name = 'angela';
  $conn = new mysqli($server_name, $user_name, $password, $db_name);

  if ($conn -> connect_error) {
    die( '資料庫連線錯誤: ' .$conn->connect_error);
  }
  # 加上這兩行,改變 db 的設定
  $conn->query('SET NAMES UTF8'); #不設定編碼,用中文會出錯
  $conn->query('SET time_zone = "+8:00"'); #為了將資料庫的時區,設成台灣時區
?>

一旦東西放到 git 上就很難完整的清掉,所以將 php 放到 git 上,請排除 connt.php,因為這裡面有 user_name, pass_word, db位置。<解決方式 gitignore>

如何在 php select MySQL 資料

$result = $conn->query("select now()");
  print_r($result);

如果 query 是錯誤的,加與不加這兩行會有甚麼結果

  require_once('conn.php');
  $result = $conn->query("select anow()");
  print_r($result);
  print_r($conn->error);

改成條件判斷

  if (!$result) {
    die($conn->error);
  }
  print_r($result);

拿資料

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

第一步、先下 Select 的 Query
第二步、檢查有無拿到結果:如果沒有拿到結果就代表有錯,有錯就把錯誤印出來底下程式碼就不要再執行;如果沒有錯,就用 fetch_assoc() 把相對應的結果拿出來,拿到 $row,$row 就是 mySql query 完的東西,根據我 select 的東西,給予我對應的陣列,他的 key 代表我 select 的東西,他的 value 代表我對應到的值。

fetch_assoc() 將讀出的資料Key值設定為該欄位的欄位名稱。

去 myAdmin users table 建立三筆資料,不用輸入 id 因為我們已經用了 A_C

  $result = $conn->query("select * from users;");
  if (!$result) {
    die($conn->error);
  }
  // print_r($result);
  $row = $result->fetch_assoc();//拿資料
  print_r($row);
  $row = $result->fetch_assoc();//拿資料
  print_r($row);
  $row = $result->fetch_assoc();//拿資料
  print_r($row);
  $row = $result->fetch_assoc();//變空了,沒有東西可以拿了
  print_r($row);

可以用迴圈拿多筆資料。
每次跑 while 前先做這件事情 $row = $result->fetch_assoc(),再判斷 $row 是不是空的,不是空的再進入 while 迴圈繼續跑,如果拿到的資料是空,就會跳出迴圈。

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

透過下 query 再利用 fetch_assoc() 把結果拉出來變成一個陣列。

 while ($row = $result ->fetch_assoc()) {
    echo 'id:' . $row['id'] . '<br>';
    echo 'user_name:' .$row['user_name'] . '<br>';
   # print_r($row);
  }

先將顯示資料功能做在首頁,data.php
目前代碼長相:

# data.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 'user_name:' .$row['user_name'] . '<br>';
   # print_r($row);
  }
?>

<form method="POST" action="a.php?school=kghs">
  name: <input type="text" name='name'/> 
  age: <input type="text" name='age'/>
  <input type="submit">
</form>
# a.php
<?php
  if (empty($_POST['name']) || empty($_POST['age'])) {
    echo "資料有缺,請再次填寫<br>";
    exit();
  }
  echo "hello" . $_POST['name'] . "<br>";
  echo "your age is " . $_POST['age'] . "<br>";
  echo "your school is " . $_GET['school'] . "<br>";  
  print_r($_POST);
?>
# conn.php
<?php 
  $server_name = 'localhost';
  $user_name = 'angela';
  $password = 'angela';
  $db_name = 'angela';
  $conn = new mysqli($server_name, $user_name, $password, $db_name);

  if ($conn -> connect_error) {
    die( '資料庫連線錯誤: ' .$conn->connect_error);
  }
  # 加上這兩行,改變 db 的設定
  $conn->query('SET NAMES UTF8'); #不設定編碼,用中文會出錯
  $conn->query('SET time_zone = "+8:00"'); #為了將資料庫的時區,設成台灣時區
?>

五、PHP 與 MySQL 的互動:新增資料

新增一個 add.php 的檔案

// a.php
<?php
  require_once('conn.php');
  // $username = 'paula'; 
  $result = $conn->query("insert into users(user_name) values('mike')");
  if (!$result) {
    die($conn->error);
  }
  print_r($result);
?>

會出現 1 => 1 就是 true 的意思,換句話說有成功 => myAdmin users 檢視,多了一個 mike => 再重新整理,還是 1 => 檢視 myAdmin users 又多了一個 mike。

將單引號拿掉 => values(mike),出現錯誤訊息 Unknown column 'mike' in 'field list' => 因為我們要新增的是字串

運用字串拼接的方式,讓寫入資料變得更 general

$username = 'paula'; 
  $result = $conn->query("insert into users(user_name) values('". $username ."')");

但,這樣真的太難看懂。
建議將 query 獨立出來,先將 query 印出來看是不是對的,再去執行他。記得除蟲完,將印出的東西刪掉。

$sql = "insert into users(user_name) values('". $username ."')";
  echo $sql;
  $result = $conn->query($sql);

更好的做法是,利用 sprintf(),第一個參數為字串,字串內將動態塞入的地方變成 %s %d,後面的參數依序為 place holder 的值。

// 使用 sprintf() 可以較好的格式化字串
$username = 'amy';
  $sql = sprintf(
    "insert into users(user_name) values('%s')",
    $username
  );

可以動態塞入多項,
底下先不執行,單看 query 的結果

  $username = 'amy';
  $sql = sprintf(
    "insert into users(id, user_name) values(%d, '%s')",
    15,
    $username
  );
/*字串拼接的結果
insert into users(id, user_name) values(15, 'amy')
*/

小試身手

  1. 透過 POST 拿 user_name 的參數,如果沒有就顯示錯誤訊息並且結束
  2. 如果有,就指定給 username 的變數
  3. 用動態帶進來的 username 組成 sql query,印出來然後執行
  4. 如果有錯,就顯示錯誤並且結束;如果沒有錯,就顯示新增成功。

mySQL Auto increament 加一是按照目前最大值加一,如果把中間 ID 刪掉,他不會重用。所以不要預期,Auto increament 就會 cts。如果想對 id 排序,可以在 data.php 加上 $result = $conn->query("select * from users order by id;");,若想由小到大排,可以再 id 後面加上ASC,反之由大到小DESC。大小寫都可以,但還是建議 sql query 用大寫。

// data.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 'user_name:' .$row['user_name'] . '<br>';
  }
?>
<h2>新增 user</h2>
<form method="POST" action="add.php">
  user_name: <input type="text" name='user_name'/>
  <input type="submit">
</form>
// add.php
<?php
  require_once('conn.php');
  if (empty($_POST['user_name'])) {
    die('請輸入 user_name');
  }
  $username = $_POST['user_name'];
  $sql = sprintf(
    "insert into users(user_name) values('%s')",
    $username
  );
  echo 'SQL: ' . $sql . "<br>";
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }
  echo "新增成功!";
?>

每次新增完,要再手動回 data.php,很麻煩!我們可以加上連結

// add.php
<a href="data.php">go back</a>

或者可以加上 header,跳轉太快中間畫面甚至沒有顯示到

// 他會自動幫我跳轉到 data.php
echo "新增成功!";
// 回傳一個 response header
header('Location: data.php');

到 phpMyAdmin 結構將 user_name 設獨一,就不會有重複的 user_name。建立重複的 user_name 會出現 Duplicate entry 'aaa' for key 'user_name'

  echo 'SQL: ' . $sql . "<br>";
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error); // 錯誤訊息是在這邊執行
  }

他執行的 query 有錯,有錯的話 result 就會是 false,代表他執行結果出錯,我就把 connection 的 error 印出。

檢視檔案進行錯誤處理

  1. 檢查 user_name
  2. 判斷 sql query 有無執行成功 => 若執行成功,就輸出 header,自動返回到 data.php

可以打開 dev-tool 檢視流程,preserve log 要打勾,若不勾他只會記住現在最新頁面的 log,不會紀錄中間頁面的跳轉。

六、PHP 與 MySQL 的互動:刪除資料

直接在瀏覽頁面,印 delete 的按鈕

用 get 的方式將 id 帶入 delete.php 這個檔案

# data.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'];
    echo '<a href="delete.php?id='.$row['id'].'">刪除<a/>';
    echo '<br>';
    echo 'user_name:' .$row['user_name'] . '<br>';
  }
?>
<h2>新增 user</h2>
<form method="POST" action="add.php">
  user_name: <input type="text" name='user_name'/>
  <input type="submit">
</form>
# delet.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: ' . $sql . "<br>";
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }
  echo "刪除成功!";
  header('Location: data.php');
?>

id 最高只到20,我複製連結 http://localhost/angela/delete.php?id=200,出現 SQL: delete from users where id = 200,刪除成功!

query 的確有執行成功,只是我沒有 id = 200 的內容 => 影響了 0 列。

可以在 php 中抓到影響 1 列這個資訊。affected_rows => 被影響的 rows 有幾列。因此,我們依據最後影響幾列,來判斷是否刪除成功。

  if ($conn->affected_rows >= 1) {
    echo '刪除成功';
  } else {
    echo '查無資料';
  }

完整代碼、

# 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: ' . $sql . "<br>";
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }
  if ($conn->affected_rows >= 1) {
    echo '刪除成功';
  } else {
    echo '查無資料';
  }
  //header('Location: data.php');
?>

通常刪除會用 post 不會用 get,用 post 的話要改成表單形式來做參數。

七、PHP 與 MySQL 的互動:編輯資料

於 data.php 新增表單

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

找到 id 的資料,設定 user_name,要加 where 指定你要設定的範圍

// update.php
<?php
  require_once('conn.php');
  if (empty($_POST['id']) || empty($_POST['user_name'])) {
    die('請輸入 id 與 user_name');
  }
  $id = $_POST['id'];
  $user_name = $_POST['user_name'];
  $sql = sprintf(
    "update users set user_name='%s' where id=%d",
    $user_name,
    $id
  );
  echo 'SQL: ' . $sql . "<br>";
  $result = $conn->query($sql);
  if (!$result) {
    die($conn->error);
  }
  if ($conn->affected_rows >= 1) {
    echo '編輯成功';
  } else {
    echo '查無資料';
  }
  //header('Location: data.php');
?>

CRUD 結語

create, read, update, delete 後端重要的四大功能。每一個網站,都只是這四大功能變得更複雜一點。


#back-end #PHP #crud







Related Posts

Frontend Mentor 切版練習平台

Frontend Mentor 切版練習平台

為 localStroage 加上過期時間

為 localStroage 加上過期時間

[ 筆記 ] JavaScript - npm 套件管理工具

[ 筆記 ] JavaScript - npm 套件管理工具


Comments