在php使用兩個以上的mysql連線

一般在php只會使用到一個mysql連線,因為一個連線使用一個資料庫剛剛好。除非你事業做得夠大,資料分佈在許多資料庫,或是想給自己找麻煩,順便搞一點神秘,才會需要將資料放在不同的資料庫。

要使用多個mysql連線,在連線時就有一個問題要注意。一般我們是使用mysql_connect來作連線,若多個連線使用的是相同的參數(意即伺服器位址、帳號、密碼都一樣),那麼mysql_connect並不會重新建立新的連線,而是傳回第一個相同參數的連線資源。此時參數必須再多一個true,例如mysql_connect($server, $username, $password, true),這樣才能夠建立各自獨立的多條連線。

建好多條連線之後,接下來要為各條連線設定連線編碼。需要注意的是,這裡是以mysql 5.0以上的環境來說明,mysql 4似乎沒有連線編碼這個設定。

假設我已經連好兩條獨立的連線,分別是$link1及$link2,那麼設定連線編碼就是mysql_query(“set names utf8”,$link1)、mysql_query(“set names big5”,$link2)。

mysql 5.0之後,連線編碼若沒有設定好,即便資料庫、資料表的編碼設定正確,存取的結果仍會有誤。

設定好連線之後,接下來就要設定預設存取的資料庫。通常我會使用mysql_select_db($dbname),因為先前我們已經建了兩個mysql連線,所以這裡會變成mysql_select_db($dbname1,$link1)及mysql_select_db($dbname2,$link2)。

在僅有一個連線的狀況下,要存取不同資料庫就必須透過mysql_select_db先行調整(另有一個mysql_db_query可在查詢時才指定資料庫,但在php 5.3.0之後被deprecated,所以不建議使用),這樣如果要跨資料庫存取就很麻煩,必須將查詢出來的結果全部存在變數之後,然後再切換資料庫另作查詢的動作。而有了多個連線之後,我就可以在取出查詢的結果的同時就寫入另一個資料庫,十分的方便。

另外,前面有提到連線的編碼的設定,如果不同連線的資料庫本身編碼就不同,資料內容的編碼也不同,例如一個是utf8,另一個是big5,那麼取出來的資料還需要先做過編碼的轉換才能存到另一個資料庫,不然一樣會造成亂碼,甚至無法存入。我自己是只會用iconv這個函數轉換,所以我只推薦使用這個函數。

而關於使用iconv轉換編碼,官網有補充可使用//TRANSLIT//IGNORE放在轉出編碼字串的後面,//TRANSLIT是當iconv無法轉碼時,它會透過一個會多個看起來具有相同意思的字元來代替;//IGNORE是會略過轉換錯誤訊息,就是不顯示錯誤的意思,因為轉換錯誤在php執行時期預設是會提示錯誤訊息。詳細內容請見:http://tw2.php.net/manual/en/function.iconv.php

在〈在php使用兩個以上的mysql連線〉中有 5 則留言

  1. 想請教您
    之後改成了mysql_connect後就失效了
    mysqli_connect是否也能這樣做?

  2. 我沒實際用過。
    但看官網的說明,如果是用物件的用法,那麼物件本身就記錄連線資源;
    如果是用函數用法,連線資料也是必帶的參數,不像mysql_query是可以省略的。
    也就是說是可以同時連線不同資料庫。
    請見: http://php.net/manual/en/mysqli.query.php

  3. wow首先,很訝異回文,
    因為這是一篇很久以前的文章,
    很多人都不再回應舊的文章了,
    關於你的回覆我會再去看看的,
    你的意思應該是說
    把mysql_connent寫成物件導向的
    應該就可以
    我會再去查看看的
    感謝您

  4. 會看到是因為wordpress會主動通知。
    另外,正確的說,不是把mysql_connect寫成物件,
    而是直接使用mysqli或者pdo的mysql類別
    因為建立的物件就包括連線,
    同時後續的使用方式也跟php預設的mysql相關函式無關了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料