|
|
|
| В локальной сети все работает как надо. Установлен MySQL 4.1.13 и phpMyAdmin 2.6.3-pl1. БД с кодировкой utf8-unicode.
На буржуйском хостинге находится зеркало моего сайта, на котором я поставил статьи. Статьи (заголовок, текст и источник) выводятся из БД MySQL 4.0.25. Кодировками я на хостинге через phpMyAdmin управлять не могу и какая там кодировка стоит по умолчанию, мне не известно, но наверное western.
Загрузил значит я в ихнию БД dump. Открываю страницу со статьями на сайте, вижу русские буквы, как положенно, но со срезанным текстом:(
Это список статей на локалке:
Древний Рецепт Омоложения
Теософская Сказка О Зеркалах
|
А это на хостинге:
Древний Рецепт Омоложен&
Теософская Сказка О Зерк
|
Локалка:
Сергей Матвееф (Магия Денег)
|
Хостинг:
Сергей Матвееф (Магия Ден
|
Самое интресное, что срезаются поля varchar(150), тогда как текст статьи(text)выглядит нормально.
Что делать и в чем проблема? | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 07:59)
| | Короче понял проблему, если кто с с подобным столкнется, будете умнее.
Оказалось что вот это по русски: Древний Рецепт Омоложения
На языке чуждой кодировки переводится вот так:
Древний Рецепт Омоложения
|
Естественно длины поля не хватает, значит надо зарезервировать больше места.
Вместо varchar(150 )я поставил varchar(500). | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 14:23)
| | Это - phpMyAdmin, когда не выбрана русская кодировка - он русские буквы в HTML-аналоги преобразует. Лучше загрузите дамп на сервер через FTP и перебросте его при помощи PHP. В любом случае в таком виде лучше не выводить - будут проблемы с поисковыми роботами. Для того, чтобы обратно преобразовать HTML-последовательности в русский текст, необходимо использовать функцию html_entity_decode(). | |
|
|
|
|
|
|
|
для: cheops
(09.10.2005 в 14:27)
| | Функция html_entity_decode() служит для того чтобы текст из дампа перекодировать или же из БД на страницу?
Дело в том что в дампе у меня кириллица. | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 14:40)
| | Эта функция перекодирует текст вида
Древний Рецепт Омоложения
|
в
Древний Рецепт Омоложения
|
Если вы примете решение хранить в базе текст в виде HTML-символов, то перед выводом лучше пропускать их через эту функцию. | |
|
|
|
|
|
|
|
для: cheops
(09.10.2005 в 14:52)
| | Хорошо, ну а если я хочу чтобы у меня в phpMyAdmin был русский текст а не абракадабра что мне делать, iconv()использовать и вообще получится ли если база в латинской кодировке? | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 15:10)
| | После того, как тест засобачен в базу данных при помощи phpMyAdmin и обезображен им - необходимо при помощи UPDATE из PHP скрипта пройтись этой функцией по всей базе и преобразовать HTML-представления в обычные символы - iconv() тут бессилен, так как смены кодировки не происходит - происходит кодирование в HTML-символы. | |
|
|
|
|
|
|
|
для: cheops
(09.10.2005 в 21:41)
| | Хорошо, это тоже понятно. И послужит только в том случае если мне надо переконвертировать имеющиеся данные. А как поступать с новыми, чтобы они сразу записывались как надо?
Раннее упомянулось о переброске дампа средствами PHP, это как? | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 21:59)
| | 1) Если новые данные будут идти не через phpMyAdmin - они будут записываться без искажений.
2) Перебросить дамп средствами PHP можно при помощи скрипта по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1407 (он не совершенен и бывает сбоит). | |
|
|
|
|
|
|
|
для: cheops
(09.10.2005 в 22:13)
| | Спасибо, попробую. | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 22:18)
| | Создал новую страницу со скриптом приведенным по ссылке для залития данных через файл.
Поставил файл .sql на сервер.
Ошибок никаких скрипт не выдает, но и выполнятся не хочет. После запуска скрипта база данных остается интактной... | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 22:48)
| | Вообще-то я не посмотрел... там достаточно специфический код... Замените блок
<?php
// Разбиваем содержимое файла по точке с запятой
$quer = preg_split("|\);\r\n|", $bufer);
// Выполняем SQL-запросы
foreach($quer as $query)
{
if(!mysql_query($query.")"));
}
?>
|
на
<?php
// Разбиваем содержимое файла по точке с запятой
$quer = preg_split("|;\r\n|", $bufer);
// Выполняем SQL-запросы
foreach($quer as $query)
{
if(!mysql_query($query"));
}
?>
|
А лучше перед тем как выполнять запросы - промоделируйте ситуацию, выведите дамп массива $quer - посмотрите что внутри
<?php
echo "<pre>";
print_r($quer);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 07:59)
| | Содержимое файла отображается, а вот запрос в БД почему-то не происходит.
Ошибок нет.
Array
(
[0] => -- phpMyAdmin SQL Dump
-- version 2.6.3-pl1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Oct 09, 2005 at 02:22 PM
-- Server version: 4.1.13
-- PHP Version: 5.0.4
--
-- Database: 'client'
--
-- --------------------------------------------------------
--
-- Table structure for table 'religion_articles'
--
CREATE TABLE 'religion_articles' (
'Article_Id' int(11) NOT NULL auto_increment,
'Article_Name' varchar(250) NOT NULL default '',
'Article_Text' text NOT NULL,
'Article_Source' varchar(250) default NULL,
PRIMARY KEY ('Article_Id')
) ENGINE=MyISAM;
--
-- Dumping data for table 'religion_articles'
--
INSERT INTO 'religion_articles' VALUES (3, '??????? ?????? ??????????', '????...r\n', NULL);
INSERT INTO 'religion_articles' VALUES (4, '?????.\r\n', '?????? ??????? (????? ?????)' ...);
)
|
А это скрипт:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Data Dump</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<?php
// Адрес базы данных
$dblocation = "localhost";
// Имя базы данных
$dbname = "xxxx";
// Имя пользователя...
$dbuser = "xxxx";
// Пароль
$dbpasswd = "xxxx";
// Соединяемся с сервером базы данных - нужно получить соединение
// по которому мы будем отправлять запросы базе данных и получать
// ответы (данные или сообщения об успешности выполнения запросов)
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx)
{
echo( "<P>No connection.</P>" );
exit();
}
// Выбираем базу данных - этой функцией мы сообщаем с какой
// базой данных мы будем работать, заметте, что вторым
// параметром мы передаем дискриптор соединения $dbcnx,
// который вернула функция mysql_connect
if (! @mysql_select_db($dbname,$dbcnx) )
{
echo( "<P>No connection.</P>" );
exit();
}
// Имя файла с SQL-инструкциями
$filename = "religion_articles.sql";
// открываем его и читаем в буфер
$fp = fopen($filename, "r");
$bufer = fread($fp,filesize($filename));
fclose($fp);
// // Разбиваем содержимое файла по точке с запятой
$quer = preg_split("|;\r\n|", $bufer);
echo "<pre>";
print_r($quer);
echo "</pre>";
if(isset($_POST['submit')){
// Выполняем SQL-запросы
foreach($quer as $query)
{
if(!mysql_query($query));
}
}
?>
</head>
<body>
<h1>Dump Data From SQL FIle</h1>
<form action="data_dump.php" method="post" name="form1">
<h2>Click the button to dump data</h2>
<hr />
<input name="submit" type="submit" value="submit" />
</form>
</body>
</html>
|
Может я где-то ошибку допустил? | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 23:32)
| | 1) Удалите из дампа все комментарии, которые начинаются на --
2) Исправьте регулярное выражение на
<?php
$quer = preg_split("|;[\s]*\r\n|", $bufer);
?>
|
там в конце каждого выражения пробел идёт...
3) В строке
<?php
if(isset($_POST['submit')){
?>
|
у вас пропущена квадратная скобка ] | |
|
|
|
|
|
|
|
для: cheops
(10.10.2005 в 00:34)
| | Вы знаете, испробовал скрипт на локальной машине, та же проблема.
Ничего не происходит... | |
|
|
|
|
|
|
|
для: codexomega
(10.10.2005 в 00:58)
| | А сколько элементов в массиве получается? | |
|
|
|
|
|
|
|
для: cheops
(10.10.2005 в 14:46)
| | Прошу прощения за несмышленность, в каком массиве?
В том что идет цикл for each?
Почему то всего один.
И вообще меня смущает данная инструкция.
foreach($quer as $query)
{
if(!mysql_query($query));
}
|
Она ничего не делает.
В файле .sql можно написать все что угодно и неправильный синтаксис поставить и всякую абракадабру написать, инструкция к нему даже не обращается и в результате ничего не происходит. | |
|
|
|
|
|
|
|
для: codexomega
(10.10.2005 в 19:52)
| | Хм... как раз лабуды в файле и не должно быть :))) там должны быть только SQL-запросы. | |
|
|
|
|
|
|
|
для: cheops
(10.10.2005 в 21:34)
| | Это я понимаю.
У меня в файле и есть только SQL запросы без всяких лишних коментариев и с корректным синтаксисом.
Но если я нарошно, ради теста напишу в файле вякую ерунду, мне же не выдается никакая ошибка.
А запрос вообще, даже самый правильный не выполняется.
С чем связано? | |
|
|
|
|
|
|
|
для: codexomega
(10.10.2005 в 19:52)
| | Поламов немного голову, я поставил в код вывод ошибки в случае неправильного запроса. Не знаю, почему раньше этого не сделал.
Короче первое что я сделал, так это удалил кавычки из запроса, в которые было заключено название таблицы.
Все пошло как надо. Ура!
Странно, но я такое уже делал вчера, но у меня оно не заработало.
Наверное тут еще и код был виноват.
Теперь он у меня такой:
foreach($quer as $query)
{
if(!mysql_query($query))
exit("Error - ".mysql_error());
}
|
А это мой запрос в файле .sql:
INSERT INTO religion_articles VALUES ('', 'ABC','123', NULL);
INSERT INTO religion_articles VALUES ('', 'XY23','456', NULL);
|
Большое спасибо за помощь.
Осталось проверить на хосте, будет ли выполнятся все правильно и вместо значков html, увижу ли я в моей БД буквы. | |
|
|
|
|
|
|
|
для: codexomega
(10.10.2005 в 22:59)
| | На хосте проверил. Но теперь вместо htmlосвких значков знаки вопроса.
Дело в том что файл .sql никак не принимается той системой и не расшивровывается, в коде ASCII не хватает значений.
Вообщем я решил не крутить мозги и воспользоваться взамен функцией html_entity_decode().
Проверю что получится. | |
|
|
|
|
|
|
|
для: codexomega
(11.10.2005 в 09:02)
| | А на хосте версия MySQL какая? | |
|
|
|
|
|
|
|
для: cheops
(11.10.2005 в 15:05)
| | 4.0.25
Но дело наверное не в версии.
У меня тоже ни фига не идет с MySQL 4.1 на английском OS
Я попробовал редактировать sql файл в блокноте. При сохранении, блокнот выдает что в файле содержатся элементы unicode и если я не хочу потерять формат, то должен сохранить как unicode.
Сохраняю.
Запускаю скрипт.
Теперь данные в формате unicode, но синтаксическая ошибка:
(
Array
(
[0] => INSERT INTO religion_articles VALUES ('', 'Статья первая','Текст статьи', NULL);
)
Error - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO religion_articles VALUES ('', 'Статья первая','Тек' at line 1
|
Может там какие-то дополнительные спрятанные кодировки прибавляются, которых в тексте не видно? | |
|
|
|
|
|
|
|
для: codexomega
(11.10.2005 в 16:41)
| | Вы при сохранении данных в блокноте в последнем выпадающем списке что выбираете ANSI или Юникод? | |
|
|
|
|
|
|
|
для: cheops
(11.10.2005 в 23:41)
| | Юникод, потому что в ANSI теряется кодировка букв и получаются знаки вопроса, которые ничем нельзя расшивровать. | |
|
|
|
|
|
|
|
для: codexomega
(09.10.2005 в 07:59)
| | Вообщем так.
Поставлю я лучше форму на хост и буду через нее записи вставлять в таблицу.
Ведь таким образом данные не проходят обработку в phpMyAdmin.
Так будет проще.
Надоело возится с этими sql файлами. | |
|
|
|
|
|
|
|
для: codexomega
(12.10.2005 в 22:48)
| | Создал форму для SQL запросов, содержащую текстовое поле и кнопку Submit.
Но теперь проблема с регулярным выражением.
Вот запрос:
INSERT INTO zagovor_category VALUES ('', 'Дела житейские');
INSERT INTO zagovor_category VALUES ('', 'Здоровье');
INSERT INTO zagovor_category VALUES ('', 'Защита');
INSERT INTO zagovor_category VALUES ('', 'Удача');
INSERT INTO zagovor_category VALUES ('', 'Хозяйство');
INSERT INTO zagovor_category VALUES ('', 'Любовь');
INSERT INTO zagovor_category VALUES ('', 'Деньги и богатство');
INSERT INTO zagovor_category VALUES ('', 'Сглаз и порча');
INSERT INTO zagovor_category VALUES ('', 'Все');
|
Это код PHP:
if(isset($_POST['sql_string']))
$sql_string=$_POST['sql_string'];
else
$sql_string="";
if(isset($_POST['submit'])){
$sql_string_formatted = preg_split("|;[\s]*\r\n|", $sql_string);
echo "<pre>";
print_r($sql_string_formatted);
echo "</pre>";
foreach($sql_string_formatted as $query)
{
if(!mysql_query($query.")"))
exit("Error - ".mysql_error());
}
// show confirmation
echo 'Your informations were successfully added!';
}
|
А это результат:
Array
(
[0] => INSERT INTO zagovor_category VALUES (\'\', \'Дела житейские\')
[1] => INSERT INTO zagovor_category VALUES (\'\', \'Здоровье\')
[2] => INSERT INTO zagovor_category VALUES (\'\', \'Защита\')
[3] => INSERT INTO zagovor_category VALUES (\'\', \'Удача\')
[4] => INSERT INTO zagovor_category VALUES (\'\', \'Хозяйство\')
[5] => INSERT INTO zagovor_category VALUES (\'\', \'Любовь\')
[6] => INSERT INTO zagovor_category VALUES (\'\', \'Деньги и богатство\')
[7] => INSERT INTO zagovor_category VALUES (\'\', \'Сглаз и порча\')
[8] => INSERT INTO zagovor_category VALUES (\'\', \'Все\');
)
Error - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'\', \'Дела житейские\'))' at line 1
|
Запрос из файла вроде работал, а строка не хочет.
Что здесь не так?
Спасибо. | |
|
|
|
|
|
|
|
для: codexomega
(15.10.2005 в 18:45)
| | Пропустите запрос через stripslashes()
<?php
if(isset($_POST['sql_string']))
$sql_string=$_POST['sql_string'];
else
$sql_string="";
if(isset($_POST['submit'])){
$sql_string_formatted = preg_split("|;[\s]*\r\n|", $sql_string);
echo "<pre>";
print_r($sql_string_formatted);
echo "</pre>";
foreach($sql_string_formatted as $query)
{
if(!mysql_query(stripslashes($query).")"))
exit("Error - ".mysql_error());
}
// show confirmation
echo 'Your informations were successfully added!';
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(16.10.2005 в 15:26)
| | Большое спасибо cheops!
Наконец-то моя проблема решена.
В БД записывается текст вместо знаков HTML.
Правда в последнем сообщении, в коде я допустил ошибку, добавил лишнюю скобку.
if(!mysql_query(stripslashes($query).")"))
|
Вот исправленный код который работает, если кому еще понадобится:
<?php
// Insert data
if(isset($_POST['sql_string']))
$sql_string=$_POST['sql_string'];
else
$sql_string="";
if(isset($_POST['submit'])){
$sql_string_formatted = preg_split("|;[\s]*\r\n|", $sql_string);
echo "<pre>";
print_r($sql_string_formatted);
echo "</pre>";
foreach($sql_string_formatted as $query)
{
if(!mysql_query(stripslashes($query)))
exit("Error - ".mysql_error());
}
// show confirmation
echo 'Your informations were successfully added!';
}
?>
|
| |
|
|
|