Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: luda_glawa в Jan 16, 2007, 13:29



Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 16, 2007, 13:29
Незнам дали съм избрал правилния раздел на форума, ако не, моля да ме извините.

На пръв поглед проблема е банален и разискван много пъти ... ама наистина много, но ...

OS: Fedora Core 5
Kernel v: 2.6.17-1
PHP: 5.1.6 release 1.2
MySQL: 5.0.27 release 1.fc5
Apache: 2.2.2 release 1.2

Прехвърлям малка база данни от машина с дебиан на машина с по-горните версии на софтуерите под федора.

Данните на машината от която прехвърлям базата:
OS: Debian sarge
Kernel v: 2.6.8-2
PHP: 4.4.3
MySQL: 4.1.11
Apache: 2.0.54

При прехвърлянето използвам mysqldump, и данните се записват във файл с utf-8 кодировка. За това съм сигурен защото федората е настроена с utf-8 локал и през MidnightCommander разчитам кирилицата без проблем. Данните се записаха в новата база също без проблем, като през phpmyadmin ги разчитам. А и като направя заявка директно през mysql данните пак се четат. Което според мен означава, че данните са правилно записани в базата. Web сървъра също няма проблем с UTF-8 - страничките които използват тази база са писани с така кодировка и нямам проблем с тях. Но когато настъпи момента да изкарвам в страничка данните от базата ... излизат само въпросителни.
По-надолу съм дал текущите настройки в my.cnf, httpd.conf, php.ini. Навсякъде, мисля където трябва, съм указал, че трябва да се използва utf-8 кодиране на символите. Струва ми се, че объркването настъпва между php-то и резултатите от sql заявките, но как да контролирам и там процеса? Ако може да помоля за помощ, защото ми се изчерпаха идеите.

my.cnf
Цитат

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
character_set_server=utf8
default_character_set=utf8
collation_server=utf8_general_ci

[mysql.server]
user=mysql
basedir=/var/lib

[client]
default_character_set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


httpd.conf
Цитат

...
# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default.  To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
#
AddDefaultCharset UTF-8

#
...


php.ini
Цитат

...
; As of 4.0b4, PHP always outputs a character encoding by default in
; the Content-type: header.  To disable sending of the charset, simply
; set it to be empty.
;
; PHP's built-in default is text/html
default_mimetype = "text/html"
default_charset = "UTF-8"
...


SHOW VARIABLES LIKE 'char%';
Цитат

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| 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       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)


MySQL server status
Цитат

...
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.27
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 32 min 48 sec


Титла: Mysql, php и apache
Публикувано от: kennedy в Jan 16, 2007, 16:25
Какъв е точно проблема? Когато пуснеш заявка през пхп-то ти вади маймуни ли?


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 16, 2007, 17:30
Цитат (kennedy @ Ян. 16 2007,17:25)
Какъв е точно проблема? Когато пуснеш заявка през пхп-то ти вади маймуни ли?

Само въпросителни.


Титла: Mysql, php и apache
Публикувано от: PsYhLo в Jan 16, 2007, 19:30
Примерен код
<html>
      <head>
            <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />

а това указал ли си го във php/html файловете  :)


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 16, 2007, 19:38
Цитат (PsYhLo @ Ян. 16 2007,20:30)
Примерен код
<html>
      <head>
            <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />

а това указал ли си го във php/html файловете  :)

Да, има го. Само е малко по-различно ;)

Цитат

<meta content="text/html; charset=utf-8" http-equiv="Content-Type">


Титла: Mysql, php и apache
Публикувано от: senser в Jan 16, 2007, 19:54
защо не пробваш с един прост php/html файл с такъв head, който ползваш, за да видиш дали проблема е в апача или в рнр

при мен въпросния таг изглежда ето така:
Примерен код

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>


П.П. ако зададеш изрично енкодинга на utf-8 в баузъра променя ли се нещо





Титла: Mysql, php и apache
Публикувано от: sunhater в Jan 16, 2007, 20:02
За php файловете ползвай:
Примерен код
header("Content-Type: text/html; charset=utf-8");

При мен само така става в php-tata.





Титла: Mysql, php и apache
Публикувано от: CaBA в Jan 17, 2007, 01:23
Когато дебъгваш такива работи, безценна е приставката  webdeveloper на Firefox. С нея би могъл веднага да видиш какви хедъри изпраща сървъра (Information -> View Response Headers).


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 19, 2007, 16:17
Едва днес успях да направя малко тестове.

senser
Цитат

защо не пробваш с един прост php/html файл с такъв head, който ползваш, за да видиш дали проблема е в апача или в рнр

при мен въпросния таг изглежда ето така:

Примерен код

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>


П.П. ако зададеш изрично енкодинга на utf-8 в баузъра променя ли се нещо


Няма разлика с твоя код. Излизат въпросителни. Кирилицата,  от статичния текст, се визуализира правилно само когато браузъра е на UTF-8. Тествах го.

sunhater

Цитат

За php файловете ползвай:

Примерен код

header("Content-Type: text/html; charset=utf-8");


При мен само така става в php-tata.



Няма разлика.

Неприятното е, че в phpmyadmin кирилицата в полетата се вижда. Да не би в php 5 да има нещо което да контролира подаваните от сървъра данни?

Кода с който тествах:

Примерен код

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Редактиране на данни</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
$srvr=mysql_connect('localhost','user','password');
$db=mysql_select_db ('db',$srvr);
$qry=mysql_query("SELECT * FROM table");
?>

<form name="edit" method="POST">

<table border="1">
<?php
  while ($qry2=mysql_fetch_array($qry))
    echo('<tr><td>' . $qry2['data'] . '</td></tr>');
?>
</table>

</form>
<?php
mysql_close($srvr);
?>

Редактиране на данни
</body>
</html>


Титла: Mysql, php и apache
Публикувано от: senser в Jan 19, 2007, 16:56
при мен твоя код работи с изключение на частта за извличане на данните от mysql

това според мен означава че проблема е в mysql енкодинга (почти невъзможно щом phpmyadmin попълва полетата коректно) или в апача

аз преди време имах проблем с едни рнр скриптове, в които ползвах сесии, които не сработваха  - рнр ревеше че има вече изпратени хедъри
след доста ровене се разбра че пробема е в ползването на utf-8 кодировка - заради BOM (BYTE ORDER MARKER), който се праща преди всичко останало
решението беше да ползвам UTF-8 COOKIE

не знам дали има връзка към твоя проблем, но дано те насочи в правилна посока, макар че продължавам да смятам, че проблема е в апача, шом и статичен html не се показва правилно ........


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 19, 2007, 18:40
Цитат (senser @ Ян. 19 2007,17:56)
при мен твоя код работи с изключение на частта за извличане на данните от mysql

това според мен означава че проблема е в mysql енкодинга (почти невъзможно щом phpmyadmin попълва полетата коректно) или в апача

аз преди време имах проблем с едни рнр скриптове, в които ползвах сесии, които не сработваха  - рнр ревеше че има вече изпратени хедъри
след доста ровене се разбра че пробема е в ползването на utf-8 кодировка - заради BOM (BYTE ORDER MARKER), който се праща преди всичко останало
решението беше да ползвам UTF-8 COOKIE

не знам дали има връзка към твоя проблем, но дано те насочи в правилна посока, макар че продължавам да смятам, че проблема е в апача, шом и статичен html не се показва правилно ........

Неееееееееее, статичния текст се визуализира правилно. В интерес на истината, не съм пробвал да записвам все още данни в базата, но може и да се наложи за теста. Колкото до phpmyadmin. Той нали има възможност да преглежда данните в дадена таблица. При това извеждане на данните имах предвид, че няма проблем - излизат на разбираем български.


Титла: Mysql, php и apache
Публикувано от: NOP в Jan 19, 2007, 21:31
Пробвай веднага след като се свържеш към базата да изпълниш"
Примерен код

mysql_query(mysql,"SET NAMES 'utf8'");
mysql_query(mysql,"SET CHARACTER SET utf8");


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Jan 23, 2007, 22:44
NOP пробвах както ме посъветва. За съжаление пак си остават въпросителните. Като цяло е много странно. Идващите дни ще пробвам да направя връзка към базата през python, да видя какво ще излезе. Трябва да измисля кода ;)  Но ако някой има друга идея, ще се радвам ако я сподели :)


Титла: Mysql, php и apache
Публикувано от: badmind в Feb 09, 2007, 15:39
Здравейте, аз имам следния проблем.

Чудя се от каде да започна понеже не съм от най-разбиращите и да не ми се смеете много ;)

Първо създавам база данни в SQL с енкодинг utf8 след което инсталирам форума. Като поствам в форума нямам грижи кирилицата се вижда и аз съм доволен, но като вляза в SQL таблицата кадето се съхраняват постовете не се вижда кирилицата и е на китайски.

Пробвах да създам база данни и с Windows -1251 (cp_1251) с всичките варянти (cp_1251_bulgarian_ci , cp_1251_general_ci cp_1251_bin) там проблема беше този с въпросителните и в форума няма текст на кирилица и ми изписва онова съобщение за ДЕБЪГ....

Проблвах и в ланг файла на форума да барникам (lang_main.php) сменях там енкодинга и с utf8 и пак не става. резултата в форума се пише кирилицата и се чете а в SQL не са коректни таблиците и са на китайски!

Мъчих се с какви ли не енкодинги и не става и не става...


ако някой може да ми помогне как да оправя този проблем и ако има други файлчета на форума които трябва да се барникат за да стане работата и този SQL и ФОРУМА да започнат да говорят на един език :)


надявам се да съм обяснил правилно проблемчето.
Благодаря Ви!





Титла: Mysql, php и apache
Публикувано от: DKnight в Feb 10, 2007, 07:30
http://www.hostbulgaria.com/tutorials/mysql-charset-encoding.aspx


Титла: Mysql, php и apache
Публикувано от: badmind в Feb 11, 2007, 18:59
Цитат (DKnight @ Фев. 10 2007,08:30)
http://www.hostbulgaria.com/tutorials/mysql-charset-encoding.aspx

Благодаря за линка. Ама аз преди да се допитам до форума точно по тези инструкции работих и пак не стана работата. И започвам да си мисля че в SQL е проблема !


Титла: Mysql, php и apache
Публикувано от: dayassen в Feb 11, 2007, 19:22
Луда главо  :D  проблема ти е че за разлика от mysql 4 в mysql 5
като правиш връзка с РНР-то трявба да му казваш какъв енкодинг да използва
Примерен код

$lnk=mysql_connect($dbhost,$dbuser,$dbpass) or die("Error: ".mysql_error());

mysql_select_db($dbname,$lnk) or die("Error: ".mysql_error());
mysql_query ('SET NAMES CP1251',$lnk);

mysql_query ('SET COLLATION_CONNECTION=CP1251_GENERAL_CI',$lnk);


Успех!!!





Титла: Mysql, php и apache
Публикувано от: Somma в Feb 13, 2007, 12:48
Цитат (dayassen @ Фев. 11 2007,20:22)
Луда главо  :D  проблема ти е че за разлика от mysql 4 в mysql 5
като правиш връзка с РНР-то трявба да му казваш какъв енкодинг да използва!


10x dayassen!!! Точно така е и става перфектно, но не разбирам, така ли всеки път трябва да попълвам тия редове, при условие, че едва ли ще сменявам в 1 DB различни енкодинги?!

Няма ли начин някъде в php.ini да се установи като константа? Въпреки че, правих какви ли не опити в този файл, за съжаление тръгна само така както си го описал!

 :crazy:


Титла: Mysql, php и apache
Публикувано от: karaman в Feb 13, 2007, 13:31
Цитат (Somma @ Фев. 13 2007,13:48)
Цитат (dayassen @ Фев. 11 2007,20:22)
Луда главо  :D  проблема ти е че за разлика от mysql 4 в mysql 5
като правиш връзка с РНР-то трявба да му казваш какъв енкодинг да използва!


10x dayassen!!! Точно така е и става перфектно, но не разбирам, така ли всеки път трябва да попълвам тия редове, при условие, че едва ли ще сменявам в 1 DB различни енкодинги?!

Няма ли начин някъде в php.ini да се установи като константа? Въпреки че, правих какви ли не опити в този файл, за съжаление тръгна само така както си го описал!

 :crazy:

няма как, защото това е обръщение към mysql, няма общо с php


Титла: Mysql, php и apache
Публикувано от: luda_glawa в Feb 19, 2007, 16:00
Цитат (dayassen @ Фев. 11 2007,20:22)
Луда главо  :D  проблема ти е че за разлика от mysql 4 в mysql 5
като правиш връзка с РНР-то трявба да му казваш какъв енкодинг да използва
Примерен код

$lnk=mysql_connect($dbhost,$dbuser,$dbpass) or die("Error: ".mysql_error());

mysql_select_db($dbname,$lnk) or die("Error: ".mysql_error());
mysql_query ('SET NAMES CP1251',$lnk);

mysql_query ('SET COLLATION_CONNECTION=CP1251_GENERAL_CI',$lnk);


Успех!!!

Благодаря. Благодаря :)

Въпреки, че на mysql-a  съм му указал изрично и двете настройки ... не ставаше. Обаче така стана. Дивотия отвсякъде.