@Stairdeck

Как исправить ошибку кодировки старой БД?

Есть задача внести строку в БД из input с помощью php.
Как бы я уже не бодался, ничего не выходит, пишет только ошибки:
1300 : Invalid utf8 character string: 'Иван Иванович Иванов'


mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");

$fio = mysql_escape_string($fio);
$rank = mysql_escape_string($rank);
$razryad = mysql_escape_string($razryad);
$region = mysql_escape_string($region);
            
$query = "INSERT INTO users(name, level, rank, region) VALUES(`$fio`, `$razryad`, `$rank`, `$region`)";

$result = mysql_query($query);


MySQL очень старый 5.1.41, php тоже старый 5.2.17
Кодировка сервера windows-1251, БД utf8-general-ci.
  • Вопрос задан
  • 1005 просмотров
Пригласить эксперта
Ответы на вопрос 3
gibson_dev
@gibson_dev
Мне кажется достаточно сделать
mysql_query("SET NAMES 'utf8'");
Остальное не нужно
Ответ написан
LenovoId
@LenovoId
svg, css,js
в htaccess добавить запись AddDefaultCharset utf-8
да и пора уже не пользоваться mysql а использовать как минимум mysqli или PDO
Ответ написан
@andrey_o_v
1) я поменял mysql_escape_string на mysql_real_escape_string, т.к. mysql_real_escape_string экранирует строку с учетом текущей кодировки. почитайте в документации про нее, чтобы я не копипастил).
2) Апостроф ` поменял на одинарную ковычку, апострофом я обычно экранирую поля, таблицы, а не строки, хотя не проверял экранированные строки с апострофом.
3) Конечно надо избавляться от mysql и заменить на такие же функции mysqli, хотя где то может поломаться.
4) Странная запись $fio = mysql_escape_string($fio);
это скорее register glogals включен, было бы правильнее, универсальный подход $fio = mysql_escape_string($_REQUEST['fio']);
но может данные пришли из $_GET или $_POST
5) И как вариант данные пришли в кодировке cp1251, поэтому ошибка 1300 : Invalid utf8 character string
$fio = mysql_real_escape_string( iconv('windows-1251', 'utf-8', $fio));

mysql_query("SET NAMES 'utf8'"); 
$fio = mysql_real_escape_string($fio);
$rank = mysql_real_escape_string($rank);
$razryad = mysql_real_escape_string($razryad);
$region = mysql_real_escape_string($region);            
$query = "INSERT INTO users(name, level, rank, region) VALUES('$fio', '$razryad', '$rank', '$region')";
$result = mysql_query($query);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы