2015-03-03 70 views
1

我有一個大的dB表,我需要搜索和替換某些字符等。其中一些是特殊字符。PHP SQL find™和其他特殊字符

首先,我試圖在將語句更改爲Update replace類型之前找到它。

下面運行正常的

$Search_for = '%apple%'; 

但在這個例子中,我們將集中於™(從現場粘貼)

$search_what = 'LongDescription'; 
$Search_for = '%™%'; 
SearchToSee($conn,$search_what,$Search_for); 

和特種炭失敗

所以功能

function SearchToSee ($conn,$search_what,$Search_for) { 
       $stmt = $conn->prepare(" SELECT * FROM table_name WHERE $search_what Like '$Search_for' "); 
       $stmt->execute(); 

       foreach ($stmt as $row) { 
          print_r ($row); 
       } 

那麼如何格式化$Search_for =

由於進一步原因和其他系統我必須運行每個查找替換字符不同,並用自己的不同字母替換。

到目前爲止,我曾嘗試:

在PHP myadmin WHERE LongDescription LIKE '%™%'作品!

在php

$Search_for = '%apple%'; works but not special char 
$Search_for = '%™%';// Not Working 
$Search_for = '%_™%';// Not Working 
$Search_for = '™';// Not Working 
$Search_for = '%™%';// Not Working 

我是否需要更改編碼傳遞到SQL?

現在嘗試:

 $Search_for2 = '™'; 
     $Search_for3 = mb_convert_encoding($Search_for2, 'UTF-8', 'UTF-8'); 
     echo $Search_for3; 
     $Search_for = '%'.$Search_for3.'%'; 

呼應的一個「¢和工程就像一個適當的期限‘蘋果’,但依然沒有特殊字符。

+0

是的,你做...它取決於你的數據庫使用什麼編碼..如果UTF8那麼你需要將你的字符串轉換爲UTF8 ..見:http://php.net/manual/en/function.iconv .php – 2015-03-03 12:38:54

+0

Thanks - db shows「LongDescription \t text \t utf8_general_ci」and $ Search_for2 ='™'; $ Search_for3 = mb_convert_encoding($ Search_for2,'UTF-8','UTF-8'); echo $ Search_for3;並回顯顯示:¢ $ Search_for ='%'。$ Search_for3。'%';沒有找到任何東西 - 想法? – Fred 2015-03-03 12:58:10

+0

嘗試從mb_convert_encoding中移除最後一個參數..正如你所說的輸入是UTF-8 ..當它不是時,使用默認的內部編碼,並且你可能會獲得更多成功.. – 2015-03-03 13:50:27

回答

0

感謝里克和NL-X 原來,在

<?php require_once(' dB connection.... 

是PDO這不會允許編碼改變。

所以解決方案添加

 $conn2=mysqli_connect($servername,$username,$password,....... 

$search_what = 'Table_Name'; 
$Search_for2 = '™'; 
$Search_for = '%'.$Search_for2.'%'; 
$Replace_with = 'TRADE MARK'; 

SearchToSee($conn2,$search_what,$Search_for,$Replace_with,$Search_for2); 

和功能

function SearchToSee ($conn2,$search_what,$Search_for,$Replace_with,$Search_for2) { 
mysqli_set_charset($conn2, 'utf8'); // change as required 
mysqli_query($conn2, "SET NAMES 'utf8';");// change as required 
mysqli_query($conn2, "SET CHARACTER SET 'utf8';");// change as required 
mysqli_query($conn2, "SET COLLATION_CONNECTION = 'utf8_unicode_ci';"); // change as required 

// below makes it simple to see what your changing 

$result = mysqli_query($conn2, "SELECT * FROM $table WHERE $search_what  Like '$Search_for'"); 
$result2 = mysqli_query($conn2, "select 
    @@collation_server, 
    @@collation_connection, 
    @@character_set_server, 
    @@character_set_client;"); 

    foreach ($result2 as $grr) { 
       echo '<br>'; 
       print_r ($grr);// shows result of new settings need to match last line 
       echo '<br>Array ([@@collation_server] => latin1_swedish_ci [@@collation_connection] => latin1_swedish_ci [@@character_set_server] => latin1 [@@character_set_client] => latin1) '; // original N/W $grr 
      echo '<br>latin1_swedish_ci ----    utf8_general_ci ----  latin1  ----- utf8 <br><br>'; // from @@ checks in phpmyadmin on table. 
      } 

// TO Update 
mysqli_query($conn2, "UPDATE Table_Name SET $search_what = replace($search_what, '$Search_for2', '$Replace_with') WHERE $search_what Like '$Search_for'");    
} 

希望幫助別人。

1

第一個關閉,你是部分正確的。對Mysql的編碼必須正確。但我想這不是你的問題,因爲PHP爲你設置了IIRC。只要做一個select '™';,看看你是否在PHP中得到正確的反饋。如果沒有,請檢查您的編碼設置。

但其次在那裏我懷疑問題存在,是您使用的排序規則。根據排序規則,特殊字符在使用字符串時會被忽略或視爲其他字符。

排序規則設置爲客戶端,所以它可能是默認的PHP排序規則與phpMyAdmin設置的排序規則不同,導致您看到不同的行爲。

select * from 
    (select 'privé' as word) as t 
where word like '%e%' 

根據使用哪種排序規則,上述內容是否打中。

但下面肯定不會打:

select * from 
    (select 'privé' COLLATE utf8_bin as word) as t 
where word like '%e%' COLLATE utf8_bin; 

但是接下來將再次肯定打:

select * from 
    (select 'privé' COLLATE utf8_general_ci as word) as t 
where word like '%e%' COLLATE utf8_general_ci; 

嘗試用檢查從PHP和phpMyAdmin的你的排序規則和字符集:

select 
    @@collation_server, 
    @@collation_connection, 
    @@character_set_server, 
    @@character_set_client; 

第三個建議 th在我能給的是檢查你是否確實在存儲和搜索完全相同的字符。如果我在PHP中使用echo ord('™');,我得到226。難道你搜索的儲值和價值有不同的序數值嗎?我不確定這是可能的,但也許你正在使用具有不同序號值的相同字符的不同編碼?

+0

嗨PHPmyadmin選擇十六進制(LongDescription),LongDescription從表WHERE LongDescription LIKE'%™%' -----顯示209920爲十六進制..(僅用於現場的TM)調查數據庫進一步調查latin1_swedish_ci(以這種格式傳遞給我們) @@ collat​​ion_server @@ collat​​ion_connection @@ character_set_server @@ character_set_client latin1_swedish_ci utf8_general_ci latin1 utf8 – Fred 2015-03-04 08:39:11

+0

@Fred你應該從PHP和PhpMyAdmin執行'select @@ collat​​ion_server @@ collat​​ion_connection @@ character_set_server @@ character_set_client;'並檢查它們是否返回相同的響應!我的猜測是你的客戶端設置是不一樣的,一旦你知道你需要什麼字符集/校對,看看h的這個答案設置正確的一個:http://stackoverflow.com/questions/13101526/mysql-php-character-set-setting/13101585#13101585 – 2015-03-04 13:50:45

0

mysqli_set_charset('utf8') - 或相關函數。

您顯示的字符串片段暗示您有「雙重編碼」。

SELECT HEX(col), col FROM tbl WHERE ...看看存儲了什麼?如果以utf8正確存儲,則應該看到e284a2,當它顯示爲latin1時,顯示「â¢」。如果它是雙重編碼,那麼你將得到十六進制'C3A2E2809EC2A2'或'„';

一旦我們確定數據是否爲正確存儲了,我們可以關注需要在INSERT和SELECT中修復哪些內容。可能是在PHP代碼中。

有關該問題的更多討論,請參閱http://mysql.rjweb.org/doc.php/charcoll

編輯...

OK,我看到你有空間(20)latin1編碼,TM(99),空間(20)。

計劃A:一切都應該工作:如果列是CHARACTER SET latin1,並且您在PHP中使用set_charset('utf8'),那麼事情應該「剛剛起作用」。這是因爲該組合應該已將latin1 x99轉換爲utf8 xE284A2或從中轉換。假設是錯誤的嗎?

計劃B:切換到在PHP設置,HTML元Latin1的等

C計劃:修正數據表中(也可能先不談PHP)。這可能涉及一個ALTER來轉換表。當前列是否定義爲CHARACTER SET latin1? (做SHOW CREATE TABLE。)

D計劃:重新開始。 (這涉及丟棄表,重新創建它們,重新填充它們,等等 - 這可能是實際的,如果你只是現在與數據庫開始)

(沒有「雙編碼」)

+0

嗨 - PHPmyadmin SELECT HEX(LongDescription),LongDescription從表WHERE LongDescription LIKE'% ™%'-----將209920顯示爲十六進制..(僅用於該字段中的內容)調查數據庫的進一步表格位於latin1_swedish_ci中(以此格式傳遞給我們) @@ collat​​ion_server @@ collat​​ion_connection @@ character_set_server @@ character_set_client latin1_swedish_ci utf8_general_ci latin1 utf8 – Fred 2015-03-04 08:39:53

+0

嗨裏克 - 謝謝,我終於解決了它...數據庫是遍佈的地方,並繼承/更新每天從我的控制之外的來源,所以我不能改變它。 php中的編碼設置不起作用,因爲繼承的dB連接(又不是我的ARGG)是PDO爲此功能添加了第二個$ conn2 mysqli,現在編碼可以在兩個方向上設置。 – Fred 2015-03-04 20:40:14