[BE101] PHP 與 MySQL (前言)


Posted by s103071049 on 2021-06-08

環境建置 XAMPP

如何改檔案?

Apache => config => browse php => 到上一層 xampp folder => find htdoc => 這套軟體的 php 檔案都會存放在 htdoc folder 中

現在,在 htdoc folder 中新增資料夾,在資料夾中新增 php 檔案。對新增的 a.php 檔案最編輯,然後在 http://localhost/angela/a.php 檢視相對應的內容。有出現,表示我們的 server 有正確地跑起。

預設的 XAMPP 網址路徑就會是在 htdoc 之後的檔案路徑。網址與檔案結構是對應的。請注意:其他框架、程式語言的預設可能不是長這樣,這只是這套預設,不是所有伺服器都長這樣子

一、PHP 基礎

雖然副檔名是 php,但隨便打一些東西存檔,重新整理會發現,沒有用到 php 的情況下,打甚麼就是甚麼。

//我們可以在檢視網頁原始碼看到原本打的相關內容
aaaaaaaaaaaaa
xcvxvw
<h1>sss</h1>
echo "123";

要寫 php 程式碼,要用 php 標籤將程式碼包在裡面,區塊內的東西,才會被 php 執行與輸出。

<?php
  echo '123';
?>

檢視原始碼會發現,多出 123 ,原因是他執行了 php 標籤中的代碼,並將 123 給返回。另外,盡量不要用簡寫 <? ?> 因為某些 server 不支援,會造成除錯上的困難,有些甚至連錯誤訊息都沒有。

基本語法

一、php 標籤

<?php
?>

二、每行結尾要加分號

三、輸出 => echo
輸出的內容可以是 html 代碼。檢視原始碼,輸出的內容是你寫的內容,瀏覽器呈現的樣子有 h2 的效果。

<?php
  echo "<h2>我我我我</h2>";
?>

四、變數宣告/變數 => $

<?php
  $a = 'aaaaa';
  echo $a;
?>

五、字串拼接 => .

<?php
  $a = 'i love u ';
  $b = 'bazinga';
  echo $a . $b;
?>

六、if/else => 同 JS

<?php
  $score = 2;
  if ($score >= 60 ) {
   echo 'pass';
  } else {
    echo 'fail';
  }
?>

七、迴圈
要注意,所有的變數都要錢字號開頭

換行沒用,最後通通變成空白,檢視原始碼是有換行成功,但因為輸出環境是瀏覽器,在 html 的解析底下,多個換行會解讀為空白。

<?php
  for ($i=1; $i<=10; $i++) {
    echo $i . "\n";
  }
?>

解決方式,用 br 標籤。畫面經瀏覽器渲染後,呈現換行。

<?php
  for ($i=1; $i<=10; $i++) {
    echo $i . "<br>";
  }
?>

八、array

<?php
  $arr = array("apple", 2, 3, 4, 100); // 宣告陣列
  echo $arr[0] . "<br>"; // 取到第一個元素
  echo $arr[sizeof($arr) - 1] . "<br>"; // 印出最後一個元素
  echo "length:" . sizeof($arr) . "<br>" //用 sizeof 取得 arr 長度 
?>

Warning: Array to string conversion (echo 輸出要將 arr 轉成 string)

<?php
  $arr = array("apple", 2, 3, 4, 100); // 宣告陣列
  echo $arr
?>

我們可以利用這兩個 funct,兩個選一個就可以了。
var_dump 會將每個變數的型態與值給印出來 => 可以檢視複雜的資料結構

<?php
  $arr = array("apple", 2, 3, 4, 100); // 宣告陣列
  var_dump($arr) // array(5) { [0]=> string(5) "apple" [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(100) }
?>

print_r 輸出結果較簡潔,不會顯示 type

<?php
  $arr = array("apple", 2, 3, 4, 100); // 宣告陣列
  print_r($arr);
?>

九、funct

<?php
  function add($a, $b) {
    return $a + $b; 
  }
  echo add(1, 3);
?>

小結

  1. 變數前面必加 $
  2. 敘述句每一行結尾要加 ;
  3. 要印出 arr 或是非數字與字串的資料型態,請用 var_dump() 或 print_r(),才能把整個完整的資料給印出來
  4. 字串拼接是用 . 而不是用 +

Apache 與 PHP 原理簡介

跑一遍整個 php 的流程,從頭到尾是怎麼一回事 ?

request => php => response
但其實,不是這個樣子。

事實上,request => Apache => php => output => Apache => response
( request 送到 Apache 這個 server 去,這個 server 把東西送到 php,php 產生要輸出的 html,html 再回到 Apache,最後再變成 response 回來。)

裡面最重要的角色是 Apache,我們可以這樣想,這個 Apache 可能有一個叫做 run 的 funct,funct 裡接收 request。php 在裡面的工作,只負責把 request 幫我轉成我要輸出的形式。所以我們在跑 serve除了 php 以外還有其他檔案,例如:index.html, index.js, index.css,這些其他檔案,都是 Apache 這個 server 幫我們處理好的。

apache 
function run(request) {
   response = php(request)
   send response
}

可以在 git bash 中輸入 php 檔名 檢視,被 php 轉換後的輸出。可以想像成 Apache 幫我run php 的指令,把 php 輸出的東西當作 response 傳回去。

request => Apache => php => output => Apache => response
如果 apache 掛掉,那我甚麼都不能做;如果 php 掛掉傳回來的都會是錯誤訊息,

跑 php / 瀏覽大部分網站發現 url 與資料夾結構是相同。這個東西是可以藉由 server 設定。換句話說,網址的規則由 server 決定,大部分 server 預設的規則以某個資料夾為基礎,裡面按照檔案目錄的結構,有種直接存取檔案的感覺。

server 其實就是一個程式,只不過他是專門處理 request and response。

function server(request) {
   ......
   return response;
}

(註)
mySQL:資料庫有關
Apache:server 有關
proFPT:FTP 有關

小結

  1. apache 這個 server 做的事情是將 request 拿進來,丟到 php,然後拿回 output,然後再傳回去。
  2. 網址的規則由 server 決定。
  3. server 決定 request 丟到哪。以 xampp 而言,預設路徑為何 request 就丟去哪

二、資料庫基礎

前言

讀進來的資料可以存在變數或記憶體內,可是一旦把這些程式關掉,資料就沒了。為了解決資料可以被永久保存,可以透過存檔,把資料讀進來存到檔案裡,下次就可以再讀進來,就算重開機只要硬碟在,檔案就不會不見。

但自己處理資料,很沒效率,要自己做格式處理,找資料也要一筆一筆地找。為了克服檔案存取的限制,資料庫系統誕生了。

資料庫系統底層仍然是存在 io 硬碟,只是檔案格式不太一樣,我不需要在意底層如何存取。資料庫系統提供了友善的介面、指令、程式語言,我可以透過資料庫系統的程式語言去存撈資料,去操縱資料。

不同資料庫,底下有不同資料庫實作,不同資料庫實作底下又有不同的 engine

資料庫類型

一、關聯式資料庫(relational database)
將不相關的資料放在不同的 table,將同樣類型的資料放在同一個 table,可以藉由相同的欄位進行 pointer。也就是,可以藉由這兩個 table 的關聯,來獲得我所有需要的資料。

關聯資料庫程式語言:sql,專門用來查詢關聯式資料庫裡面的資料的語言。

關聯式資料庫是統稱,底下真正實作的資料庫有 mySQL, postgreSQL, MSSQL
小結、關聯式資料庫,透過關聯存拿資料;也透過關聯將資料切分更明確。

二、NoSQL (NOT ONLY SQL)
關聯式資料庫有一定的資料型態,例如:字串、數字。NOSQL 的資料庫中,會將資料存成物件或式 JSON 格式。比較沒有結構的概念。

NoSQL 是統稱,底下真正實作的資料庫有 mongoDB

// 類似長相
{
   score: [1, 2, 3],
   student : {
      name: 'aaa'
   }
}

使用時機:存取 LOG 。
差異
資料庫系統,是一個程式,專門處理資料的程式。
server,是一個程式,專門處理 request 跟 response 的程式。

如何管理資料庫?

一、CLI:以指令作為連結

二、GUI:phpMyAdmin(資安疑慮), Adminer, Sequel Pro
(有人寫好一整套 php 網頁,來管理資料庫。底層仍然是下指令操縱系統,只不過以圖形介面方便管理)


Table 表格基礎

Table schema 簡介

schema(結構),每一個表格都有一個結構,這個結構稱之為資料庫的 schema。

結構屬性:

  1. 名稱(欄位的key)
  2. 型態:通常較小的字,會存成 varchar
  3. 編碼排序:未設定好,會存成亂碼。通常是 DB 設定好,其他不動
  4. 空值:能否允許
  5. 預設值:current_times 資料庫紀錄時間
  6. 屬性:unsigend(不會是負數)
  7. 索引
  8. A_I:自動增加,保證遞增所以可以保證 id 值唯一,但不保證連續

資料一定要按照資料庫結構放入,才能建立。不然資料庫會以資料型態不符合將你擋住,東西會寫不進去。

細節

主鍵(PK):PK 是 Table 中最重要的欄位,不設定也可以。
(設定為主鍵的欄位,需要滿足一定條件)

  1. 不能為空
  2. 不能重複

唯一:資料庫會設定這個欄位不能重複。可以防禦他人寫入重複 data。

索引(index):可以從索引快速定位想要找的資料。當我建立索引,我會有一些額外的開銷,會需要建立的時間、耗費資料庫的空間,但換來的是查詢較快。index 可以是復合的欄位,例如:我可以將使用者名稱和密碼建在一起,每次查詢就查這兩個的組合。

更深的應用:google










Related Posts

初見狀態管理工具 Vuex (3) Mutations、Actions

初見狀態管理工具 Vuex (3) Mutations、Actions

【Day01】The Shell(上)

【Day01】The Shell(上)

Java 學習筆記 13 – 陣列物件

Java 學習筆記 13 – 陣列物件


Comments