База данных содержит № 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'';
$string = preg_replace('/�+([1-9]+)/', '&#$1', $string);
var_dump(str_split($string));
// str_split to show real result