MySQL 新增使用者&設定權限

新增:

mysql > CREATE USER '帳號'@'連線位置' IDENTIFIED BY '密碼';

設定權限:

mysql > GRANT 權限 ON db.table TO '帳號'@'連線位置';

連線位置:

%:完全開放
localhost : 本機
8.8.8.8:IP

權限:

ALL PRIVILEGES : 全開
SELECT,INSERT,UPDATE,DELETE,CREATE : 指定權限

套用權限:

mysql > FLUSH PRIVILEGES;

常用指令:

mysql > CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'dbpassword';
mysql > GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'localhost';
mysql > FLUSH PRIVILEGES;

mysqli_insert_id 取得最後寫入資料的ID

我們在寫入資料時常常會需要剛 Insert 資料的 ID 來與其他的 Table 做關聯
ID 必須要是一個 AUTO_INCREMENT 欄位,不然會取不到資料
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

以下為程式範例:

$sql = "INSERT INTO table_name (column1, column2, column3)
        VALUES ('value1', 'value2', 'value3')";

if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    echo '剛寫入的資料ID: ' . $last_id;
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

我則是習慣改寫一個 Insert Function,在寫入時直接回傳 ID
也加了一個 $is_return 的參數來判斷是否要回傳ID
在不需要回傳ID的大量寫入時可以使用

$servername = "localhost";
$username = "username";
$password = "password";

// 建立連線
$conn = mysqli_connect($servername, $username, $password);

// 檢查連線若錯誤顯示訊息
if (!$conn) {
    die("連線失敗: " . mysqli_connect_error()); 
}
$sql = "INSERT INTO table_name (column1, column2, column3)
        VALUES ('value1', 'value2', 'value3')";

$last_id = insert_data($conn,$sql,'Y');
echo '剛寫入的資料ID: '.$last_id;

function insert_data($conn,$sql,$is_return=''){
    if (mysqli_query($conn, $sql)) {
        if($is_return) return mysqli_insert_id($conn);
    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }
}

PHP Insert MySQL 寫入資料

MySQL有2種寫入方式

SQL標準語法:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...);

MYSQL專用語法:
INSERT INTO table_name SET
       column1 = value1,
       column2 = value2,
       column3 = value3;
主要差別在標準語法在其他DB也能使用,並且可以一行SQL指令批次寫入多筆資料
INSERT INTO table_name (a,b,c) VALUES
       (1,2,3),(4,5,6),(7,8,9);

而 SET 的語法則是只能用在MySQL上,個人比較習慣用這種
優點是好閱讀跟維護,不容易把資料塞錯格
而且在做UPDATE時可以直接共用

PHP 物件寫法 ( MySQLi Object-Oriented ):

$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";

if ($conn->query($sql) === TRUE) {
    echo "寫入成功";
} else {
    echo "寫入失敗: " . $sql . "<br>" . $conn->error;
}

PHP 程序式寫法( MySQLi Procedural ):

$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";

if (mysqli_query($conn, $sql)) {
    echo "寫入成功";
} else {
    echo "寫入失敗: " . $sql . "<br>" . mysqli_error($conn);
}

PHP 連接 MySQL 資料庫

物件 ( MySQLi Object-Oriented ):

<?php
$servername = "localhost";
$username = "username";
$password = "password";

// 建立連線
$conn = new mysqli($servername, $username, $password);

// 檢查連線若錯誤顯示訊息
if ($conn->connect_error) {
    die("連線失敗: " . $conn->connect_error);
}
echo "連線成功";
?>

程序式( MySQLi Procedural ):

<?php
$servername = "localhost";
$username = "username";
$password = "password";

// 建立連線
$conn = mysqli_connect($servername, $username, $password);

// 檢查連線若錯誤顯示訊息
if (!$conn) {
    die("連線失敗: " . mysqli_connect_error()); 
}
echo "連線成功";
?>
一般系統出錯時不建議將錯誤訊息直接顯示,建議透過Mail的方式將錯誤訊息回報給工程師
錯誤Mail回報:http://www.gocar.idv.tw/archives/40