powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MySQL] Проблемы с кодировкой или что-то другое?
19 сообщений из 19, страница 1 из 1
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38278806
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Передаю в скрипт через POST-запрос данные для добавления в базу на base64. В скрипте декодирую, распарсиваю и добавляю в БД.

$param_mas = explode("\r\n",$param);
$file_name = $param_mas[0];

и потом если выполнять запрос:
$query = "INSERT INTO files (f_first_letter, f_filename) VALUES('".strtoupper($file_name[0])."','".$file_name."')";

то запись не добавляется, а если перед выполнением запроса написать
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е234.LNK';
то всё нормально работает - такая строка добавляется в базу

Что интересно, если вызвать echo $file_name (в случае с $file_name = $param_mas[0];), то имя файла выводится такое - как я передал µрёрµҐ ±іАы°ьё® Б¦°Е234.LNK.


Даже не знаю приблизительно в чем именно проблема - в php или в чем-то другом?

Модератор:
Random2 , не забываем про существование кнопок "SRC" и "Предварительный просмотр"!
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38279285
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random2то запись не добавляетсяНу не просто же так она не добавляется. Откройте для себя mysql_error(), чтоли...

Сама по себе строка кажется весьма странной, если только это не банальный бардак в кодировках. Да, функция mysql_real_escape_string() пропущена здесь случайно или она реально не использована?

Random2если вызвать echoА echo не всю правду говорит. Вместо echo удобнее использовать var_dump(). Все же, оно более информативно.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38279893
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МодераторRandom2, не забываем про существование кнопок "SRC" и "Предварительный просмотр"!
Думал, что исходный код в 1-2 строки можно без SRC вставлять. На будущее учту.

vkle ,
Прошу прощения что сразу не уточнил. Дело в том, что MySQL или PHP (незнаю кто виноват) думает почему-то что строка пустая. А поле f_filename в базе уникально, поэтому после вызова mysql_errno() получаю текст ошибки
авторERROR 1062 - Duplicate entry '' for key 'f_filename'

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

Попробовал функцию mysql_real_escape_string - результат не изменился. Думаю, тут дело все же в кодировке.

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

1. В самом начале получаю и обрабатываю параметр.
Код: php
1.
2.
3.
$param = base64_decode($_REQUEST['param']);	
$param_mas = explode("\r\n",$param);
var_dump($param_mas);


Вижу, что первый параметр (имя файла) - здесь правильный, т.е. здесь всё ОК:
array(14) { [0]=> string(24) "µрёрµҐ ±іАы°ьё® Б¦°Е.LNK"

2. Далее идет вот такой код
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$file_name = mysql_real_escape_string($param_mas[0]);
$file_id;
echo "<br>checking filename...: ".$file_name;
	
$query = "SELECT f_id FROM files WHERE f_filename='".$file_name."'";		
$query_result = mysql_query($query);	
if (mysql_num_rows($query_result) == 0)
{
    echo "<br>inserting new file...: ".$file_name;
    $query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".mysql_real_escape_string($file_name)."','')";
		
    if (mysql_query($query))
    {
        $query = "SELECT LAST_INSERT_ID()";		
	$query_result = mysql_query($query);
	$file_id = mysql_result($query_result, 0, 0);
    }
    else
        echo "<br>SQL-ERROR: ".mysql_errno()." - ".mysql_error();
}


Вывод в браузере такой:
checking filename...: µрёрµҐ ±іАы°ьё® Б¦°Е.LNK
inserting new file...: µрёрµҐ ±іАы°ьё® Б¦°Е.LNK
SQL-ERROR: 1062 - Duplicate entry '' for key 'f_filename'
То есть видно, что как только я передаю переменную file_name в запрос, то почему-то в запросе после этого переменная пустая. Но такая ситуация только, если я использую в 1м пункте код, который я указал выше. Если же написать явно, к примеру:
Код: php
1.
2.
$param = 'µрёрµҐ ±іАы°ьё® Б¦°Е911.LNK*new';
$param_mas = explode("*",$param);



То такой вариант отрабатывает нормально - в базу добавляется такая запись. Правда тут уже другой момент - strtoupper($file_name[0]) добавляет пустое значение, а должен быть символ µ. Но это уже следующий этап. Есть еще какие-нибудь соображения по этой проблеме?
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38279934
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random2Думал, что исходный код в 1-2 строки можно без SRC вставлять.Да можно и сто, но читать уж больно утомительно.


Random2текст ошибки
авторERROR 1062 - Duplicate entry '' for key 'f_filename'Вероятно, такая запись уже существует в базе. Или индекс как-то скозявило что он думает что запись существует.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38279941
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random2Правда тут уже другой момент - strtoupper($file_name[0]) добавляет пустое значение, а должен быть символ µ. Но это уже следующий этап.Эммм... А какие тип данных в таблице и какие кодировки выставлены в соединении и в поле?
ИМХО: Вообще, для такой абракадабрицы лучше в таблицах использовать бинарный тип данных.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38279949
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя... еще фиг знает что там скрывается за $file_name[0] и какая кодировка преобразования используется для strtoupper.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280026
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleВероятно, такая запись уже существует в базе. Или индекс как-то скозявило что он думает что запись существует.
Смотрю в базе - такой записи нету, но есть пустая запись, а при добавлении в базу переменная $file_name почему-то пустая, отсюда и такая ошибка.

vkleЭммм... А какие тип данных в таблице и какие кодировки выставлены в соединении и в поле?
Character set: utf8
Collation: utf8_general_ci

При соединении кодировку не указываю, соединяюсь так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
if (!mysql_connect('localhost','test','')) 
{
    echo "Ошибка подключения к серверу MySQL\n";
    exit;
}
		
if (!mysql_select_db('test'))
...
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280121
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random2при добавлении в базу переменная $file_name почему-то пустая, отсюда и такая ошибка.А, ну знач проблема раньше чем переменная используется в запросе и пока нет смысла его рассматривать. Отслеживайте по шагам и найдете то место, где значение теряется.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280292
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходя из кода ниже (в $file_name содержится нужная строка), получается, что проблема в функции mysql_query? Т.к. она в упор не видит то, что в $query занесена не пустая строка, а текст?
Код: php
1.
2.
3.
4.
5.
$query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".$file_name."','')";		
echo "<br>".$query;
		
if (!mysql_query($query))
echo "<br>".mysql_error();



INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('µ','µрёрµҐ ±іАы°ьё® Б¦°Е.LNK','')
Duplicate entry '' for key 'f_filename'
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280302
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще интересное наблюдение. Пишу теперь так:
Код: php
1.
2.
3.
4.
5.
6.
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е001.LNK';
$query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".$file_name."','')";		
echo "<br>".$query;
		
if (!mysql_query($query))
echo "<br>".mysql_error();



Теперь всё ОК - mysql_query отрабатывает без проблем. Интересно, в чем разница, если я напрямую присваиваю эту абракадабру переменной и если получаю ее вот так
Код: php
1.
$file_name = $param_mas[0];



Что получается. Вот так проблем нету:
Код: php
1.
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е001.LNK';


А вот так есть:
Код: php
1.
$file_name = $param_mas[0];
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280309
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бардак. вот как получишь вот это в нормальном виде, так поймешь.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280316
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все-таки тут какая-то проблема с кодировкой.

Код: php
1.
2.
3.
4.
5.
6.
7.
$file_name = $param_mas[0];
var_dump($file_name);
//string(24) "µрёрµҐ ±іАы°ьё® Б¦°Е.LNK"

$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е002.LNK';
var_dump($file_name);
//string(45) "µрёрµҐ ±іАы°ьё® Б¦°Е002.LNK" 


Длинна строки увеличивается вдвое и добавляются какие-то символы, когда я присваиваю напрямую. Что это значит?
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280321
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowбардак. вот как получишь вот это в нормальном виде, так поймешь.
Согласен, выглядит не очень красиво. Но у меня только два варианта - либо пропускать эти строки с абракадаброй, либо научится их добавлять в базу вместе со всеми остальными нормальными. Пропустить я всегда успею, а все же попытаться найти причину - было бы неплохо.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280330
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора все же попытаться найти причину - было бы неплохо.
кодировка.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38280344
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположу что где то выполнилось одно или несколько преобразований из многобайтовой по факту кодировки, которую считали однобайтовой, в многобайтовую. Если так, то придется разбираться с кодировками на абсолютно всех этапах, включая веб-браузер.

Random2Длинна строки увеличивается вдвое и добавляются какие-то символы, когда я присваиваю напрямую. Что это значит?Чудеса в наше время весьма редки. Предположу что при прямом присваивании используете многобайтовую, а смотрите в однобайтовой кодировке.
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38284984
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, ScareCrow, спасибо за помощь. Все решилось так, что на сервере всё нормально добавляется в базу (на локалхосте под денвером - нет, причину выяснить не удалось). С выводом тоже были проблемы - вместо юникодовых и спецсимволов были знаки вопроса. Решил эту проблему вызовом команды:
Код: php
1.
mysql_set_charset('utf8');
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38285012
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Random2,

Код: php
1.
mysql_set_charset()

вот она голая правда
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38285019
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET NAMES ?
...
Рейтинг: 0 / 0
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
    #38285395
Random2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,

Там же, где нашел это решение написано:
авторЭта функция, кстати, заменяет все эти запросы:
Код: php
1.
2.
3.
4.
mysql_query ("set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
mysql_query ("SET NAMES utf8");



И работает значительно быстрее. Но появилась она только в PHP 5.2.3 и поддерживается MySQL сервером с версией >= 5.0.7. Если используете эту функцию, то подобные запросы можно не отправлять.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MySQL] Проблемы с кодировкой или что-то другое?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]