2015-03-03 3 views
1

У меня есть таблица с большим дБ, где мне нужно искать и заменять определенный символ и т. Д. Некоторые из них являются специальными символами.PHP SQL find ™ и другие специальные символы

Сначала я пытаюсь просто найти, прежде чем изменять инструкцию, чтобы обновить тип замены.

Ниже работает нормально для

$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 =?

Для дальнейшего использования и других систем я должен запускать каждый поиск, заменяющий символ, и заменять его разными буквами.

So Far Я пробовал:

в PHP MyAdmin ГДЕ 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 –

+0

Thanks - db показывает «LongDescription \t текст \t utf8_general_ci» и $ Search_for2 = '™'; $ Search_for3 = mb_convert_encoding ($ Search_for2, 'UTF-8', 'UTF-8'); echo $ Search_for3; и эхо показывает « $ Search_for = '%'. $ Search_for3. '%'; ничего не находит - Идеи? – Fred

+0

попробуйте удалить последний параметр из mb_convert_encoding .. поскольку вы говорите, что вход UTF-8 .. когда его нет, используйте внутреннюю кодировку по умолчанию, и у вас может быть больше успеха. –

ответ

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 я могу дать проверить, действительно ли вы храните и ищете тот же самый символ. Если я делаю echo ord('™'); в PHP, я получаю 226. Может ли быть, что ваши сохраненные значения и ценность, которые вы ищете, имеют разные порядковые значения? Я не уверен, что это возможно, но, возможно, вы используете разные кодировки, которые имеют один и тот же символ с разными порядковыми значениями?

+0

Привет - PHPmyadmin SELECT HEX (LongDescription), LongDescription FROM table WHERE LongDescription LIKE '% ™%' ----- показывает 209920 как hex .. (только для этого поля в поле). Изучая db, таблица находится в latin1_swedish_ci (передан нам в этом формате) @@ collation_server @@ collation_connection @@ character_set_server @@ character_set_client latin1_swedish_ci utf8_general_ci latin1 utf8 – Fred

+0

@Fred Вы должны сделать 'select @@ collation_server @@ collation_connection @@ character_set_server @@ character_set_client;' из PHP, а также из PhpMyAdmin, и проверить, возвращают ли они тот же ответ! Я предполагаю, что ваш настройки клиента не совпадают. Как только вы знаете, какую кодировку/сортировку вам нужно, посмотрите на этот ответ для h ow установить правильный: http://stackoverflow.com/questions/13101526/mysql-php-character-set-setting/13101585#13101585 –

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.

Edit ...

Хорошо, я вижу, что у вас есть latin1 кодирования для пространства (20), ТМ (99), пространство (20).

План A: Все должно работать: если столбец CHARACTER SET latin1, и вы использовали set_charset('utf8') в PHP, тогда все должно было «просто работать». Это связано с тем, что эта комбинация должна была преобразовать latin1 x99 в/из utf8 xE284A2. Ошибочны ли предположения?

Plan B: Переключение в latin1 в настройках PHP, HTML мета и т.д.

Plan C: Исправьте данные в таблицах (и, возможно, оставить PHP в покое). Это, вероятно, включает ALTER для преобразования таблиц. Являются ли столбцы (столбцы) в настоящее время определенными как CHARACTER SET latin1? (ВЫПОЛНИТЬ СОЗДАНИЕ ТАБЛИЦЫ.)

План D: Начать сначала. (Это предполагает падение таблицы, воссоздавая их, заново заселять их, и т.д. -. Это может быть удобно, если вы только сейчас начиная с базой данных)

(. Там нет «двойного кодирования»)

+0

Привет - PHPmyadmin SELECT HEX (LongDescription), LongDescription FROM table WHERE LongDescription LIKE '% ™% '----- показывает 209920 как hex .. (только для этого поля в поле). Изучая db далее таблица находится в latin1_swedish_ci (передан нам в этом формате) @@ collation_server @@ collation_connection @@ character_set_server @@ character_set_client latin1_swedish_ci utf8_general_ci latin1 utf8 – Fred

+0

Привет, Рик - Спасибо, я только что решил это ... Db повсюду и унаследовал/обновлял каждый день из источника вне моего контроля, поэтому я не могу его изменить. установка кодировки в php не работала как унаследованное дБ-соединение (опять же не мое ARGG) было PDO добавлено второе $ conn2 mysqli для этой функции, и теперь кодировка устанавливается в обоих направлениях. – Fred

Смежные вопросы