瀏覽作者:

Victor

哈囉!

INSERT INTO

以下為MySQL資料表插入資料關鍵字INSERT INTO SQL語法


INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

一次插入多筆資料

INSERT INTO table_name  (field1, field2,...fieldN)  VALUES  (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;

查詢資料 SELECT

資料庫真正的價值來了!在茫茫大海的有用資料中,查詢資料找出自己想要的結果。

以下就是查詢的方法主要格式,有很多可選參數。

SELECT column_name,column_name, column_name
FROM table_name
[WHERE Clause][ WHERE Clause ]
[LIMIT N][ OFFSET M][ LIMIT N ][ OFFSET M ]

最簡單的實作開始查詢所有資料,如下所示這就是從animals 資料表中拿出「所有」的資料。

SELECT * FROM animals;

「*」星號這個通配符號,可以到表所有欄位,如上簡單的範例表示將所有animals欄位撈出來,亦可指讀取某些欄位就好,假設有很多欄位中,我只需要 name 名稱、age 年齡的話,SQL語法如下

SELECT name, age FROM animals;

LIMIT 限制條件

非常重要,如果animals資料表中沒有什麼資料全部印出來沒有關係,但建議盡可能養成習慣,減少直接撈出所有。

SELECT * FROM animals LIMIT 100

如上所示加上LIMIT關鍵字,並且街上一個數字100,表示從資料表animals中撈出資料最多100筆。

OFFSET 略過

所有的資料裡面假設前幾筆資料不想要撈出來可以使用這個關鍵字,有以下兩種設定方法,都代表animals 資料表中前10筆資料略過以後最多撈出100資料。

SELECT *
FROM animals
LIMIT 10, 100

以下寫法也是相同效果。

SELECT *
FROM animals
LIMIT 100 OFFSET 10

Delete vs Truncate vs Drop

這幾個關鍵字都是只要刪除、清空的意思差別在此釐清一下。

  1. drop 資料表完成刪除,包含結構跟內容,如果你想要資料表時可以使用。
  2. truncate  保留資料表的欄位結構,但清空裡面的資料。
  3. delete 保留資料表的欄位結構,一樣可以刪除全部資料(與truncate有一些不同)或部分符合你設定條件的資料。

舉例:

刪除 animals 資料表,執行以後資料庫裡面將不再看到animals資料表

drop table animals;

delete 比較常使用在刪除部分符合條件的資料,執行後資料庫一樣會有animals 資料表,但符合where篩選條件的資料會刪除。如下所示animals 資料表 id 欄位小於等於 500刪除掉。

delete from animals where id <= 500;
DELETE 亦可用於清空資料表,但效能方面比下面要介紹的truncate差,如下所示不加入 WHERE 篩選條件即可,清空資料表資料,如好所示使用DELETE 清空 animals 資料表。
delete from animals;

truncate 清除表內資料,保留資料表的結構,如下範例一樣是清空資料表。

truncate table animals; 

詳細比較truncatedelete清空資料。

資料表內如果有自動遞增ID(插入資料時id欄位自動加1的欄位),該欄位使用truncate 清空以後再重新插入資料將重新開始id再由1開始慢慢遞增,如果使用delete 原本最後的ID是1000的話,使用delete 清空完資料以後再次插入資料,ID會由1001開始,不會重新由1開始。

可以知道的是truncate 完整釋放硬碟空間,delete 則視底層版本不同,會釋放或不會釋放硬碟空間,也就是使用Delete 如果是用在MySQL這個資料庫有可能會有兩種情況發生。

刪除資料表

使用這個SQL語法請警慎小心,刪除後資料表會整個移除,包含該資料表的資料

DROP TABLE 資料表名稱;

刪除資料庫

刪除資料庫這個SQL請小心使用,因為執行以後指定的資料庫所有資料皆會消失。

PostgreSQL 、 Mysql 皆相同

DROP DATABASE 欲刪除資料庫名稱;

建立資料表

CREATE TABLE 資料表名稱 (欄位 欄位類別);

PostgreSQL 實際撰寫SQL有點不相同

PostgreSQL

CREATE TABLE IF NOT EXISTS scores (
   id serial PRIMARY KEY,
   grade INT NOT NULL,
   name VARCHAR(50) NOT NULL,
   score INT NOT NULL,
   PRIMARY KEY (id),
);

MySQL

以下建立一個年級、姓名、分數資料表

CREATE TABLE IF NOT EXISTS `scores`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `grade` INT NOT NULL,
   `name` VARCHAR(50) NOT NULL,
   `score` INT NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

參考

https://www.postgresql.org/docs/13/sql-createtable.html

https://www.postgresqltutorial.com/postgresql-create-table/

2021 面試紀錄-2

草稿

這間有載明不能分享邏輯題目,但其他的應該可以 所以我也打算不載明哪間公司

基本上就是紙本測驗邏輯,邏輯這種東西,我今天才知道不能有自己的意識,要依照他前面的敘述判斷他的對錯,只是側邏輯,不要加入自己的認知。

PHP機上考試 面試通知只有說PHP但還是有考SQL 但對我來說還蠻簡單的,但沒有辦法實際執行確認。

PHP題目基本上就是基本的兩題實作提,依照敘述完成還算簡單,但有一提我沒有答因為我沒寫完,但我已夢到的方式稍微修改一下在下面簡單實作一次

接著就是一些問答題,主要就是設計模式,還有資安方面的簡單答覆

PHP 問設計原則SOLID,這本書在 使用LARAVEL 8 PHP主流框架打造RESTFUL API(IT邦幫忙鐵人賽系列書) 有簡單提到 SOLID ,基礎在於新手入門,說已只有簡單提一下,這邊寫一片SOLID 簡單敘述給大家看 https://www.vnewin.com/solid-introduction/

資安方面問常見攻擊 XSS以及SQL Injection之前有買過資安線上課程,所以有一點印象

主管的面談的方面,我覺得都還不錯,主要都是花時間在找你想做什麼,並且在他們腦袋裡想要把我放在哪

人資的部分面談主要就是希望可以認識我,並了且擬人資表上面填寫的內容,發表他的疑問請盡情跟他聊天

後來又有一個主管,主要想問我為什麼前一份工作為什麼要離職,離職原因,聊的過程中我找到了真正的原因,還不錯。

但說老實的在徒步環島的過程中,我遇到一些人,他跟我的建議我現在決定在好好思考一下。

這次面試有很多對於面試的心得,我先準備接下來安排的面試 ,日後再看看哪些有拿到 入場券

Laravel 輔助函數 – Array篇

以下對每個方法做自我理解的解釋,皆會擷取官網範例,更佳釐清方法用法。

陣列

Arr::accessible 檢查參數是不是陣列或Collection

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;

$isAccessible = Arr::accessible(['a' => 1, 'b' => 2]);

// true

$isAccessible = Arr::accessible(new Collection);

// true

$isAccessible = Arr::accessible('abc');

// false

$isAccessible = Arr::accessible(new stdClass);

// false

Arr::add([array],[key],[value]) 陣列中如果第二個傳入參數key值,如果「不存在」或 key 的值為 null 寫入陣列

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;

$isAccessible = Arr::accessible(['a' => 1, 'b' => 2]);

// true

$isAccessible = Arr::accessible(new Collection);

// true

$isAccessible = Arr::accessible('abc');

// false

$isAccessible = Arr::accessible(new stdClass);

// false

Arr::collapse 將多個陣列合併成一個

use Illuminate\Support\Arr;

$array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

// [1, 2, 3, 4, 5, 6, 7, 8, 9]

Arr::crossJoin 這叫笛卡兒積,返回所有陣列

use Illuminate\Support\Arr;

$matrix = Arr::crossJoin([1, 2], ['a', 'b']);

/*
    [
        [1, 'a'],
        [1, 'b'],
        [2, 'a'],
        [2, 'b'],
    ]
*/

$matrix = Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II']);

/*
    [
        [1, 'a', 'I'],
        [1, 'a', 'II'],
        [1, 'b', 'I'],
        [1, 'b', 'II'],
        [2, 'a', 'I'],
        [2, 'a', 'II'],
        [2, 'b', 'I'],
        [2, 'b', 'II'],
    ]
*/

Arr::divide 陣列返回一個二維陣列,將key 以及 value 拆成兩個陣列,如下範例

use Illuminate\Support\Arr;

[$keys, $values] = Arr::divide(['name' => 'Desk']);

// $keys: ['name']

// $values: ['Desk']

Arr::dot 函數會把多為陣列中的key 平鋪成一為陣列,新的陣列將使用「.」符號來表示階層

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

$flattened = Arr::dot($array);

// ['products.desk.price' => 100]

Arr::except 移除某個鍵值元素,如下範例將price刪除

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$filtered = Arr::except($array, ['price']);

// ['name' => 'Desk']

Arr::exists 如下所示,檢查陣列中是否有 name 或 salary 鍵值的存在

use Illuminate\Support\Arr;

$array = ['name' => 'John Doe', 'age' => 17];

$exists = Arr::exists($array, 'name');

// true

$exists = Arr::exists($array, 'salary');

// false

Arr::first 返回陣列第一個元素

use Illuminate\Support\Arr;

$array = ['name' => 'John Doe', 'age' => 17];

$exists = Arr::exists($array, 'name');

// true

$exists = Arr::exists($array, 'salary');

// false

Arr::flatten 將多為陣列的值全部取出,並且平鋪成一維陣列

use Illuminate\Support\Arr;

$array = ['name' => 'John Doe', 'age' => 17];

$exists = Arr::exists($array, 'name');

// true

$exists = Arr::exists($array, 'salary');

// false

Arr::forget 傳入一個陣列以及字串,字串使用「.」的方式表階層,將陣列中的對應階層移除。

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::forget($array, 'products.desk');

// ['products' => []]

Arr::get 傳入一個陣列以及字串,字串使用「.」的方式表示階層,用這樣的方式方面取出對應的值以可以指令預設值。

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

$price = Arr::get($array, 'products.desk.price');

// 100

$discount = Arr::get($array, 'products.desk.discount', 0);

// 0

Arr::has 函數使用「.」方式表示陣列階層,確認陣列中是否有存在該階層的值,可以一比對兩個,「皆存在」才會顯示 true。

use Illuminate\Support\Arr;

$array = ['product' => ['name' => 'Desk', 'price' => 100]];

$contains = Arr::has($array, 'product.name');

// true

$contains = Arr::has($array, ['product.price', 'product.discount']);

// false

Arr::hasAny 如上檢查陣列是否有對應的鍵值存在,「任一個」存在就回傳 true

use Illuminate\Support\Arr;

$array = ['product' => ['name' => 'Desk', 'price' => 100]];

$contains = Arr::hasAny($array, 'product.name');

// true

$contains = Arr::hasAny($array, ['product.name', 'product.discount']);

// true

$contains = Arr::hasAny($array, ['category', 'product.discount']);

// false

Arr::isAssoc 判斷陣列的key 有設定自訂鍵值,如果為預設的鍵值將回傳false

use Illuminate\Support\Arr;

$isAssoc = Arr::isAssoc(['product' => ['name' => 'Desk', 'price' => 100]]);

// true

$isAssoc = Arr::isAssoc([1, 2, 3]);

// false

$isAssoc = Arr::isAssoc(["0" => 'a', "1" => 'b', "2" => 'c'])); 

// false

$isAssoc = Arr::isAssoc(["1" => 'a', "0" => 'b', "2" => 'c'])); 

// true

$isAssoc = Arr::isAssoc(["a" => 'a', "b" => 'b', "c" => 'c'])); 

// true

Arr::last 回傳滿足指定條件的最後一個元素值,如下所示200與300接大於等於150回傳最後一個符合結果300,已可指定預設值,如果沒有找到回傳預設值。

use Illuminate\Support\Arr;

$array = [100, 200, 300, 110];

$last = Arr::last($array, function ($value, $key) {
    return $value >= 150;
});

// 300

$default = 0;

$last = Arr::last($array, function ($value, $key, $default) {
    return $value >= 301;
});

// 0

Arr::only 處理陣列是如果只要某幾個元素,可以一個陣列,並且帶入需要的key值即可得到只有這幾個結果的陣列

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];

$slice = Arr::only($array, ['name', 'price']);

// ['name' => 'Desk', 'price' => 100]

Arr::pluck 這個Victor我還蠻常使用的,可以在複雜的階層陣列中,找出某個位置的值,如下找出developer底下的name的key值,回傳全部的陣列。

use Illuminate\Support\Arr;

$array = [
    ['developer' => ['id' => 1, 'name' => 'Taylor']],
    ['developer' => ['id' => 2, 'name' => 'Abigail']],
];

$names = Arr::pluck($array, 'developer.name');

// ['Taylor', 'Abigail']

也可以如下範例所示將developer的id設定對應的key值。

$names = Arr::pluck($array, 'developer.name', 'developer.id');

// [1 => 'Taylor', 2 => 'Abigail']

Arr::prepend 元素存入陣列的第一個位置

use Illuminate\Support\Arr;

$array = ['one', 'two', 'three', 'four'];

$array = Arr::prepend($array, 'zero');

// ['zero', 'one', 'two', 'three', 'four']

亦可指定鍵值並插入陣列的第一個位置

use Illuminate\Support\Arr;

$array = ['price' => 100];

$array = Arr::prepend($array, 'Desk', 'name');

// ['name' => 'Desk', 'price' => 100]

Arr::pull 取得需要的元素,並刪除元陣列的該元素,如下所示,將key 等於name回傳,並將陣列內的name元素刪除。

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$name = Arr::pull($array, 'name');

// $name: Desk

// $array: ['price' => 100]

$value = Arr::pull($array, $key, $default);  // 可以設定不存在時,返回預設值,原陣列不改變

Arr::query 將陣列的內容,轉為查詢的字串,就是網址後面常常看到的query。

use Illuminate\Support\Arr;

$array = ['name' => 'Taylor', 'order' => ['column' => 'created_at', 'direction' => 'desc']];

Arr::query($array);

// name=Taylor&order[column]=created_at&order[direction]=desc

Arr::random 隨意取出陣列中的一個值

use Illuminate\Support\Arr;

$array = [1, 2, 3, 4, 5];

$random = Arr::random($array);

// 4 - (retrieved randomly)

Arr::set 傳入三個參數,預計修改的陣列、字串、值,可以在陣列中,依照中間傳入的字串,格式使用「.」的方式再多維陣列中加入元素。

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::set($array, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 200]]]

Arr::shuffle 隨機排序陣列內的元素

use Illuminate\Support\Arr;

$array = Arr::shuffle([1, 2, 3, 4, 5]);

// [3, 2, 5, 1, 4] - (generated randomly)

Arr::sort 陣列正序排序

use Illuminate\Support\Arr;

$array = ['Desk', 'Table', 'Chair'];

$sorted = Arr::sort($array);

// ['Chair', 'Desk', 'Table']

亦可以指定使用某個key做排序。

use Illuminate\Support\Arr;

$array = [
    ['name' => 'Desk'],
    ['name' => 'Table'],
    ['name' => 'Chair'],
];

$sorted = array_values(Arr::sort($array, function ($value) {
    return $value['name'];
}));

/*
    [
        ['name' => 'Chair'],
        ['name' => 'Desk'],
        ['name' => 'Table'],
    ]
*/

Arr::sortRecursive 有點不太知道用意,稍後再補~

use Illuminate\Support\Arr;

$array = [
    ['Roman', 'Taylor', 'Li'],
    ['PHP', 'Ruby', 'JavaScript'],
    ['one' => 1, 'two' => 2, 'three' => 3],
];

$sorted = Arr::sortRecursive($array);

/*
    [
        ['JavaScript', 'PHP', 'Ruby'],
        ['one' => 1, 'three' => 3, 'two' => 2],
        ['Li', 'Roman', 'Taylor'],
    ]
*/

Arr::where 過濾陣列,寫入特定過濾條件過濾

use Illuminate\Support\Arr;

$array = [100, '200', 300, '400', 500];

$filtered = Arr::where($array, function ($value, $key) {
    return is_string($value);
});

// [1 => '200', 3 => '400']

Arr::wrap 將值轉為陣列,如果原本已經是陣列將不會有任何變化。

use Illuminate\Support\Arr;

$string = 'Laravel';

$array = Arr::wrap($string);

// ['Laravel']

如果給定的值為 null

use Illuminate\Support\Arr;

$nothing = null;

$array = Arr::wrap($nothing);

// []

data_fill 如果有對應的key值,將元素加入

$data = ['products' => ['desk' => ['price' => 100]]];

data_fill($data, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 100]]]

data_fill($data, 'products.desk.discount', 10);

// ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]

亦可使用 「*」 如下所示,將子陣列缺少 products 下一層全部的子陣列,如果缺少price並設定值200,已有的陣列則不改變。

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2'],
    ],
];

data_fill($data, 'products.*.price', 200);

/*
    [
        'products' => [
            ['name' => 'Desk 1', 'price' => 100],
            ['name' => 'Desk 2', 'price' => 200],
        ],
    ]
*/

data_get


data_set 函數使用「.」符號從多維陣列或物件中根據指定鍵檢索回傳值,亦可以給予預設值,在未找到的情況下回傳預設值。

$data = ['products' => ['desk' => ['price' => 100]]];

$price = data_get($data, 'products.desk.price');

// 100

$discount = data_get($data, 'products.desk.discount', 0);

// 0

亦可以在還數中使用 「*」通配符找尋所有匹配的值

$data = [
    'product-one' => ['name' => 'Desk 1', 'price' => 100],
    'product-two' => ['name' => 'Desk 2', 'price' => 150],
];

data_get($data, '*.name');

// ['Desk 1', 'Desk 2'];

head 返回第一個值

$array = [100, 200, 300];

$first = head($array);

// 100

last 返回最後一個值

$array = [100, 200, 300];

$last = last($array);

// 300

以上就是Laravel操作陣列的函數,後面幾種函數有些與Arr類別相同,差別在於可以不用建立Arr類別的實體,以上提供給讀者參考,Victor使用自己的方式些一遍主要是增加我的印象,最完整的請參考Laravel 官方文件或框架原始碼 Arr類別。

Laravel Queue – 失敗任務處理

版本

Laravel 8


config/queue.php 陣列中 failed 區塊,可以設定失敗任務的連結設定。

'failed' => [
    'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
    'database' => env('DB_CONNECTION', 'mysql'),
    'table' => 'failed_jobs',
],

監聽任務時如果沒有指定任務失敗的次數,任務將會一直嘗試例請在 JOB handle 函數中增加以下程式碼

public function handle()
{
    // 領取任務後的處理程式
}

當執行的時候,將會一直不斷的嘗試執行不會停止,如果指定 --tries 次數,任務會在執行指定的次數之後刪除任務並將任務放置到失敗的任務 failed_job 資料表中,等待確認問題點後,再讓 job 重新執行,確認沒問題後可以重新執行失敗 job 的指令如下,或者可以用 crontab 定時執行。

$ php artisan queue:retry all

這下好了,如果使用者收不到應該收到的信件或其他資訊怎麼辦,我們必續嘗試監聽失敗,在失敗時通知我們立即處理,有兩種方法。

閱讀更多