關於網路那些事...

Marketing, SEO, Web trends, Programming tutorial, Web design, and Life event...

SQL 資料庫設計 - 讓產品支援多國語系的四種方式

一、單列方式 (Column Approach)

在單一列,設定多個語系欄位

優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN - 沒有重複 - 沒有重複的內容(每個記錄只有一行,只有語言列被重複) 缺點: - 很難維護 - 如果只有2-3種語言會很容易維護,但當您有很多欄或很多語言時,它變得非常龐大且不容易維護 - 很難添加新語言 - 添加新語言時,有設定多國語言的欄位都要進行新增調整(以及db用戶的特殊訪問權限) - 佔用空間 - 如果不是所有的項目都必需翻譯(例如在某些地方,只需使用默認語言),它可能會導致冗餘數據或空的db字段 - 需要建立檢視判斷 - 需要依照目前語系環境決定要撈出哪一列,還需額外判斷才能達成

CREATE TABLE app_product (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `date_created` datetime NOT NULL,
  `price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  `title_en` varchar(255) NOT NULL,
  `title_es` varchar(255) NOT NULL,
  `title_fr` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

透過很簡單的Query就能取出資料

<?php
// Retrieve titles for all languages
$sql = "SELECT * FROM `app_product` WHERE 1";
if($result = mysqli_query($link, $sql)){
    if($row = mysqli_fetch_assoc($result)){
        echo "English: ".$row["title_en"]."<br>";
        echo "Spanish: ".$row["title_es"]."<br>";
        echo "French: ".$row["title_fr"]."<br>";
    }
}

// Retrieve appropriate title according to the chosen language in the system
$sql = "SELECT `title_".$_SESSION['current_language']."` as `title`
        FROM `app_product`";
if($result = mysqli_query($link, $sql)){
    if($row = mysqli_fetch_assoc($result)){
        echo "Current Language: ".$row["title"];
    }
}
?>

二、多列方式(Multirow Approach)

方法與第一種很像,但不是透過欄位的方式來建立多國語系,而透過一個語系欄位且不同列的方式來處理 優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN 缺點: - 難以維護 - 每個語言的所有列中必須更改未翻譯的每一列。例如,改變單一產品的價格需要對所有語言重複此操作 - 很難添加新語言 - 需要針對每個產品項目進行重複插入操作(從默認的語系作為模板進行複製)

Continue Reading

Git 操作筆記

這裡簡單記錄一些常用的 git 指令

Continue Reading

windows10以及之前版本,如何開啟啟動資料夾 (開機時自動啟用軟體)

在windows系統用戶安裝的多數軟體,通常都會自動設定"開機自動啟用"功能,

但是,並不是所有軟體都會預設開啟這項功能,

如果你想手動的方式來達到 開機時自動啟用軟體

通常會直接透過windows 啟用資料夾的方式來管理,

只要將你的軟體捷徑圖示(或者啟用程式)直接拖曳複製一份到啟用資料夾

就能夠達成在開機時自動啟用這個軟體,

這裡將會說明 windows10、windows8、windows7、windows xp 的啟動資料夾在哪裡

Continue Reading

如何關閉/停用 windows 開機啟用項目

電腦隨著使用時間越來越長,安裝的軟體服務通常也會越來越多,

原本多元的軟體可以讓你更加方便的工作及管理作業,但是產生的困擾就在於,

多數軟體都會自動加入開機程序,當電腦開機後會自動執行,

當開機自動啟用的項目越來越多,

就會明顯發現電腦開機的速度越來越慢,非常不方便

因此,接著內容會說明如何開啟或關閉開機啟用軟體的方法:

Continue Reading

手動查詢網址WHOIS Domain Name 或 IP 的DNS設定 - nslookup

在很多情況,我們會需要使用手動方式查詢 domain name 或 ip 的DNS設定

例如: 一般設定好DNS之後,都需要一段時間才能完成配對,這時我們就能透nslookup確定IP是否已經對應到dns

在這裡,會針對一些平時會使用的nslookup查詢方式進行說明

後續會陸續再新增更多說明及內容

Continue Reading

單頁應用程式的登入權限驗證 - 開源標準規範 JSON Web Tokens

在一頁式網頁架設登入系統通常是一件非常麻煩棘手的事情,

在一開始要思考的是該挑選哪個主流框架 Angular、React或Vue…

然後開始建立一個前後端分離的架構,只透過RESTful API來進行溝通,

在這樣的架構下,搭建CMS相當容易,前端通常只需要取得資料後,進行render出來即可,

##SESSION BASE 無用武之地 如果要建設會員或管理者權限功能,傳統 session-based 的權限登入方式相當簡單,

但是在透過 RESTful API 應用的框架中,session-based的方式則行不通,

此外,單純使用SESSION的情況,也必須解決資料跨 Server 的問題

Token

Token是一串加密字串,並儲存在前端, 當使用者再次操作時,就能在後端從資料庫中比對token, 檢查是否為有效的使用者, 但是這樣的查詢也會產生伺服器的負擔

Continue Reading

將谷歌excel 試算表作為資料庫 [教學]

將你的Google Spreadsheet 設定為公開

檔案>發佈到網路

Continue Reading

無法連結到內網 windows http server 時,該如何處理

最近有朋友在學習架設網站,想透過內網分享時,卻無法連線

在協助他處理完畢後,就順便將解決方法記下來

希望能幫助到遇到類似問題的朋友,順利解決無法連線的問題

Continue Reading

PHP Socket - simple case tutorial

Open PHP Socket Extension

First, make sure php.ini php_socket extension is opened remove ; and restart http server php.ini

...
extension=php_sockets.dll
...

Socket Server Side

Writing your servier side code as fellowing: php_socket_server.php

Continue Reading

瀏覽器語言偵測

Language of the browser: zh-TW

var x = "Language of the browser: " + navigator.language;

var txt = "";
txt += "<p>Browser CodeName: " + navigator.appCodeName + "</p>";
txt += "<p>Browser Name: " + navigator.appName + "</p>";
txt += "<p>Browser Version: " + navigator.appVersion + "</p>";
txt += "<p>Cookies Enabled: " + navigator.cookieEnabled + "</p>";
txt += "<p>Browser Language: " + navigator.language + "</p>";
txt += "<p>Browser Online: " + navigator.onLine + "</p>";
txt += "<p>Platform: " + navigator.platform + "</p>";
txt += "<p>User-agent header: " + navigator.userAgent + "</p>";
<script type=text/javascript>
        // if( (/http\:\/\/t\.smartisan\.com\/smartisan\/modules\/index\/\#\/$/g).test(location.href)) {
        if( (/http\:\/\/www\.smartisan\.com.$/g).test(location.href) || (/http\:\/\/www\.smartisan\.com\/\#\/$/g).test(location.href)) {
            // ['ja', 'en-GB', 'en', 'en-US', 'fr', 'es', 'ko', 'de'];
            // 首页,如果是英文环境,则跳到 en
            if((/en/gi).test(navigator.language)) {
                location.href = 'http://www.smartisan.com/en/';
            }
            // 首页,如果是日文环境,则跳到 jp
            else if((/(jp|ja)/gi).test(navigator.language)){
                location.href = 'http://www.smartisan.com/jp/';
            }
        }
    </script>

Continue Reading

工程師多數靠自學,還需要大學學位嗎?[轉載]

根據Stack Overflow網站2016年開發者調查發現,有56%的開發人員沒有計算機科學或相關領域的大學學位。開發人員最喜歡學習的方式是“自學”(至少69%的受訪者表示他們是部分自學;而13%的受訪者則是完全自學)。

但是,是否大多數公司都要求學位?

在 Stack Overflow Jobs(所有地區)列出的4,499個職位中,約61%(2,739個)沒有要求“學位”或“學士學位”,其他39%的工作崗位則在招聘要求中註明學位,可能是硬性要求也可以是其愛好。

有趣的是,按區域篩選時,在美國發布的需要學位的工作的百分比更高。美國列出的2,287個工作中,搜索出1,198個註明學位的職位,這意味著48%(1,089個)企業沒有把“學位”或“學士學位”作為要求之一,其餘52%的美國工作把學位作為應聘者的要求或愛好。

所以,有些公司需要學位,但這並不意味著如果你有大學學位就有超過50%的機會獲得作為開發人員的工作,證明你能做什麼和你做了什麼的能力將總是比你是否有學位更重要,即使在公司已經列出學位作為要求的情況下。

培訓可以替代學位嗎?

Continue Reading

全球900萬用戶恐受PHP Mailer漏洞影響,讓攻擊者能在遠程執行任意代碼!

PHP Mailer是其中一個最受歡迎的郵件程式庫,普遍被應用在各種流行框架 WordPress,Drupal,1CRM,SugarCRM,Yii,Joomla!…等。 卻在日前,由 Dawid Golunski 發現在 v 5.2.18 版本存在一個高度危險漏洞,能允許攻擊者在遠端執行程式代碼。漏洞編號為 CVE-2016-10033

Continue Reading

如何用CSS自定義checkbox以及radio按鈕樣式

目前有很多客製化form element的套件, 但是這次專案只需要客製checkbox及radio, 由於這樣的類子很常用到,就直接在這裡就做個紀錄,方便之後查詢 如何透過CSS來客製化HTML checlbox 及radio buttons

Continue Reading

C# LINQ 查詢運算式 - 教學筆記 (使用visual studio)

LINQ 查詢運算式(Language-Integrated Query)是一種數據查詢語言,可以讓我們使用同一個語句來對不同資料來做資料查詢 (包括Objects、SQL、Datasets、Entities、Data Source、XML/XSD等),並且具有擴充性。

使用的方式很簡單 首先,要先載入System.Linq 命名空間類別庫就可以開始使用 LINQ 類別和介面

Continue Reading

C# 系統集合泛型(System.Collections.Generic) Queue, Stack - 教學筆記 (使用visual studio)

C# 在系統集合泛型(System.Collections.Generic) 還包含 佇列(Queue)及堆疊(Stack)

這裡先簡單總結一下兩者的差異

佇列(Queue) 屬於先進先出(FIFO)的集合,例如: 一群人在排隊等公車,先來的就可以先上車。

堆疊(Stack) 屬於後進先出 (LIFO)的集合,例如: 將大箱子放入貨車櫃,最後放進去的,到時會最先取出來; 將子彈裝進彈匣,最後裝進去的會先擊發。

接下來,兩者說明如下:

Continue Reading

C# 系統集合泛型(System.Collections.Generic) List, Dictionary - 教學筆記 (使用visual studio)

前面,我們介紹過C#的泛型 可以讓我們自行設計泛型方法、類別來進行操作資料

在這裡,會說明C#預設提供的泛型集合類別(generic collection classes) 讓我們可以直接拿來使用於操作資料 這些類別主要都被包含在一個Class裡面,稱為系統集合泛型(System.Collections.Generic) 在這裡會介紹 List, Dictionary, Queue, Stack 集合類別

Continue Reading

C# 泛型(Generics) - 教學筆記 (使用visual studio)

C# 提供了泛型,讓我們可以用更有彈性的方式來設計Class、Method,操作資料

透過泛型類型 <型別參數T>來代表型別(int, string, double…)

可以在宣告時再指定型別,

以下透過範例來說明幾種情況的用法:

方法泛型 (Generic Method)

在Method使用泛型,只要在Method後面接上泛型類型 <型別參數T> 就可以在宣告時,再指定型別, 並且,可以搭配.GetType()來檢查型別 範例:

static void MyDemo<T>(T x)
{
    Console.WriteLine("您傳入的型別為"+x.GetType()+ ",值=" + x);
}

static void Main(string[] args)
{
    MyDemo<string>("Hello");//您傳入的型別為System.String,值=Hello
    MyDemo<int>(3);//您傳入的型別為System.Int32,值=3
    MyDemo<double>(3.14);//您傳入的型別為System.Double,值=3.14
}

類別泛型(Generics Class)

在class使用泛型,一樣直接加上 <型別參數T> 即可 在這裡示範如何透過Class泛型來手動做一個簡易的list功能

範例:

// Declare the generic class.
public class MyListClass<T>
{
	//初始化array,並參考泛型別
    T[] innerArray = new T[0];
    
	//Add Method - 新增一個array項目
    public void Add(T item)
    {
        Array.Resize(ref innerArray, innerArray.Length + 1);
        innerArray[innerArray.Length - 1] = item;
    }
    
	//Get Method - 取得array特定key的value
    public T Get(int k) {
        return innerArray[k];
    }
	//All Method - return array
    public T[] All()
    {
        return innerArray;
    }
}

static void Main(string[] args)
{
    // Declare a list of type int.
    MyListClass<int> listA = new MyListClass<int>();
    listA.Add(3);
    listA.Add(4);
    listA.Add(5);
    listA.Add(2);
    foreach (int row in listA.All()) {
        Console.WriteLine(row);
    }
}

Continue Reading

C# 用 system.IO 操作檔案 - 教學筆記 (使用visual studio)

使用C# System.IO namespace,可以用在檔案建立、寫入、讀取…

在這裡,主要介紹 System.IO 的 File Class

WriteAllText 寫入/建立檔案

透過WriteAllText可以將文字寫入檔案(如果檔案不存在,會自動建立),格式為:

File.WriteAllText(檔案位置及名稱, 字串);

範例:

string x = "Hello text";
File.WriteAllText("myfilename.txt", x);

ReadAllText 讀取文件

使用ReadAllText可以直接讀取文件中的內容,格式為:

File.ReadAllText(檔案位置及名稱);

建立檔案 & 讀取檔案 範例:

//建立檔案
string x = "Hello text";
File.WriteAllText("myfilename.txt", x);
//讀取檔案
string y = File.ReadAllText("myfilename.txt");
Console.WriteLine(y); 

AppendAllText 插入文字

C# 將字串插入文件內容尾端 範例:

File.AppendAllText("myfilename.txt", " append text to the end.");
string y = File.ReadAllText("myfilename.txt");
Console.WriteLine(y);

Exists 判斷檔案是否存在

透過 Exists 可以判斷檔案是否已經存在 返回布林值

File.Exists(檔案位置及名稱);

範例

if (File.Exists("myfilename.txt")) {
    Console.WriteLine("Yes");
}else{
    Console.WriteLine("No");
}

Delete 刪除檔案

刪除指定的檔案

Continue Reading

C# try-catch 例外處理(Execption Handling) - 教學筆記 (使用visual studio)

例外處理,可以處理一些未知且發生錯誤的情況,例如: 輸入不合法(型別不符)的值、找不到要開啟的資料、處理資料時突然失去連線…。

在C# 例外處理使用 try-catch 陳述式

只要將一般陳述式放在try區塊,

當try區塊發生發生時,就會移向catch區塊,用Exception擷取錯誤

Continue Reading

C# 結構(Structs) - 教學筆記 (使用visual studio)

C# 的 Struct 是一個value type的小群組,

在管理程式變數時,非常好用

例如,對於註冊用戶資料,會包含姓名、性別、住址…. 透過struct,就可以將用戶資料統整成一個群組結構

Continue Reading