2013-04-26 31 views
1

NB這是MS Access 2000中,這個PHP文件被調用Ajax調用...字符編碼拼圖PHP/MS接入

在我已經把

ini_set('default_charset', 'utf-8'); 
這個PHP文件的開始下面

的$令牌來自這些線路

$search_string = $_GET[ 'search_string' ]; 
$search_tokens = explode(" ", $search_string); 
$token = $search_tokens[ 0 ]; 

時,我有一個「象徵性」這個工程確定沒有法國重音符號:

$sql="SELECT * FROM tblFrEng WHERE French = '$token'"; 
echo "=== SQL is $sql<br>"; 
$sth = $dbh->prepare($sql); 
$sth->execute(); 

不過,儘管SQL用法語單詞,如「參考,」看起來很好(像這樣):

=== SQL is SELECT * FROM tblFrEng WHERE French = 'référé' 

不幸的是,查詢返回0行...即使有記錄,它應該返回...所以它似乎可能是我的字符編碼已成爲問題

NB我也嘗試使用utf8_encode編碼,但是,正如所指出的,這是沒有意義和亂碼的SQL字符串...

+0

你從哪裏得到這個'$ token'? – silkfire 2013-04-26 10:07:42

+0

令牌取自GET字符串...我將這些行放在 – 2013-04-26 10:14:34

+0

我認爲您的文件的編碼不是UTF8 ... – silkfire 2013-04-26 10:21:06

回答

0

這是我工作的PHP代碼。我不得不使用mb_convert_encoding(),它是PHP「Multibyte String」(「mbstring」)擴展的一部分。

代碼:

<?php 
// NB: save this PHP script as an ANSI text file, not a UTF-8 encoded file 

$dbh = new PDO(
     'odbc:Driver={Microsoft Access Driver (*.mdb)};' . 
     'Dbq=C:\\Users\\Public\\acc2000.mdb;' . 
     'Uid=Admin;Pwd=;'); 

// this is our test case 
$city = 'Montréal'; 
echo '$city: ' . $city . "\r\n"; 

// this is the UTF-8 "token" we'd get from the AJAX call... 
$token = utf8_encode($city); 
echo '$token: ' . $token . "\r\n"; 

// ...and here we convert to the Access_2000 character set 
$win_token = mb_convert_encoding($token, 'Windows-1252', 'UTF-8'); 
echo '$win_token: ' . $win_token . "\r\n"; 

$sth = $dbh->prepare('SELECT * FROM Cities WHERE City = ?'); 
$sth->Execute(array($win_token)); 
$rst = $sth->fetchAll(); 
echo '$rst: '; 
print_r($rst); 

結果從Windows命令行運行時:

C:\__tmp>\php\php odbcTest.php 
$city: MontrΘal 
$token: Montréal 
$win_token: MontrΘal 
$rst: Array 
(
    [0] => Array 
     (
      [City] => MontrΘal 
      [0] => MontrΘal 
     ) 

) 

注意,命令行輸出本身略有亂碼,但至少SQL查詢返回結果....

+0

你是一個天才!我發現我必須用返回的東西做一個* reverse *編碼(我在PHP文件中不是在CLI中執行它)...所以我去echo mb_convert_encoding($ row ['Def'],'UTF- 8','Windows-1252'); – 2013-04-26 15:50:15

+0

啊,美中不足(沒有那麼令人驚訝)......看起來在Access「Memo」字段中的換行符完全被忽略了(我把輸入的字符串分成了字符)......這些換行符一直是有問題......我認爲在適當的時候我可能會轉換爲MySQL,但非常感謝 – 2013-04-26 16:12:43