分類彙整:phpmysql

PHP session problems with Google Chrome and Internet Explorer

怪怪的~~ 最近,在 firefox 可以正常的使用 session, 但是,在 ie 和 google chrome 的環境,sesseion 就沒有作用。
查了一下資料,原來最近這些新的版本真的會這樣~~

參考來源: https://secure.kitserve.org.uk/content/php-session-cookie-problems-google-chrome-and-internet-explorer

在原本的 session_start() 前面加上一些設定就可以解決了, 如下:

In keeping with best practice, I usually initialise sessions like so:

ini_set('session.use_trans_sid', false);
ini_set('session.use_cookies', true);
ini_set('session.use_only_cookies', true);
$https = false;
if(isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] != 'off') $https = true;
$dirname = rtrim(dirname($_SERVER['PHP_SELF']), '/').'/';
session_name('some_name');
session_set_cookie_params(0, $dirname, $_SERVER['HTTP_HOST'], $https, true);
session_start();

–取自參考來源網站~~

mysqldump 匯出中文字變亂碼

使用 mysqldump 將資料庫匯出,移轉到另一台主機時,再匯入到資料庫時,發現所有中文字都變成亂碼。請先連到 mysql ,輸入以下指令:

SHOW VARIABLES LIKE ‘character_set_%’;

如果顯示內容如下:
+————————–+——–+
| Variable_name            | Value  |
+————————–+——–+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+————————–+——–+

最後一行告訴我們,系統是使用 utf8 編碼,但,其它的幾行其實告訴我們,mysql 是使用 latin1 做為預設編碼。

另外,還可以再執行以下指令:

show create database DBNAME;

顯示內容如果是:

CREATE DATABASE `DBNAME` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */

表示這個資料庫是使用 utf8 編碼。 那,問題就不大了,使用

mysqldump -u DBuser -p DBname –default-character-set=latin1 > DBname.sql

將資料庫匯出,將 sql 檔案移到 新的主機後,先用 vi or gedit 開啟檔案,將裡頭所有的 latin1 取代為 utf8。

接下來就可以匯入sql檔案,應該就正常囉!!

mysql 預設編碼

先檢查目前資料庫的編碼:

  1. SHOW CREATE DATABASE myDB;
  2. 如果最後顯示的是 latin1 的話, 可以依照以下動作修改.

修改 /etc/my.cnf 檔案, 加入以下區塊的內容:

  1. [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    init-connect=’SET NAMES utf8′
  2. [client]
    default-character-set=utf8

重新啟動 mysql 後, 再執行以下指令:

  1. SHOW VARIABLES LIKE ‘character_set_%’

看到都改為 utf-8 , 表示 mysql 預設編碼已改為 utf-8了.
再檢查資料庫, 看看是否正確, 如果不正確的話, 建議砍掉資料庫, 再重新建立即可.

php中文字的切割問題

在php裡要選取字串的某些字元,通常使用 substr 函數來處理,不過,遇到中文字時,往往會有問題。
Big5 的編碼,一個中文字是二個 byte,
utf-8 的編碼,一個中文字是三個 byte.

查詢之後,可以使用 mb_substr 函數來處理,而且不用管是幾個 byte ,例如
如果是 utf-8 編碼的文字, 使用 mb_substr(“這是一串中文的字串”, 0, 4, “UTF-8”)
這會顯示 “這是一串” 四個字,又例如
如果是 big5 編碼的文字,使用 mb_substr(“這是一串中文的字串”, 0, 4, “BIG5”)
還是顯示 “這是一串” 四個字。
在這個函數裡,一個中文字就當做是一個字,很方便。

參考資料: http://blog.xuite.net/chenbruse/bruse/13351768

mysql dump 備份及復原

資料庫的備份
mysqldump DBname -uUserName -p –opt > FileName.sql
加入 –opt 的話,在回存資料庫時,若資料表己存在的話,會先將資料表刪除後再建立。

資料庫的回存
mysql DBname -uUserName -p < FileName.sql

mysql 的 root 忘記了

參考來源: http://www.howtoforge.com/reset-forgotten-mysql-root-password

  1. 先停止 mysql 服務.
  2. 使用下列方式重新執行 mysql , 使 mysql服務 在啟動時, 跳過權限的表格, 丟到背景去執行.
    mysqld_safe –skip-grant-tables &
  3. 登入到 mysql 管理, 這時應該不需要再輸入密碼, 就可以用 root 身份登入.
    mysql –user=root mysql
  4. 更新管理員的密碼. 重新讀取權限.
    update user set Password=PASSWORD(‘new-password’) where user=’root’;
    flush privileges;
    exit;
  5. 應該可以使用新的密碼連到 mysql 了.

mysql的SUBSTRING_INDEX函數

可以用在例如 IP 位址 要取出最後主機位址時, 可以排序時使用.

SUBSTRING_INDEX(str,delim,count)
Returns the substring from string str before count occurrences of the delimiter delim. If count is positive, everything to
the left of the final delimiter (counting from the left) is returned. If count is negative, everything to the right of the final delimiter
(counting from the right) is returned. SUBSTRING_INDEX() performs a case-sensitive match when searching for delim.
mysql> SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, 2);
-> ‘www.mysql’
mysql> SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, -2);
-> ‘mysql.com’

關於 mbstring 部份, 可以參考
http://tw2.php.net/manual/en/mbstring.ja-basic.php
http://dob.tnc.edu.tw/themes/old/showPage.php?s=1372&t=79
部份的說明, 另外, 在 php.ini 裡的 mbstring 區段, 也有說明可以參考.

找到
[mbstring]
以下5行去掉”;”號,並改成如下
[mbstring]
mbstring.internal_encoding = zh-tw
mbstring.http_input = auto
mbstring.http_output = big5
mbstring.detect_order = auto
mbstring.substitute_character = none;