[PHP]MySQL Temporary Table

function create_tmp_table($tmp_table,$tmp_col){
	drop_tmp_table($tmp_table); // 使用前先刪除
	$sql_str = '';
	foreach($tmp_col AS $k => $v){
		$sql_str .= "$k $v,";
	}
	$sql = "CREATE TEMPORARY TABLE $tmp_table ( 
			ID INT NOT NULL AUTO_INCREMENT,
			$sql_str
			tmp_create_time datetime,
			PRIMARY KEY(ID)
		)"; //建立暫存table
	$result  = mysqli_query($conn,$sql);
}

function ins_tmp_table($tmp_table,$arr){
	foreach($arr AS $k => $v){
		$sql_str .= "$k = '$v',";
	}
	$sql = "INSERT INTO $tmp_table  SET $sql_str tmp_create_time = NOW()";
	$result  = mysqli_query($conn,$sql);
}

function drop_tmp_table($tmp_table){
	$sql = "DROP TEMPORARY TABLE IF EXISTS $tmp_table "; 
	$result  = mysqli_query($conn,$sql);
}
$tmp_table = 'tmp_tablename'; // 前面要加 tmp_,避免誤刪正式table
$tmp_col = array( // 設定欄位
	'col1' => 'varchar(20)',
	'col2' => 'varchar(10)',
	'the_time' => 'datetime'
);
create_tmp_table($tmp_table,$tmp_col);
$arr[col1] = 'hello';
$arr[col2] = 'world';
$arr[the_time] = 2019-01-01 00:00:00;
ins_tmp_table($tmp_table,$arr); // 寫入臨時表
/*
SELECT * FROM tmp_table 
*/
drop_tmp_table($tmp_table); // 用完記得要刪除

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