Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема при переходе с windows-1251 на utf8
 
 автор: tourist   (26.11.2013 в 10:57)   письмо автору
 
 

Здравствуйте!
Пожалуйста, помогите!
Я делаю сайт с фотогалереей. За основу взял скрипты из главы 12 "Фотогалерея" книги М. Кузнецова, И. Симдянова, С. Голышева "PHP5 Практика создания WEB-сайтов" 2006 г.
В кодировке 1251 всё работает хорошо. Но, когда я попытался перевести сайт в utf8, начались проблемы, описание которых, в интернете, не нахожу.
Они заключаются в том, что слова (названия фотографий) состоящие из букв "Р", с "Т" по "Ю", например: "пеЧка", не вставляются в MySQL из админки на php.
И скрипт:
<?php
$query 
"INSERT INTO photo SET namefoto= '".$namefoto."'";
if(
mysql_query($query))
  {
    
// Осуществляем автоматический переход на главную
    // страницу администрирования
    
echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php?id_parent="
.$_POST['id_catalog']."'>
          </HEAD>"
;          
  } 
else 
  {    
  exit(
'<blockquote>Ошибка при добавлении новой записи в таблицу фотографий</blockquote>');
  }
?>

где $namefoto="печка", выдаст "Ошибка при добавлении новой записи..."
Если же слова составлены из букв с "А" по "П", а также "С" и "Я", например : $namefoto="пенка", то тот же скрипт работает, вроде бы, абсолютно нормально,
и такие слова прекрасно заносятся в MySQL и в дальнейшем с ними проблем нет.
То же самое происходит и при UPDATE.
С помощью phpMyAdmin "запретные" буквы в MySQL заносятся. И даже выводятся с помощью SELECT. Но если это слово - ссылка и используется для преобразования
URL-адреса с помощью mod_rewrite, появляются кракозябры и ссылка не работает. При "разрешенных" буквах всё хорошо.
Пробовал преобразовать сайт из 1251 в utf8 и в "Денвере". Но и там происходит почти то же самое. С той только разницей, что скрипт не выдаёт ошибки, а просто отсекает все буквы в слове, начиная с "запретной". При $namefoto="печка" в MySQL заносится только "пе".
Пожалуйста, подскажите, что делать?

  Ответить  
 
 автор: Sfinks   (27.11.2013 в 08:17)   письмо автору
 
   для: tourist   (26.11.2013 в 10:57)
 

Попробуйте сразу после подключения к БД выполнить запрос:
SET NAMES UTF8;

Кроме того, сама таблица должна иметь сопоставление с utf8. Т.е. результат запроса на создание таблицы:
SHOW CREATE TABLE `table_name`;
должен заканчиваться на:
CHARSET=utf8

Если это не так, то нужно исправить.

  Ответить  
 
 автор: Jovidon   (27.11.2013 в 09:52)   письмо автору
 
   для: tourist   (26.11.2013 в 10:57)
 

когда добавляем VALUES здесь тоже исправь
<? $query "INSERT INTO photo VALUES namefoto = '".$namefoto."'";

  Ответить  
 
 автор: Sfinks   (27.11.2013 в 09:56)   письмо автору
 
   для: Jovidon   (27.11.2013 в 09:52)
 

Вы не правы!
13.2.5. INSERT Syntax

  Ответить  
 
 автор: Jovidon   (27.11.2013 в 11:47)   письмо автору
 
   для: Sfinks   (27.11.2013 в 09:56)
 

а я этого не знал, спасибо

  Ответить  
 
 автор: tourist   (27.11.2013 в 12:52)   письмо автору
 
   для: Jovidon   (27.11.2013 в 11:47)
 

Здравствуйте!
Спасибо за совет!
Но всё это у меня уже есть.

Подключаюсь к базе так:
<?php
//подключаемся к MySQL
mysql_connect($sqlhost,$sqluser,$sqlpass) or die("MySQL не доступен! ".mysql_error());
//подключаемся к базе данных
mysql_select_db($db)or die("Нет соединения с базой данных! ".mysql_error());
mysql_query ("SET NAMES 'utf8'");
?>

Таблицу создаю так:
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`namefoto` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=74 ;

Настройки MySQL такие:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
Но при этом треть русских букв MySQL не воспринимает. А может быть проблема не в MySQL?
Но дело и не в VALUES.
Вот цитата из книги А.Мотева "Уроки MySQL", 2006 г., стр.100:
"Для внесения данных в определенные поля также можно использовать синтаксис:
INSERT INTO имя_таблицы SET имя_поля=значение[, имя_поля=значение,...];
Здесь оператор INSERT вставляет в поля, определенные в предложении SET, заданные значения.
Если поля не определены, в них вставляется значение по умолчанию."
Да и у меня, например, слово "пенка" вставляется без проблем и с SET. А в кодировке 1251 и вообще
всё замечательно.
Тут что-то не так с utf8. Создаётся впечатление, что когда эту кодировку конструировали или когда вставляли её в MySQL, забыли о некоторых русских буквах.
У кого-нибудь utf8 работает в MySQL без ошибок?

  Ответить  
 
 автор: Jovidon   (28.11.2013 в 00:46)   письмо автору
 
   для: tourist   (27.11.2013 в 12:52)
 

а если так
<? $query "INSERT INTO photo SET namefoto = '" mysql_real_escape_string($namefoto) . "'";

  Ответить  
 
 автор: Sfinks   (28.11.2013 в 08:34)   письмо автору
 
   для: tourist   (27.11.2013 в 12:52)
 

> У кого-нибудь utf8 работает в MySQL без ошибок?
Да у всех работает... И в Windows и в Linux и где угодно.

Честно говоря, я в тупике.... У вас вроде все правильно настроено.

Вот еще смотрите что я нашел в юзер-камментах к мануалу:
I tried all the above hints but still couldn't get it to work (using mySql and PHP 5 server)... 'till I found and tried also this:
add to the .htaccess file this single line:
AddDefaultCharset UTF-8
Still not sure why this was important to the whole, but now it works as planned! Thanks!

Попробуйте, может и вам поможет?....

А вообще, почитайте сами, может что найдете: http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html

  Ответить  
 
 автор: tourist   (29.11.2013 в 14:13)   письмо автору
 
   для: Sfinks   (28.11.2013 в 08:34)
 

Здравствуйте!
Наконец, нашел ошибку!
Это всё происходило из-за регулярных выражений. В utf8 они работают по другому. Их надо модифицировать. Они и сбивали кодировку.
Спасибо за помощь!

  Ответить  
 
 автор: Sfinks   (29.11.2013 в 22:47)   письмо автору
 
   для: tourist   (29.11.2013 в 14:13)
 

Ну как бы в топике о РВ нет ни слова....
А так да, к ним нужно добавлять модификатор "u"

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования