English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

各位大大好:
小弟我目前在寫一些php和Mysql間連動的小程式,但是碰到的問題是:
當要送出query的字串中有一些特別的中文時,就會無法insert或update,
我碰到的是 "俞" 這個字(這應該也是蠻平常的字吧),程式碼如下所示:

$db = new mysqli('localhost','root','1234','AAA');
$query = "update AAA.table1 set user_name='俞' where user_id=1";
$result = $db->query($query);
echo $db->affected_rows;

echo 出來的結果都是 -1,新增也是一樣,就是無法insert和update,
如果是加入其他的中文字的話,例如 "俞如" ,
就可以insert和update,但是會變成亂碼 => "咻p",想請問
各位高手是否有解決的辦法,先謝謝大家耐心地看完了。

PHP:Ver 5.2.0 (PHP5舊一點的版本也是一樣)
MySQL:Ver 5.0.27
Apache:Ver 2.2.3 (有試過架在IIS上也是一樣)
資料表和欄位我都是設utf8

可以真正解答者,我將給予20點。

2006-11-15 00:03:49 · 4 個解答 · 發問者 阿周 1 in 電腦與網際網路 電腦網路

Jelly 大大你好,我試過你的方法加\,是可以insert了,但是insert進入的是亂碼,在網頁顯示出來是 "?" ,我的php.ini檔中magic_quotes_gpc是設定為On的,請問還有那邊可以改呢!? (剛試了一下,"許" 也會這樣)

2006-11-16 11:58:15 · update #1

4 個解答

回答以前,想要先請問幾個問題:請問你的網頁是用utf8的編碼嗎?另外要請問的是,在資料庫裡頭是亂碼,叫出資料在網頁呈現的時候也是亂碼嗎?

2006-11-19 23:36:20 補充:
不好意思,沒有空一個字一個字打,所以上網找了這些資料給你,我想應該對您的問題會有一些幫助(文章來源:酷!學園 http://phorum.study-area.org/viewtopic.php?t=36484&highlight=utf8)

1. 用 vi /etc/httpd/conf/httpd.conf 設定Apache中的語系為 (記得restart)
AddDefaultCharset UTF-8

2. 用 vi /etc/php.ini 設定php中的語系為 (記得restart)
default_charset = "utf-8"

3. 用 vi /etc/my.cnf 設定MySQL中的語系為 (記得restart)
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
[client]
default-character-set = utf8

4. 建立資料庫時選擇語系: (記得清除DB Cache)
DROP DATABASE IF EXISTS `aa`;
CREATE DATABASE `aa` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `aa`;

CREATE TABLE IF NOT EXISTS `aat` (
`id` char(1) NOT NULL default '1',
`myStr` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

5. 用UltraEdit(v11.20a版) 轉換所有ANSI格式的php檔案轉化為UTF-8格式:
File --> Conversions --> ASCII to UTF-8 (Unicoding Editing)
( 在UltraEdit中按Advanced --> configuration --> File Handling
--> Unicode/UTF-8 Detection --> 剔選Auto detect utf-8 files )
如有需要時,可執行Remove BOM.php. 當用WinXP的Notepad將php檔由ANSI轉為UTF-8時,
因檔頭有BOM,會引起排版問題,故必須移除,執行Remove BOM.php即可自動移除.
Remove BOM.php可由以下網址下載:
http://www.hoyo.idv.tw/hoyoweb/document/view.php?sid=13&author=hoyo&status=view

6. 在php檔中必須加入:




7. 在連接DB的檔中必須加入3行mysql_query才ok:
$host="localhost"; $DBname="aa";
$user= "root"; $passwd = "";
$link = mysql_connect($host,$user,$passwd) or die ("Fail");
$db = mysql_select_db($DBname, $link) or die ("Fail");
// 要在真正query DB取出資料前,加入以下3行
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET_CLIENT=utf8");
mysql_query("SET CHARACTER_SET_RESULTS=utf8");
$sql = "select * from aat where crid='1'";
$rows = mysql_query($sql);

2006-11-19 23:42:47 補充:
第八項請參考原網址~根據我的經驗,第七項的解決方法應該就可以解決您現有的問題,而第八項的部份則是讓您的網站能夠將使用者所有的輸入內容以及其他的內容「確保」為utf-8的編碼型態。

2006-11-19 23:45:41 補充:
第八項請參考原網址~(我沒辦法放在這裡)
--------
根據我的經驗,第七項的解決方法應該就可以解決您現有的問題,而第八項的部份則是讓您的網站能夠將使用者所有的輸入內容以及其他的內容「確保」為utf-8的編碼型態。

另外提供一篇關於utf-8與big5的說明網站,有興趣了解這兩個編碼故事的話也可以去看看:http://mywebnotepad.blogspot.com/2006/05/big5-utf-8.html

2006-11-19 23:46:27 補充:
補充意見放在下面~

2006-11-19 18:36:20 · answer #1 · answered by ? 2 · 0 0

我之前也被這個問題整的很慘
後來才知道
在 mysql_connect() 之後
加上 mysql_query("set names 'utf8' "); 就可以使用中文了

ps. utf8 可以改成其他編碼

2006-11-19 11:47:19 · answer #2 · answered by johnroyerkimo 2 · 0 0

我都是用MySql的Query Brower來看,可是裡面的中文都是亂碼,所以我也不知道在資料庫中是不是亂碼,不過感覺應該是亂碼,另外我在php.ini中,default_charset和mbstring.internal_encoding和mbstring.http_output都是設定為utf8, 不知道這是不是網頁用utf8編碼的意思.

2006-11-16 11:42:01 · answer #3 · answered by 阿周 1 · 0 0

這是一個衝碼字的問題唷你試看看在中文字後面加上\試看看 應該就可以嚕例: ' 俞\ ' 記得\要和 ' ' 空一格 不然會變成 脫逸'唷不過我記得資料庫 有自己會判斷 並自動處理衝碼字的問題你可以找看看你的 php.ini檔看看 magic_quotes_gpc的設定是不是 on如果是on就應該不會有問題才對如果設定是off 那你可以改成on 若你堅持它要是off 可以有一個比較簡單的做法if(!get_magic_quotes_gpc()){  $user_name = addslashes($user_name)}這樣的話 如果if(!get_magic_quotes_gpc() 回傳是0就會執行$user_name = addslashes($user_name)自動為衝碼字加上 \

2006-11-17 10:33:32 補充:
衝碼字是一大堆的 幾千幾百個吧 所以你不用一個個慢慢試了 = =就一律做$user_name = addslashes($user_name)addslashes就是 替衝碼字加\ 的意思如果有做這個動作 但還是亂碼請檢查看看 你的網頁編碼方式是big5 或 utf-8再檢查看看你的資料庫編碼方式基本上兩邊要一樣 比較不會有問題

2006-11-15 04:30:12 · answer #4 · answered by Jelly 7 · 0 0

fedest.com, questions and answers