PHP 和 MySQL 的互動 1 : 連線


Posted by tzutzu858 on 2020-09-03

概述: 連線 --> query(SQL) --> 讀取

step 0. 連線不要直接寫在程式碼,用另一個檔案來連

可以另外用一個檔案來寫連接,php 檔案加個 require_once('conn.php'); 就可以了

include、require、include_once、require_once 的差別

  • 相同 :
    都是引入或匯入檔案

  • 差別 :
    後面有 once 的就是只有匯入一次,如果沒有使用後面有 once ,那可能會將同一個檔案匯入兩次,便會發生錯誤

而 include 和 require 的差別在於,include 的檔案沒有被找到,程式依舊會執行,所以像是留言板作業,我們要匯入資料庫的帳號密碼,由於一定要匯入所以使用 require,同時也避免重複輸入造成錯誤,所以會使用 require_once '檔案名稱';


安全性問題 : 如果放的程式有帳密,一旦放到 git 很難真的清乾淨,所以建議要把 conn.php 這個檔案放到 .gitignore

補充說明 : 同學把有帳密的檔案 push 到 GitHub 上面,解決後寫一篇[ 狀況題 ] 如何徹底將檔案從 Git 中移除?,跟之前另一個同學想要找回消失的 commit 剛好相反 : 刪除了 branch 將 commit 資料也刪除了~怎麼辦!!!

我......好像也做過一樣的蠢事過 Orz

step 1. connection : mysqli()連 IP 帳密和 table --> 屬性 query 設定編碼和時間

物件存取屬性是用 -> 來表示
mysqli->query : 對資料庫執行一次查詢

// conn.php 檔
<?php
$server_name = 'localhost';
$username = 'huli';
$password = 'huli';
$db_name = 'huli';

$conn = new mysqli($server_name, $username, $password, $db_name);
// conn 為 connection 的簡寫,第一個參數是 server 名稱,第二個是帳號,第三個是密碼,第四個是 database
if ($conn->connect_error) { // 物件存取屬性是用 -> 來表示
  die('資料庫連線錯誤:' . $conn->connect_error);
}

//連線完要加上下面這兩行,編碼跟時區比較不會有問題
$conn->query('SET NAMES UTF8'); // 設定編碼
$conn->query('SET time_zone = "+8:00"'); // 設定台灣時間
?>

以下出自於這篇文章 : https://www.itread01.com/content/1543564392.html

什麼是 mysqli

PHP-MySQL 函式庫是 PHP 操作 MySQL 資料庫最原始的擴充套件庫,PHP-MySQLi 的 i 代表 Improvement ,相當於前者的增強版,也包含了相對進階的功能,另外本身也增加了安全性,比如可以大幅度減少 SQL 注入等問題的發生。

mysql 與 mysqli 的概念相關

(1)mysql 與 mysqli 都是 php 方面的函式集,與 mysql 資料庫關聯不大。

(2)在 php5 版本之前,一般是用 php 的 mysql 函式去驅動 mysql 資料庫的,比如mysql_query()的函式,屬於面向過程

(3)在php5版本以後,增加了 mysqli 的函式功能,某種意義上講,它是 mysql 系統函式的增強版,更穩定更高效更安全,與 mysql_query()對應的有 mysqli_query(),屬於面向物件,用物件的方式操作驅動mysql資料庫。

mysql 與 mysqli 的主要區別

(1)首先兩個函式都是用來處理 DB 的。

(2)mysqli 連線是永久連線,而 mysql 是非永久連線。什麼意思呢? mysql 連線每當第二次使用的時候,都會重新開啟一個新的程序,而 mysqli 則只使用同一個程序,這樣可以很大程度的減輕伺服器端壓力。

(3)mysqli 封裝了諸如事務等一些高階操作,同時封裝了 DB 操作過程中的很多可用的方法。應用比較多的地方是 mysqli 的事務。


step 2. query (SQL 語句)後用 fetch_assoc() 讀取資料

在SQL的資料讀取中,有三種不同的函數可以使用,分別是:

  1. fetch_array():將讀出的資料同時以數字與欄位名稱各自存一次在陣列之中,相當於同一個值會出現兩次。
    array(
      [0] => 'hi'
      [say] => 'hi'
      [1] => 'tzutzu'
      [Name] => 'tzutzu'
    )
    
  2. fetch_assoc():將讀出的資料Key值設定為該欄位的欄位名稱。
    array(
      [say] => 'hi'
      [Name] => 'tzutzu'
    )
    
  3. fetch_row():將讀出的資料Key值設定為依序下去的數字。
    array(
      [0] => 'hi'
      [1] => 'tzutzu'
    )
    

文章參考 :

  1. [PHP][MySQL] 從MySQL取得資料 – fetch_array、fetch_assoc、fetch_row
  2. PHP MySQLi Functions : MySQLi 蠻多方法的,下面放上程式碼會用到的三個方法
  3. mysqli query() performs a query against a database.
  4. mysqli error() returns the last error description for the most recent function call, if any.
  5. mysqli fetch_assoc() Fetch a result row as an associative array
<?php
require_once('conn.php');

  $result = $conn->query("SELECT * FROM users");  
  // 也可以寫 $result = mysqli_query($conn,"SELECT * FROM users");
  if (!$result) {
    die($conn->error);
  }

  while ($row = $result->fetch_assoc()) {
    echo "id:" . $row['id'] . '<br>'; // 就像是把物件的 key 拿出來,印出 key 的 value
    echo "username:" . $row['username'] . '<br>';
  }
?>

在 php5 版本以後,增加了 mysqli 的函數功能,某種意義上講,它是 mysql 系統函數的增強版,更穩定更高效更安全,與mysql_query() 對應的有 mysqli_query(),屬於面向對象,用對象的方式操作驅動 mysql 數據庫











Related Posts

OOP - 1 寫在前面

OOP - 1 寫在前面

Javascript replace space with regex

Javascript replace space with regex

HTB Forest Walkthrough

HTB Forest Walkthrough


Comments