1

Тема: Проблема кодировок

Заметила, что часто возникает проблема кодировки в php. Много гуглила, но увы, что-то до меня явно не доходит.
Опишу в кратце. Переношу сайт с локального хоста в интернет. С горем попалам перенесла, но все русские буквы отображаются одинаково - ??????.
Хотсинг у меня забугорский, в нем я если честно 2 по 5, кое-как разбираюсь.
Везде, где смогла поменять, стоит кодировка cp1251_general_ci.
но когда делать в SQL запрос на глобальую кодировку, выдает следующее:
character_set_client    latin1
character_set_connection    latin1
character_set_database    latin1
character_set_filesystem    binary
character_set_results    latin1
character_set_server    latin1
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/

и честно говоря, ума не приложу, где ее менять..
если есть возможность подсказать - буду рада помощи. спасибо.

2

Re: Проблема кодировок

Ladywind сказал:

но когда делать в SQL запрос на глобальую кодировку, выдает следующее:
character_set_connection    latin1

Кодировка соединения с MySQL устанавливается в .php скрипте следующей строкой идущей сразу после функции соединения с БД (mysql_connect):

mysql_query('SET NAMES cp1251');

Если у вас установлен форум или какой-либо движок сайта, то обычно существует конфигурационная директива для задания кодировки соединения с MySQL, где достаточно прописать cp1251.

Но надо иметь в виду, что установка кодировки соединения с MySQL поможет только в том случае, если в базе данных кириллица имеет читаемый вид, а не выводится в phpMyAdmin в виде нечитаемых крякозябов. В случае, если в phpMyAdmin вместо кириллицы видны крякозябы, следует сперва перекодировать данные в нормальный вид. Перекодировка зависит от многих условий и ей надо заниматься отдельно. Скажите, если нужна будет помощь в перекодировке данных.

3

Re: Проблема кодировок

Hanut сказал:

mysql_query('SET NAMES cp1251');

суть в том, что в index.php у меня в mysql_query написано другое - mysql_query("SELECT title,meta_d,meta_k,text FROM settings WHERE page='index'",$db);

поэтому туда не суется SET Names sad

4

Re: Проблема кодировок

Ladywind сказал:

суть в том, что в index.php у меня в mysql_query написано другое

mysql_query('SET NAMES cp1251'); - эту строку надо добавить сразу после вызова функции mysql_connect. Менять другие запросы выполняемые mysql_query не надо.

5

Re: Проблема кодировок

вставила, но страница стала очень громко ругаться....
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'adminka'@'localhost' (using password: YES) in /home2/charmed4/public_html/vampire-diaries/blocks/bd.php on line 1

Warning: mysql_query() [function.mysql-query]: Access denied for user 'charmed4'@'localhost' (using password: NO) in /home2/charmed4/public_html/vampire-diaries/blocks/bd.php on line 2

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home2/charmed4/public_html/vampire-diaries/blocks/bd.php on line 2

а до этого было нормально) не считая кодировок)

6

Re: Проблема кодировок

Покажите какие изменения вы внесли в файл bd.php.

7

Re: Проблема кодировок

мм в бд теперь все верно, я просто не тот пароль с логином закинула.
а вот теперь не пойму что ему не нравится дальше.

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/charmed4/public_html/vampire-diaries/index.php on line 6

6я строка: $myrow = mysql_fetch_array($result);



Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/charmed4/public_html/vampire-diaries/index.php on line 38

<?php
        $result = mysql_query ("SELECT id,title,date,text FROM news",$db);
        $myrow = mysql_fetch_array ($result); - 38я

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/charmed4/public_html/vampire-diaries/index.php on line 50

while ($myrow = mysql_fetch_array ($result));?> - 50я

это у меня идет цикл

8

Re: Проблема кодировок

Ladywind сказал:

6я строка: $myrow = mysql_fetch_array($result);

Ошибка говорит, что в переменной $result уже неверные данные, то есть запрос выше не был выполнен.

Ошибка вида "supplied argument is not a valid MySQL result resource" означает, что запрос не выполняется. Необходимо смотреть по какой причине: не достаточно прав у пользователя, неверные данные в функции подключения mysql_connect, или еще что-то.

9 (изменено: Ladywind, 2011-06-20 12:54:07)

Re: Проблема кодировок

Hanut сказал:

Ошибка говорит, что в переменной $result уже неверные данные, то есть запрос выше не был выполнен.

а переменной $result в это время присваивается: mysql_query("SELECT title,meta_d,meta_k,text FROM settings WHERE page='index'",$db);

что может быть как-то противоречит тому, что я написала в bd.php - mysql_query('SET NAMES cp1251');
потому как без этой строки - все страницы грузятся из базы...  sad  я в замешательстве

p.s. хотя вот щас вернула все на круги своя - однофигственно, ошибки те же

притом что на денвере на компе - все без сучка и задоринки работает  hmm

10

Re: Проблема кодировок

О боже, я тормоз первой степени.
оказывается в bd.php в mysql_select_db была указана несуществующая база (имя было той, что на денвере), а не на сервере. и соответственно php было в ступоре. сейчас кажется все по русски отображается))) спасибо. big_smile  попробую дальше посмотреть, что будет

11 (изменено: Ladywind, 2011-06-20 16:17:33)

Re: Проблема кодировок

а еще вопрос, не знаю куда задать...
если вопрос не по теме, подскажите куда можно отписаться, пожалуйста.
http://vampire-diaries.charmed4.net/index.php - вот собственно та самая страница, все выводится.
но почему-то стал вдруг неожиданно "уезжать левый блок", и я что-то сомвсем в растерянности О_о
а главное, как осуществить постраничный вывод? если есть возможность помочь - буду очень благодарна. ну или хотя бы послать туда, где смогут..)

12

Re: Проблема кодировок

Ladywind сказал:

почему-то стал вдруг неожиданно "уезжать левый блок"

Левый блок находится в ячейке таблицы <td>, добавьте к тегу ячейки параметр valign="top".

Код листалки попробуйте доработать этот. http://forum.php-myadmin.ru/viewtopic.p … 8971#p8971

13 (изменено: Ladywind, 2011-06-21 04:37:01)

Re: Проблема кодировок

с боком разобралась, действительно все гениальное просто.
а с постраничной - уже крыша едет.
перепробовала кучу кодов, в основном такая проблема: кол-во страниц выводит, но когда жму на страницу 2 или дальше, выводит один и тот же материал с 1ой страницы. куда этот паразит хомячит другие статьи - остается загадкой...

например, такой вот кусочек: $result = mysql_query("SELECT COUNT(*) FROM post");
здесь нужно что-то менять под себя? потому как я поменяла post на news, которая является в уменя таблицей с новостями в бд.


вставила вот такую штуку:
<?php 
// Устанавливаем соединение с базой данных 
include "blocks/bd.php"; 
// Переменная хранит число сообщений выводимых на станице 
$num = 5; 
// Извлекаем из URL текущую страницу 
$page = $_GET['page']; 
// Определяем общее число сообщений в базе данных 
$result = mysql_query("SELECT COUNT(*) FROM news"); 
$posts = mysql_result($result, 0); 
// Находим общее число страниц 
$total = intval(($posts - 1) / $num) + 1; 
// Определяем начало сообщений для текущей страницы 
$page = intval($page); 
// Если значение $page меньше единицы или отрицательно 
// переходим на первую страницу 
// А если слишком большое, то переходим на последнюю 
if(empty($page) or $page < 0) $page = 1; 
  if($page > $total) $page = $total; 
// Вычисляем начиная к какого номера 
// следует выводить сообщения 
$start = $page * $num - $num; 
// Выбираем $num сообщений начиная с номера $start 
$result = mysql_query("SELECT * FROM news LIMIT $start, $num"); 
// В цикле переносим результаты запроса в массив $postrow 
while ( $postrow[] = mysql_fetch_array($result)) 
?>

по виду, все здорово и красиво и даже не ругается php. но как это добро вывести? нашла продолжение этого кода, он мнне на той же первой странице выводит странным образом остальные мои публикации, причем в другом порядке, а ниже страницы: 1,2,3, при переходе которых пишется, что страница не найдена.


http://vampire-diaries.charmed4.net/index2.php - вот так оно выглядит(

14

Re: Проблема кодировок

Ladywind сказал:

при переходе которых пишется, что страница не найдена.

Страница не найдена, потому что ссылка формируется неверно.
http://vampire-diaries.charmed4.net/page?page=2
Должно быть.
http://vampire-diaries.charmed4.net/index2.php?page=2

Причину того, что страницы не меняются смотрите в строке:
$result = mysql_query("SELECT * FROM news LIMIT $start, $num");

15

Re: Проблема кодировок

Hanut сказал:

Страница не найдена, потому что ссылка формируется неверно.

это я уже тоже заметила, теперь пытаюсь сообразить, как сформировать верно  roll

а вот с той строкой... получается "выбираем все из таблицы news начиная с номера $start, которой в свою очередь присваивается: $start = $page * $num - $num; 
а вот переменнася $num не знаю зачем..

16

Re: Проблема кодировок

пробовала вставлять http://forum.php-myadmin.ru/viewtopic.p … 8971#p8971

но ругался помоему жутко. под себя не настроила, видимо

17

Re: Проблема кодировок

Ladywind сказал:

$start = $page * $num - $num; 

Вероятно здесь ошибка и можно попробовать так:
$start = $page * $num;
или так:
$start = ($page - 1) * $num;

18

Re: Проблема кодировок

нижнюю часть кода переписала:


<?php 
// Проверяем нужны ли стрелки назад 
if ($page != 1) $pervpage = '<a href= ./index2.php?page=1><<</a> 
                               <a href= ./index2.php?page='. ($page - 1) .'><</a> '; 
// Проверяем нужны ли стрелки вперед 
if ($page != $total) $nextpage = ' <a href= ./index2.php?page='. ($page + 1) .'>></a> 
                                   <a href= ./index2.php?page=' .$total. '>>></a>'; 

// Находим две ближайшие станицы с обоих краев, если они есть 
if($page - 2 > 0) $page2left = ' <a href= ./index2.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | '; 
if($page - 1 > 0) $page1left = '<a href= ./index2.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | '; 
if($page + 2 <= $total) $page2right = ' | <a href= ./index2.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>'; 
if($page + 1 <= $total) $page1right = ' | <a href= ./index2.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';

// Вывод меню 
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage; 
?>



страницы стали работать, но как попало отображается все. все что надо и не надо и с повторами  sad

19

Re: Проблема кодировок

Причина в отсутствии заданного поля для сортировки. Обратите внимание на эту строку:
$result = mysql_query("SELECT * FROM news LIMIT $start, $num");
Измените ее добавив поле сортировки, обычно это поле даты/времени.
$result = mysql_query("SELECT * FROM news ORDER BY `time` LIMIT $start, $num");

20

Re: Проблема кодировок

изменила)
вот только получается все равно ерунда.
первых 5 статей (и даже 6я) выходят в правильном порядке (учитывая что их всего 5 должно быть),
а вот 7я является 5ой, 8я - 4ой, 9я - третьей, 10я - второй...))
я так и не пойму, почему они продолжают выводиться на той же странице

21

Re: Проблема кодировок

Ladywind сказал:

я так и не пойму, почему они продолжают выводиться на той же странице

Есть только один способ разобраться - посмотреть значения переменных $start и $num и выполнить запрос в phpMyAdmin.
SELECT * FROM news ORDER BY `time` LIMIT $start, $num

Либо посмотрите в phpMyAdmin как они сортируются в целом.
SELECT * FROM news ORDER BY `time`

22

Re: Проблема кодировок

что-то я все больше с каждым днем склоняюсь к мысли, что без "Платной on-line консультации" я не обойдусь  sad
друг советует не изобретать велосипед и строить сайт на wordpress, а я хочу все сама.  smile

23

Re: Проблема кодировок

вот не пойму. почему на локальном хосте на компе эти долбанные страницы отображаются, а на хосте в инете - нет.
а абсолютно одни и те же файлы с одними и теми же данными.

локалхост
http://i22.fastpic.ru/big/2011/0628/e5/a5b3ad693dbb3e8cdc7185feb5530be5.jpg

нелокалхост
http://i22.fastpic.ru/big/2011/0628/96/6e337982e4290ddb0edbb6a2c08b3c96.jpg

а делаю примерно следующее: есть страница index2.php, в которой в середине идет таблица, куда выгружаются данные из бд.
а за ней следует код включения страницы str.php, в которой происходит считывание кол-ва страниц и прочей фигни.


в index2.php

<?php 
        $result = mysql_query ("SELECT id,title,date,text FROM news",$db);
        $myrow = mysql_fetch_array ($result);
          
        do {
        
       printf ("<table align='center' class='articles'>
                <tr class='news_title'>
                <td><div class='data'>%s</div><h2 class='postheader'>%s</h2></td>
                </tr>
                <tr class='articles'>
                <td><p class=articles_text>%s</p></td>
                </tr>
                </table><br>", $myrow ["date"], $myrow ["title"],$myrow ["text"]   );
        }
          while ($myrow = mysql_fetch_array ($result));?>




<?php include ("str.php"); ?>

а в самой str:

<?
$result77 = mysql_query("SELECT str FROM options", $db);
$myrow77 = mysql_fetch_array($result77);
$num = $myrow77["str"];
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result00 = mysql_query("SELECT COUNT(*) FROM news WHERE cat='$cat'");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total =  intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
  if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start        
        

$result = mysql_query("SELECT id,title,date,author,text FROM news WHERE cat='$cat' order by date LIMIT $start, $num",$db);



// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=view_cat.php?cat='.$cat.'&page=1>Первая</a> | <a href=view_cat.php?cat='.$cat.'&page='. ($page - 1) .'>Предыдущая</a> | 

';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 1) .'>Следующая</a> | <a href=view_cat.php?cat='.$cat.'&page=' .

$total. '>Последняя</a>';

// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 5 > 0) $page5left = ' <a href=view_cat.php?cat='.$cat.'&page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=view_cat.php?cat='.$cat.'&page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=view_cat.php?cat='.$cat.'&page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=view_cat.php?cat='.$cat.'&page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=view_cat.php?cat='.$cat.'&page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';

if($page + 5 <= $total) $page5right = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=view_cat.php?cat='.$cat.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';

// Вывод меню если страниц больше одной

if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.

$nextpage;
echo "</div>";
}

?>

новости перестали выводиться должным образом - то есть нету порядка. ну и про страницы молчу.
а в локал хосте страницы выводятся, но нужным кол-вом и в нужном порядке не хотят.   sad  sad  sad  sad

24

Re: Проблема кодировок

Обратите внимание на то, как у вас начинается PHP код.
<?
Очевидно, сервер хостера не понимает такого сокращенного написания и не может обработать код внутри. Замените везде теги кода PHP на полные:
<?php ... ?>

Если за вывод новостей отвечает код в файле index2.php, то обязательно необходимо прописать поле сортировки и ограничения вывода в LIMIT.

$result = mysql_query ("SELECT id,title,date,text FROM news",$db);

При этом переменные $start и $num должны быть доступны до выполнения запроса, значит код листалки необходимо сформировать до его выполнения, например вложить его внутрь строковой переменной.