Seaward.ru

Здравствуйте, гость ( Вход | Регистрация )

> Разработка на PHP + MySQL, Токости, использование как сервера для flash игр
ALexusB
сообщение Jan 12 2011, 15:49
Сообщение #1


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



Начинаю новую тему. По особенностям и встреченным лично "граблям".

Начну с итоговых шагов алгоритма перевода своего сайта и БД из одной кодировки в другую (win-1251 в utf-8)
В Инете полно решений и советов. Но почитав их (может не все, а первые встреченные), решил проделать это у себя. И собрал еще кучу неописанных в статьях моментов.

Для чего вообще UTF8?
Ну, для начала - весь Flash на utf и иначе он русский не понимает. У меня исторически сложилось делать сайт на win-1251, т.к. изначально не нашел редактора с UTF и не понял почему по умолчанию кракозябры в браузере, хотя на локале все ок.
То есть приходилось обмен сервер-клиент делать через переводчик
mb_convert_encoding($str, "UTF-8", "cp1251") в обе стороны. Благо именно текста передавалось мало, больше ключевых параметров, а текст грузился во Flash из xml, который в UTF изначально.

Опять же с БД было все проще, т.к. в UTF каждая буква записана 2 байтами. А это накладывает свои сложности, как на длину строк, так и на размер БД.
При этом чисто визуально (если хек-едитором смотреть) английские буквы пишутся, как обычно 1 буквой. То есть нет какого, что все буквы по 2 байта - некоторые 1.

Смотрим стартовые статьи на тему перевода сайта (а это сам код в РНР и БД) в новую кодировку.
http://habrahabr.ru/blogs/php/29020/
http://anton-pribora.ru/articles/xml/xml-xslt-utf8/
http://svdev.ru/blog/site-convert-from-cp1251-to-utf8/

переход на УТФ-8 имеет ряд граблей, о которых все в инете промолчали.... собрал сам sad.gif
Итак, мой алгоритм:
1 База конвертится выгрузкой в .sql бэкапа, гроханьем таблиц (а лучше и БД, чтоб кодировка была у нее другая) и закачкой обратно с заменой cp1251 на utf8 в нотпаде
Это все просто и не нужно утилит никаких. Но возможно, если БД маленькая и замена может быть в текстовом редакторе. Иначе - утилиты. Выше описано как штатно или своим скриптом перегонять.

2. код РНР и ХТМЛ конвертится утилитами, потом руками все фразы windows-1251 заменить на utf-8 - это просто, поиском по коду.
Собственно, тут я нашел ответ, почему изначально не смог на UTF делать - у меня редакторы лепили лишние байты в начало файла, а для PHP это критично.

3. Но это не все!!! наступает жопа работы со строками. Сразу перестают работать логины и пароли на русском, все режется, так как длина строк другая.
Кстати, хоть UTF - это 2 байта на букву, но в поле БД varchar(20) влазит не 10 букв UTF, а таки 20, то есть оно само на уровне БД занимает больше. И за это спасибо! Хоть тут не нужно все строки в х2 увеличивать ручками.

А теперь дайджест чего отвалится и нужно заменять по коду на другие методы (поиском по методу без mb_ и дописыванием аналога)
mb_strrchr
mb_strpos
mb_strlen
mb_substr
mb_strlower

В регулярных выражениям (preg_match и прочих) перестанут работать русские буквы, нужно заканчивать регулярное выражение /u
Подробнее тут:
http://forum.codenet.ru/archive/index.php/t-46799.html
http://forum.ixbt.com/topic.cgi?id=24:40663

Я не заменял, но можно, т.к. аналог есть
mb_send_mail вместо mail
mb_ereg

У меня работает и без этого

ВАЖНО.
Все эти md_ методы НЕ РАБОТАЮТ, если ручками в каждом методе последним параметром не указать "UTF-8". Вот же весело... но есть панацея:
В начале всего кода написать
mb_internal_encoding("UTF-8");
Тогда для всех md_ методов будет по-умолчанию верная кодировка и кол-во отрезаемых\измеряемых букв будет верным.
Подробнее:
http://ru2.php.net/manual/en/function.mb-i...al-encoding.php

Вот без всего этого и особенно mb_internal_encoding я не мог залогинится под "ТестовыйЛогинДлинный" пороговые 20 букв на логин.

4. Вроде все и на локале все работает - заливаем на хостинг. Открываем браузер (любой - Опера, ИЕ, Фокс) - и там ГЛЮКИ. Кодировка по умолчанию не распознается (во всех)!!
Если руками ставить - все ок, но это же не нормально, всем не объяснить, кто-то просто уйдет не поняв.

Нужно в корне сайта положить файл
.htaccess
в нем
AddDefaultCharset utf-8

Взята инфа из:
http://forum.nic.ru/showthread.php?t=224
http://joomlaforum.ru/index.php?topic=43421.0

И вот тогда, о чудо, вроде все

5. Но и это не все smile.gif
В первых статьях, что дал в начале, советуют в коде писать
setlocale(LC_ALL, 'ru_RU.UTF-8', 'Russian_Russia.65001', 'UTF-8');

А после этого перестает работать БД нормально, т.к. в нее пишется не 33.50, а 33,50 что для компа не число вообще.
То есть региональные настройки ставятся, а для РФ они по умолчанию очень левые в понимании компа.
Вывод - не писать это или конвертить аккуратно циферьки, как в другой статье было.

Вот теперь все.
http://online.seaward.ru/ переведен на UTF-8
Если что еще отвалится, то алгоритм будет пополняться новыми "граблями" wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 10)
InkyFreeman
сообщение Jan 14 2011, 13:22
Сообщение #2


Символ Пиратизма
*******

Ветеран Форума
Группа: форумчанин
Сообщений: 1,002
Регистрация: 27-September 05
Из: сам не знаю!
Пользователь №: 1,270



Хелло!
То есть, изначально при создании сайта лучше испз. котировку - UTF-8!
А есть беспл. хосты - где дают возможность испл.PHP + MySQL?
Шаблоны?
P.s. жене сайт надо сделать, а я этим лет пять ужу не занимался. Хочется что-то забамбарить.

Сообщение отредактировал InkyFreeman - Jan 14 2011, 13:26
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 14 2011, 19:18
Сообщение #3


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



А погуглить? Первые три линка
http://www.zemskov.ru/free_hosting.html
http://0webhost.ru/
http://www.mirahost.ru/
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Blood5
сообщение Jan 14 2011, 22:56
Сообщение #4


боцман
****


Группа: форумчанин
Сообщений: 229
Регистрация: 1-November 08
Из: Россия, город Пенза
Пользователь №: 18,258



http://intobservatory.ru/

Но тут нужен готовый проект. Даётся 21 день на обкатку движка на данном хостинге, потом в течении недели регают домен 2-го уровня в зоне .ru.
Какие ограничения? Никаких.
Что нужно? Работающий сайт + один рекламный банер, который вы сами ставите по тематике сайта, если у вас выкупят место, то можно и денюжку поиметь. smile.gif

PS, не рекламирую, а только советую. wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 17 2011, 16:24
Сообщение #5


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



Наконец-то догадался погуглить и найти причину, почему на локале имена таблиц в БД мелкими буквами, а на сервере большими (или мелкими) -зависит от хостера.
Мне удобно, когда таблица названа "ShipTabe", а не "shiptable"
Когда у меня накопилось с похожими названием куча таблиц, я перестал быстро по ним фокусироваться и таки нашел, как лечить на локале.

Способа два
1. переназвать созданые в Мускле файлы с большими буквами
2. в my.ini добавить lower_case_table_names = 0 в секцию [mysqld]

Все созданные до того таблицы после п.2 все равно нужно переназывать по способу 1 или экспорт\импортом с редактированием .sql
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 17 2011, 18:15
Сообщение #6


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



Продолжим тему РНР познаний
Как ставить набор
Апач+РНР+Мускл на локал

http://www.inattack.ru/article/77.html - инструкция старая, но детальная. Брать новый софт по офф ссылкам (все оф. беспл)

лучше ставить для пробы на виртуальную машину (Virtual PC - беспл от МСа, весит 35мб)

Ставишь туда что хошь и не жалко снести, если запорется.

Но это путь для упертых. Излишне сложно.

Вместо установки РНР и т.д. по-отдельности, можно просто установить Денвер или XAMPP.
Там в комплекте идет Apache 2, PHP5, MyСКЛ 5, phpMyAdmin...

=====================
Статья по "Груше" (PEAR)

http://rsdn.ru/article/inet/pear.xml

PEAR Для РНР это как MFC для С++

=====================
Про оптимизацию и FastCGI
http://dklab.ru/chicken/nablas/49.html

======================
туториал по связи флаш и РНР
http://www.intuit.ru/department/internet/f...tudio/16/1.html

А вот про ХМЛ и обмен флаша с РНР
http://www.intuit.ru/department/internet/flashmxstudio/17/

как на РНР писать флаш (то есть генерить самому)
http://www.interface.ru/home.asp?artId=9441
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Warship
сообщение Jan 18 2011, 08:42
Сообщение #7


Гроза морей
*****

Ветеран ФорумаЗаслуженный КорсарСоздатель Модов к ГПК
Создатель Модов к КВЛ
Группа: бета-тестер
Сообщений: 441
Регистрация: 29-April 07
Из: Прим. край г. Находка
Пользователь №: 9,103



Цитата(ALexusB @ Jan 18 2011, 01:15) *

Вместо установки РНР и т.д. по-отдельности, можно просто установить Денвер или XAMPP.
Там в комплекте идет Apache 2, PHP5, MyСКЛ 5, phpMyAdmin...

Есть еще такая штука: http://www.usbwebserver.net/en/index.php
Удобно: накатил на флашку и пользуешься smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Jan 18 2011, 13:45
Сообщение #8


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



Тема MySQL

Язык запросов велик и могуч - нужно читать доки (книжка рецептов SQL издат-ва O'Reilly рулит)
Например, там можно сделать в select свое поле вида
(case when a< 10 then 1 else 0) as aa

======
В МуСкл есть транзакции.
Но не на всех таблицах
http://www.wwwmaster.ru/article.php?nart=35
http://luxplus.blogspot.com/2007/09/mysql-...ion-in-php.html
как юзать в РНР в коментах ниже
http://php.net/manual/en/function.mysql-query.php

На таблицах MyISAM - нет.
При этом есть веселость - на мастерхосте, например, нет ИнноДБ, но есть БДБ
А на локале в ХАМРР нет БДБ, но есть ИнноДБ
Но это лечится автозаменой по бакапу.
То есть для отладки и работы все ок.

=================
Джойны нескольких таблиц

Анализ и замеры NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL
http://explainextended.com/2009/09/18/not-...-is-null-mysql/

=============
Забавность РНР

Если внутри одного файла сперва идет просто код, а потом описание класса, то все работает, даже если вызов класса идет выше, чем его описание.
А вот если этот класс отнаследован от другого, который добавляется через инклуд, то такая последовательность уже сбоит.
Но если перевести вызов после описания класса, то снова все ок.


===========
Во флаше можно делать константы из массива
public static const arNationShortName:Array = ["pir", "eng", "fra", "spa", "hol"];

а вот в РНР уже фига. Идет ругань
Но можно сделать переменную статик
static $arNationShortName = array("pir", "eng", "fra", "spa", "hol");

по сути будет та же константана
return Nation::$arNationShortName[$num];
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
navy
сообщение Jan 19 2011, 08:58
Сообщение #9


Hagane no Renkinjutsushi
*******

Seaward TeamВетеран ФорумаЗаслуженный Корсар

Группа: Seaward.Ru Team
Сообщений: 5,935
Регистрация: 15-March 05
Из: Волгоград
Пользователь №: 578



Есть пакет Денвер, там апач+пыхпых+мускуль+перл и т.д. (http://www.denwer.ru/)

Хороший мануал по мускулю на самом сайте его есть, достаточно подробно с примерами.. В принципе синтаксис стандартный для SQL (ANSI SQL-92). Но есть некоторые нюансы. Поэтому читаем внимательно smile.gif

Для работы с запросами у мускуля только команд шелл, поэтому повсеместно используются различные сторонние утилиты. Наиболее распространенная phpMyAdmin, вебморда на похапе. Но есть и другие. Обычно на форумах дается несколько ссылок.

Цитата
(case when a< 10 then 1 else 0) as aa

не забывем end в конце кейса smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Feb 24 2011, 16:33
Сообщение #10


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,478
Регистрация: 2-November 04
Пользователь №: 3



Особенность отправки e-mail в кодеровке utf-8
http://bitprison.net/php_mail_utf-8_subject_and_message

нужно сабжект оборачивать в некую магическую конструкцию
$subject = "=?utf-8?B?" . base64_encode($subject) . "?=";
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
zorx007
сообщение Sep 5 2011, 17:07
Сообщение #11


боцман
****


Группа: форумчанин
Сообщений: 177
Регистрация: 23-June 07
Из: Сахалин
Пользователь №: 10,891



Когда мне довелось переводить базу Из UTF - 8 в православное CP 1251 я попусту использовал Notepad ++
smile.gif Причём базы я открывал сразу тем суперблокнотом...... менял кодировку самого файла .sql и в параметрах самой базы прописывал то что он уже к другой кодировке принадлежит.....

И это у меня прокатило как дети в школу smile.gif

думаю если использовать тот же метод то можно и наоборот базы сконвертировать....

PS оговорюсь сразу что химичил с базами движка DLE благодаря подсказке от Гугла smile.gif и доподлинно мне не известно прокатит ли такой прикол на других движках....
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 17th October 2017 - 17:48
Яндекс цитирования Rambler's Top100
Rambler's Top100