База данных содержит № 39 вместо № 039

- Sytem - это MySQL, PHP, Apache, а код построен на Codeigniter Framework

РЕДАКТИРОВАТЬ ДЛЯ ЯРКОСТИ: я не храню данные, я пытаюсь восстановить данные, которые хранились несколько лет назад (плохо как экранированные данные). В базе данных имя Fred'сохраняется как Fred & # 39, но когда я конвертирую Fred' с помощью htmlspecialcahrs, оно появляется как Fred & # 039. Мой вопрос заключается в том, что мне нужно сделать, чтобы Фред преобразовал в Фред & # 39 и любые другие эквиваленты?

Оригинальный вопрос

Я унаследовал базу данных от другой системы (точнее, от Invision Power Board). Сайт теперь имеет пользовательскую кодировку с использованием Codeigniter, но использует ту же базу данных участников, что и на старом сайте Invision Power Board.

Теперь я обнаружил проблему, когда, если у пользователя есть апостроф в его имени, например, встроенная функция codeigniter "Fred" html_escape (которая просто использует htmlspecialchars) преобразует его в Fred & # 039

Тем не менее, в базе данных имя сохраняется как: Fred & # 39, и поэтому поиск не удается.

Я не уверен, что Invision Power Board делала со строкой перед ее вставкой в ​​базу данных, но кто-нибудь знает, как я могу обеспечить ее преобразование в & # 39 вместо & # 039?

Простое высказывание сделать str_replace или изменить данные в БД бесполезно, поскольку существуют сотни возможностей того, что может быть в имени пользователя. Быстрый поиск пользователей с # в их имени (предположительно, специальным символом) показывает 440 пользователей, которые в настоящее время не могут войти в систему из-за этой ошибки на нашем сайте.

РЕДАКТИРОВАТЬ: Исправлено некоторое форматирование, чтобы удалить ";" так что это не просто отображать апостроф

1 ответ

Решение

Вы можете использовать preg_replace(), чтобы удалить нули из сгенерированной php строки перед сравнением:

$string = 'Fred&#039';

$string = preg_replace('/&#0+([1-9]+)/', '&#$1', $string);

var_dump(str_split($string));
// str_split to show real result
Другие вопросы по тегам