Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Кодировка


Автор: sssssss7 25.8.2009, 02:44
Собственно проблемы нет я решил что хотел но хотелось бы и еще понять почему так...
в настройках по умолчанию в mysql, сама база, таблица и поле в таблице везде стоит utf-8... а так же на сайте везде стоит кодировка UTF-8 но при добавление данных (русские слова =)) через скрипт php без строчки mysql_query("set names CP1251") добавляются иероглифы.. со строчкой mysql_query("set names CP1251")  всё нормально почему так?

Автор: Ипатьев 25.8.2009, 07:48
удивительный вопрос
казалось бы, при чем здесь CP1251...

Автор: skyboy 25.8.2009, 09:30
Цитата(sssssss7 @  25.8.2009,  01:44 Найти цитируемый пост)
через скрипт php без строчки mysql_query("set names CP1251")

в смысле - вместо "set names cp1251" у тебя стояло "set names utf8" и все равно не работало?

Автор: sssssss7 25.8.2009, 21:18
Цитата(skyboy @ 25.8.2009,  09:30)
Цитата(sssssss7 @  25.8.2009,  01:44 Найти цитируемый пост)
через скрипт php без строчки mysql_query("set names CP1251")

в смысле - вместо "set names cp1251" у тебя стояло "set names utf8" и все равно не работало?

всё и везде стоит UTF-8... а php отправляет нормальный текст только со строчкой set names cp1251, а если написать set names utf8 то оправляет каракули=) почему так не догоняю? ведь везде текст в UTF-8 и на сайте в базе, таблице.

Цитата

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


Просьба не ехидничать а пояснить... я новичек так что сильно не пинайте.. 

Автор: IZ@TOP 25.8.2009, 21:24
Цитата(sssssss7 @  25.8.2009,  22:18 Найти цитируемый пост)
а php отправляет нормальный текст только со строчкой set names cp1251, почему так не догоняю? 

м.б. потому, что в PHP данные приходят в кодировке cp1251?
А вообще гаданием на кофейной гуще занимаются обычно гадалки. Откуда данные, как соединяетесь с бд и т.п.? Хотите ответ - дайте больше информации.

Автор: sssssss7 25.8.2009, 21:29
я ж говорю есть страница index.php от туда идут данные в скрипт script.php а из него в базу... все страницы в utf-8
 
index.php
Код

<html>
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<form action="search_info.php" method="POST">
<input type="text" name="name" /><br />
<input type="submit" value="Поиск" />
</form>

</body>
</html>


script.php
Код

<?php  
   
    $date = date("d.m.y"); //присвоено 03.12.01
    $time = date("H:i:s"); //присвоит 1 элементу массива 17:16:17
    $name = $_POST['name'];
    $dblocation = "localhost";  
    $dbname = "porshe_search";  
    $dbuser = "root";  
    $dbpasswd = "";  
    $ip = $_SERVER['REMOTE_ADDR'];
    $dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);  
    if (!$dbcnx)  
      {  
        echo "<p>К сожалению, не доступен сервер mySQL</p>";  
        exit();  
      }  
  
    if (!mysql_select_db($dbname,$dbcnx) )  
      {  
        echo "<p>К сожалению, не доступна база данных</p>";  
        exit();  
      }  
   mysql_query("set names cp1251");
   $sql = "insert into info_search (date,time,ip,detal) values ('$date','$time','$ip','$name')";
        $result = mysql_query($sql);

        if ($result){
            echo "Добавлено успешно";
        } else {
            echo "There's been a problem: ".mysql_error();
        }


переменная $name

Автор: unicross 25.8.2009, 22:07
sssssss7, Вставьте в начало каждого файла строку:
Код

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

В файле search_info.php добавьте строки
Код

$name = $_POST['name'];
echo $name . "<br>";
echo "Проверка кодировки<br>";

Покажите результат выполнения (этих двух строк) в точном соответствии.

P.S. Данные ($name) не мешало бы обрабатывать с помощью функции mysql_real_escape_string() перед добавлением.

Автор: IZ@TOP 25.8.2009, 22:12
Ну и до кучи, вместо 
Код

mysql_query("set names cp1251");

установить соответствующую кодировку
Код

mysql_query("set names utf8");


Еще иногда полезно не плодить лишний код, особенно когда для вставки даты и времени существуют специальные функции типа NOW().
И поскольку date/time являются зарезервированными словами, не помешало бы их проэкранировать при помощи обратной кавычки (или как там ее правильно) "`date`, `time`".

Автор: sssssss7 25.8.2009, 22:55
Цитата(IZ@TOP @ 25.8.2009,  22:12)
Еще иногда полезно не плодить лишний код, особенно когда для вставки даты и времени существуют специальные функции типа NOW().

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

по теме:
вот обьедененный полный код index.php... переменная name отображается нормально(по русски) в базу заносится тоже нормально но остальной текст знаками вопроса в ромбике..


Код

<?php  header("Content-Type: text/html; charset=utf-8");?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body>
    <form action="index.php" method="POST">
      Деталь<input type="text" name="name" /><br />
      <input type="submit" value="Поиск" />
    </form>
  </body>
</html>
<?php  
    $mydate = date("d.m.y"); //присвоено 03.12.01
    $mytime = date("H:i:s"); //присвоит 17:16:17
    $name = $_POST['name'];
    echo $name . "<br>";
    echo "Проверка кодировки<br>";
    $escape_name = mysql_real_escape_string($name);
    $dblocation = "localhost";  
    $dbname = "porshe_search";  
    $dbuser = "root";  
    $dbpasswd = "";  
    $ip = $_SERVER['REMOTE_ADDR'];
    $dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);  
    if (!$dbcnx)  
      {  
        echo "<p>К сожалению, не доступен сервер mySQL</p>";  
        exit();  
      }  
  
    if (!mysql_select_db($dbname,$dbcnx) )  
      {  
        echo "<p>К сожалению, не доступна база данных</p>";  
        exit();  
      }  
   mysql_query("set names utf8");
   
   $sql = "insert into info_search (date,time,ip,detal) values ('$mydate','$mytime','$ip','$escape_name')";
        $result = mysql_query($sql);

        if ($result){
            echo "Добавлено успешно";
        } else {
            echo "Проблемка: ".mysql_error();
        }
?>


перевел сам файл notepad ++ в utf-8 всё гуд... вопрос поскажите пожалуйста какой редактор хороший для написания кода для php чтоб он переводил файлы в utf-8 ну и подсветка чтоб была или notepad ++ нормальный редактор?

Автор: unicross 25.8.2009, 23:15
А как все может быть нормально, если строка
Цитата(sssssss7 @  25.8.2009,  23:55 Найти цитируемый пост)
    $escape_name = mysql_real_escape_string($name);

расположена перед строкой
Цитата(sssssss7 @  25.8.2009,  23:55 Найти цитируемый пост)
    $dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);  

? Функция mysql_real_escape_string() требует подключения к базе данных...
Цитата(sssssss7 @  25.8.2009,  23:55 Найти цитируемый пост)
или notepad ++ нормальный редактор?

 smile Лучше еще не нашел
Цитата
а где лишний код.. если мне надо раздельно записать дату и время и именно в таком формате?

IZ@TOP, прав! Для хранения даты и времени нужно использовать специальные форматы полей. И использовать специальные функции для вставки... А вот выводить можете в любом другом формате...

Автор: Ипатьев 25.8.2009, 23:18
Мне кажется, автор не спрашивал, как ему поступить, а спрашивал, почему происходит описываемый эффект.
Каюсь, сам я жестоко протупил, и каким-то образом во второй команде увидел почему-то utf8. Отчего и удивился.

Собственно, вопроса два.
1. почему без set names получаются "иероглифы" (кстати, со всех бедолаг, пострадавших от кодировок, надо в обязательном порядке требовать пример этих "иероглифов". которые тут же скажут специалисту направление перекодировки)? Очень просто: с базой мы работаем по протоколу клиент-сервер. И хоть обвыставляйся на сервере, но клиент это не затронет никак. А если на клиенте кодировка не задана, то она выбирается по умолчанию, latin1.

2. почему не помогает set names utf8. Тут я могу только предположить, что страницы, на самом деле, не в ней, а в 1251


Автор: IZ@TOP 26.8.2009, 00:15
Ипатьев, лучше сразу подсказать, что бы потом меньше вопросов было ;) Соответственно, меньше новых тем с глупыми вопросами  smile 
Ну и более того, понудеть никто ведь старикам не запретит?  smile

Добавлено через 2 минуты и 55 секунд
sssssss7, лишний код в присвоении даты переменным. Советую очень внимательно ознакомиться с разделом http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html.
Хороший редактор: Zend Studio 7, netBeans или аналогичные.

Автор: sssssss7 26.8.2009, 02:05
Всем спасибо вроде как разобрался... и еще много полезного узнал.. учится и учится=).. IZ@TOP за прогу netBeans отдельное спасибо пока она лучшая. Zend Studio 7 что то навороченная слишком трудно разобратся. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)