Re: Смена кодировки базы в phpMyAdmin
3001
Попробуйте заменить строку:
[mono]while ($data = fgetcsv ($fp, 0, ";")) {[/mono]
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум PHP-MyAdmin.RU → Работа с phpMyAdmin → Смена кодировки базы в phpMyAdmin
3001
Попробуйте заменить строку:
[mono]while ($data = fgetcsv ($fp, 0, ";")) {[/mono]
Hanut
Безрезультатно
3001
Тогда начните с проверки данных в csv файле. Запустите скрипт и посмотрите как все выглядит, есть ли потери данных или еще какие-то странности. Дальше наращивайте функции, пока не найдете ошибку.
<?php
$fp = fopen ("/tmp/temp.csv","r");
while ($data = fgetcsv ($fp, 0, ";")) {
if($data[0]>0){
print_r($data);
}
}
?>
Hanut
Буду пробовать. Кстати, в этом скрипте в этой функции на старом хостинге путь был такой "tmp/temp.csv", на новом хостинге с ним уже не работал (вообще ничего не грузил, die() из скрипта выдавал). Изменил на "/tmp/temp.csv", тогда стал грузить, но не корректно. Имеет ли это значение? Попробовал в корень сайта сначала закачать csv, а потом из него загружать. Результат тот же. Заметил вот еще что, в форме, которая отправляет файл
<form action="файл.php" method="post" ENCTYPE="multipart/form-data">
интересует это что?
ENCTYPE="multipart/form-data">
3001
Если файл temp.csv загружается в каталог tmp находящийся в корне сервера, то тогда так: /tmp/temp.csv
Без первого слеша будет путь относительно скрипта и значит нужен каталог tmp с разрешением на запись.
Попробуйте без загрузки.
Это убрать:
if(move_uploaded_file($_FILES['f']['tmp_name'],"/tmp/temp.csv"))
{echo "<p>файл успешно загружен</p>!";}
else {die("ошибка с загрузкой файла");}
Здесь указать путь к загруженному файлу (относительный, или полный):
$fp = fopen ("/tmp/temp.csv","r");
ENCTYPE="multipart/form-data" - Это аттрибут указывающий загрузку файла через форму. Без него файл не загрузится.
Hanut
Спасибо, я как раз это уже попробовал. Загрузил csv, поменял пути, скрипт сработал, но все также половину кириллицы добавил, половину нет Все мысль о не добавлении кириллицы в верхнем регистре мне покоя не давала. Заменил Слова на слова в csv, то же самое, "проглатываются" кириллица, регистр значения не имеет.
<?php $fp = fopen ("/tmp/temp.csv","r"); while ($data = fgetcsv ($fp, 0, ";")) { if($data[0]>0){ print_r($data); } } ?>
Попробовал, что сказать, никаких аномалий не увидел, все тексты отображаются корректно, те места, которые в базе пусты, скрипт вывел нормально, как и должно быть. Уже не удобно Вас просить, но может поможете и далее дилетанту, что далее нужно проверить? Результат выполнения кода выложить?
Идем дальше по коду и смотрим как отрабатывает замена одинарной кавычки. Здесь мне не понятно зачем экранирован слешем амперсанд, попробуйте убрать слеш.
<?php
$fp = fopen ("/tmp/temp.csv","r");
while ($data = fgetcsv ($fp, 0, ";")) {
if($data[0]>0){
if($data[0]>0){
while (list ($key, $val) = each ($data)) {
$data[$key]=str_replace("'","\’",$data[$key]);
$data[$key]=trim($data[$key]);
}
print_r($data);
}
}
?>
Hanut
Посмотрел все еще раз внимательнее и обнаружил, что на выполнении уже этого кода (первого)
<?php $fp = fopen ("/tmp/temp.csv","r"); while ($data = fgetcsv ($fp, 0, ";")) { if($data[0]>0){ print_r($data); } } ?>
обнаруживается эта ошибка. Вот пример вывода этого кода:
[spoiler]Array ( [0] => 157 [1] => [2] => Bandidas [3] => [4] => 89 [5] => 1 [6] => 1280x544 [7] => [8] => 2006 [9] => [10] => , Эспен Сандберг [11] => , Сэлма Хайек, Стив Зан [12] => , пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город. [13] => [14] => Video: MPEG4 Video (H264) 1280x544 25.00fps [French, Bandidas (Video 1)] Audio: Dolby AC3 48000Hz 6ch [Russian, Russian (Audio 1)] Audio: Dolby AC3 48000Hz 6ch [English, English (Audio 2)] Subtitle: SubStation Alpha [English, English (Subtitle 1)] Subtitle: SubStation Alpha [German, German (Hearing Impaired) (Subtitle 2)] ) [/spoiler]
В Array [1] => должно быть название фильма (кириллицей)
Array [3] => перевод (тоже кириллицей)
и. т.д. а Array [12] => должен содержать [spoiler]не это " , пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город." А это "В Мехико на рубеже веков две совершенно непохожих друг на друга женщины из разных слоев общества становятся парочкой грабительниц банков, пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город."[/spoiler]
Hanut, извините за невнимательность
Раз это самые первые строки выполняемого кода, то, возможно, имеет значение, что еще есть в файле перед выполняемым кодом. Только это. См.
[spoiler]<?include"adminhead.php";
$type=$_POST["type"];
$parse=$_POST["parse"];
?>
<h2>Обновление базы фильмов</h2>
<? if($parse!="go"){ ?>
<form action="файл.php" method="post" ENCTYPE="multipart/form-data">
<p>Загрузить файл .CSV<br>
<input type="file" name="f"></p>
<p><input type="hidden" name="parse" value="go"></p>
<p>Файл относится к: <input type="radio" name="type" value="mpeg4" id="typempeg4" checked> <label for="typempeg4">mpeg4</label>
<input type="radio" name="type" value="dvd" id="typedvd"> <label for="typedvd">DVD</label>
<input type="radio" name="type" value="hdtv" id="typehdtv"> <label for="typehdtv">HDTV</label>
</p>
<p><input type="submit" value="закачать"></p>
</form>[/spoiler]
Далее код http://forum.php-myadmin.ru/viewtopic.p … 964#p10964 и подвал <?include"adminfoot.php";?>
В Array [1] => должно быть название фильма (кириллицей)
Array [3] => перевод (тоже кириллицей)
и. т.д. а Array [12] => должен содержать
Теперь найдите в csv файле эти данные и покажите их (желательно всю строку). Похоже csv не корректен и функция fgetcsv() разбирает его неверно. Надо посмотреть нет ли там лишних неэкранированных кавычек.
Правила csv:
разделитель значений (точка с запятой) - ;
Обрамление строк (двойная кавычка) - "
Экранирование (обратный слеш) - \
Hanut
Похоже на то, но в csv ничего необычного не обнаружил. Вот строка
[spoiler]157 Бандитки Bandidas Многоголосный 89 1 1280x544 Вестерн 2006 США Йоахим Роеннинг, Эспен Сандберг Пенелопа Крус, Сэлма Хайек, Стив Зан В Мехико на рубеже веков две совершенно непохожих друг на друга женщины из разных слоев общества становятся парочкой грабительниц банков, пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город. Video: MPEG4 Video (H264) 1280x544 25.00fps [French, Bandidas (Video 1)] Audio: Dolby AC3 48000Hz 6ch [Russian, Russian (Audio 1)] Audio: Dolby AC3 48000Hz 6ch [English, English (Audio 2)] Subtitle: SubStation Alpha [English, English (Subtitle 1)] Subtitle: SubStation Alpha [German, German (Hearing Impaired) (Subtitle 2)]
Сам файл выложил сюда http://depositfiles.com/files/pvsasrbo8
[/spoiler]
Скачал ваш файл и использовал данный скрипт, никаких сложностей, все работает.
<?php
$fp = fopen ("/tmp/temp.csv","r");
while ($data = fgetcsv ($fp, 0, ";")) {
if($data[0]>0){
print_r($data);
}
}
?>
Значит csv в порядке, скрипт скорее-всего тоже, а вот что является причиной столь странной работы сервера - я даже не знаю.
Hanut
Может быть какой-то совет дадите, может быть переписать как-то код, чтоб подгружал не из csv, а другого файла? Или теребить службу поддержки хостинга? Даже не знаю какие им вопросы задавать. Они пишут, мол, обращайтесь к разработчику скрипта. А где я его найду, уже несколько лет прошло Я вот тут подумал, возможно это fgetcsv() работает не корректно на этом хостинге, а вернее с этой версией php, а стоит у хостера php 5.2.12 (spaceweb кстати). Узнал, что на старом хостинге была версия php 4.3.9. Вы на какой тестировали, если не секрет? Возможно это http://www.bvisoft.com/reads/413.php решение проблемы, накопал тут, не поможете реализовать? Там есть такой пункт 3:
Мы не имеем доступа к настройкам сервера, так что о быстром исправлении работы функции fgetcsv не может идти и речи.
интересно, а с помощью .htaccess эти коррективы внести нельзя.
3001
Попробуйте установить локаль. Если данной локали на сервере нет, то будем думать дальше.
Есть еще вариант: перекодировать данные в utf8, разобрать csv и вернуть назад кодировку cp1251.
<?php
@setlocale(LC_ALL, 'ru_RU.CP1251');
$fp = fopen ("/tmp/temp.csv","r");
while ($data = fgetcsv ($fp, 0, ";")) {
if($data[0]>0){
print_r($data);
}
}
?>
Тестировал на PHP 5.2.11.
Вариант кода по ссылке не будет работать в вашем случае, так как разбивает строки по символу перевода строки, а в csv файле есть поля имеющие перевод строки.
Hanut
По моему сработало Результат вывода в нашем примере:
[spoiler]Array ( [0] => 157 [1] => Бандитки [2] => Bandidas [3] => Многоголосный [4] => 89 [5] => 1 [6] => 1280x544 [7] => Вестерн [8] => 2006 [9] => США [10] => Йоахим Роеннинг, Эспен Сандберг [11] => Пенелопа Крус, Сэлма Хайек, Стив Зан [12] => В Мехико на рубеже веков две совершенно непохожих друг на друга женщины из разных слоев общества становятся парочкой грабительниц банков, пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город. [13] => [14] => Video: MPEG4 Video (H264) 1280x544 25.00fps [French, Bandidas (Video 1)] Audio: Dolby AC3 48000Hz 6ch [Russian, Russian (Audio 1)] Audio: Dolby AC3 48000Hz 6ch [English, English (Audio 2)] Subtitle: SubStation Alpha [English, English (Subtitle 1)] Subtitle: SubStation Alpha [German, German (Hearing Impaired) (Subtitle 2)] )[/spoiler]
Попробую вписать эту строку @setlocale(LC_ALL, 'ru_RU.CP1251'); уже в сам скрипт. Через пару часиков сообщу о результате. А можно поподробнее об этой конструкции, что она делает?
3001
В документации к функции fgetcsv() есть сноска по поводу обязательной установки локали при использовании однобайтных кодировок.
http://lv.php.net/manual/en/function.fgetcsv.php
Функция setlocale() устанавливает используемую локализацию, то есть, функции работающие с текстом, вроде strtoupper(), будут знать какие таблицы символов использовать для преобразования. Так же локализация действует и на некоторые внутренние преобразования данных, к примеру: у функции date() есть параметр F, который выводит название месяца; при изначальной локализации en_US, [mono]date('F');[/mono] выведет January, а при смене локализации на ru_RU, вывод будет по-русски "Январь".
Обычно локализация прописывается в основном конфигурационном файле, до начала основного кода.
Hanut
Сработало, моей радости нет предела Помедленнее, по-моему, файл загружаться стал, но это субъективно - главное результат есть - скрипт работает корректно. Как я могу Вас отблагодарить? Серьезно, от души. Не знаю, пьете ли Вы пиво, но с удовольствием "проставился" бы, как говориться.
Да и из за географической удаленности это вряд ли возможно. Может сайт какой рекламный просмотреть или денежку на WM, я-д или мобильный положить?
Hanut
Может быть еще с одним маленьким скриптом поможете? Если нет, я пойму, Вы итак для меня очень многое сделали.
На основе вот того csv файла пытаюсь сделать выборку по алфавиту. С кириллицей вроде все получилось
$sql2="SELECT*FROM kino_films WHERE filmName like '$letter%' and filmType='$type' ORDER BY filmName";}
а вот хотел еще сделать. чтоб выборка шла по оригинальному названию (латиница) и сортировка по алфавиту, но столкнулся с такой проблемой, что эти оригинальные названия есть как в столбце filmName, так и filmOname одной и той же таблицы kino_films. Запрос
$sql2="SELECT*FROM kino_films WHERE (filmName LIKE '$oletter%' OR filmOname LIKE '$oletter%') AND filmType='$type' ORDER BY filmOname";}
Приводит к тому, что те данные, начинающиеся с латиницы в filmName, выводятся хаотично, а в filmOname как следует из ORDER BY filmOname. И строго сначала из столбца filmName, потом filmOname. Как бы мне их отсортировать все независимости от столбца и по алфавиту? Пример:
[spoiler]Выводит: (первые 2 из filmName хаотично, остальные 3 из filmOname по алфавиту)
Andrea Bocelli. Vivere. Live in Tuscany
AC DC. Live at Donington
Alfie
Alpha Dog
Apocalypse Now Redux
А должен независимо от столбцов, все по алфавиту:
AC DC. Live at Donington
Alfie
Alpha Dog
Andrea Bocelli. Vivere. Live in Tuscany
Apocalypse Now Redux
[/spoiler]
И еще в каталоге есть названия, начинающиеся с цифр, как сделать так, чтоб, скажем передав переменной ?letter=1 (или ?oletter=1), вывелись все фильмы, начинающиеся с цифры из столбца filmName (filmOname соответственно), ума не приложу. Буду рад любой помощи или намеку на дальнейшие действия.
(SELECT *, `filmName` AS `order` FROM `kino_films` WHERE `filmName` LIKE '$oletter%' AND `filmType`='$type')
UNION
(SELECT *, `filmOname` AS `order` FROM `kino_films` WHERE `filmOname` LIKE '$oletter%' AND `filmType`='$type')
ORDER BY `order`
С цифрами все точно так же, как и с буквами.
Страница помощи проекту здесь: http://php-myadmin.ru/about/
Hanut
Ваш код помог, большое спасибо. А про цифры я наверно не так выразился. Нужно не ?letter=0, ?letter=1 и т.д., а нажал раз на ссылку вида ?letter=0 и вывелись все, начинающиеся на цифру.
Hanut
Спасибо за помощь, пожертвовал 300р. на я-д. Отличный проект, очень понравилось из http://php-myadmin.ru/about/
[spoiler]Бывает, новички задают простые, тривиальные вопросы, и самое главное здесь — просто быть внимательным к ним.[/spoiler]
Отлично сказано, самого не раз футболили напыщенные админы, модераторы подобных форумов по вопросам программирования. Мол, что Вы задаете такие вопросы, это и ежу понятно, идите читайте мануал, вместо конкретной помощи. Даже прочитав эти тома, новичку сложно будет что-то понять без помощи. Важно помнить, что человек может быть чайником в одном, но профи в другом. И завтра нынешние профи могут стать чайниками и, возможно, будут задавать уже мне такие же "глупые" вопросы. Спасибо за помощь, за терпение и внимание. Не подумайте, я не прощаюсь , просто решил поблагодарить. Думаю, что у меня будут еще вопросы и на Вашем форуме я задержусь.
В таком случае нужен поиск по регулярному выражению, пример:
SELECT * FROM `kino_films` WHERE `filmName` REGEXP '^[[:digit:]]+';
Спасибо за перевод, деньги мы получили, можете быть уверены, что они будут потрачены именно на проект.
Всегда добро пожаловать.
Hanut
Что-то не получатся, не хочет выбирать.
3001
Попробуйте в phpMyAdmin этот запрос выполнить.
Покажите как выглядит ваш запрос.
Попробуйте в phpMyAdmin этот запрос выполнить.
Работает, все выбирается как нужно.
Спасибо, решил пойти по другому пути ?letter=0, ?letter=1 и т.д.
Добрый вечер. Помогите пожалуйста, возникла проблема кодировки. В панели php-myadmin все отображается хорошо. На выводимой странице знаки ? (знаки вопросов в ромбах) Другого пользователя не могу создать - нет прав. Как исправить проблему, чтоб выводились русские символы?
Запрос SHOW GLOBAL VARIABLES LIKE 'char%'; выдает:
Variable_name Value
character_set_client cp1251
character_set_connection cp1251
character_set_database cp1251
character_set_filesystem binary
character_set_results cp1251
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
При подключении к бд добавил строку mysql_query('SET NAMES cp1251'); :
$db = mysql_connect("localhost","123","321");
mysql_query('SET NAMES cp1251');
mysql_select_db("12345",$db);
В выводимом файле внутри тега head указание на кодировку присутствует
<meta http-equiv='Content-Language' content='ru'>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>
Сам файл сохранял с помощью редактора bred в ANSI , базу экспортировал, текст сохранял в ANSI, удалял все таблицы базы, делал сравнение базы с cp1251_general_ci и далее вставлял sql запросом все таблицы с указанием в конце таблицы кодировки DEFAULT CHARSET=cp1251
boget
Уточнение. Данные в phpMyAdmin выводятся хорошо, кириллица читаема, таблицы и поля имеют сравнение cp1251_general_ci?
В этом случае вы все сделали правильно и проблем быть не должно. Посмотрите в браузере используемую кодировку страницы; если не только данные из БД выводятся вопросиками, но и вообще вся страница, то проблема не в БД.
Форум PHP-MyAdmin.RU → Работа с phpMyAdmin → Смена кодировки базы в phpMyAdmin
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.