76

Re: Смена кодировки базы в phpMyAdmin

3001
Попробуйте заменить строку:
[mono]while ($data = fgetcsv ($fp, 0, ";")) {[/mono]

77

Re: Смена кодировки базы в phpMyAdmin

Hanut
Безрезультатно sad

78

Re: Смена кодировки базы в phpMyAdmin

3001
Тогда начните с проверки данных в csv файле. Запустите скрипт и посмотрите как все выглядит, есть ли потери данных или еще какие-то странности. Дальше наращивайте функции, пока не найдете ошибку.

<?php
$fp = fopen ("/tmp/temp.csv","r");

while ($data = fgetcsv ($fp, 0, ";")) {
    if($data[0]>0){
        print_r($data);
    }
}
?>

79 (изменено: 3001, 2010-03-04 12:49:42)

Re: Смена кодировки базы в phpMyAdmin

Hanut
Буду пробовать. Кстати, в этом скрипте в этой функции на старом хостинге путь был такой "tmp/temp.csv", на новом хостинге с ним уже не работал (вообще ничего не грузил, die() из скрипта выдавал). Изменил на "/tmp/temp.csv", тогда стал грузить, но не корректно. Имеет ли это значение? Попробовал в корень сайта сначала закачать csv, а потом из него загружать. Результат тот же. Заметил вот еще что, в форме, которая отправляет файл
<form action="файл.php" method="post" ENCTYPE="multipart/form-data">
интересует это что?
ENCTYPE="multipart/form-data">

80

Re: Смена кодировки базы в phpMyAdmin

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" - Это аттрибут указывающий загрузку файла через форму. Без него файл не загрузится.

81

Re: Смена кодировки базы в phpMyAdmin

Hanut
Спасибо, я как раз это уже попробовал. Загрузил csv, поменял пути, скрипт сработал, но все также половину кириллицы добавил, половину нет sad Все мысль о не добавлении кириллицы в верхнем регистре мне покоя не давала. Заменил Слова на слова в csv, то же самое, "проглатываются" кириллица, регистр значения не имеет.

Hanut сказал:

<?php $fp = fopen ("/tmp/temp.csv","r"); while ($data = fgetcsv ($fp, 0, ";")) { if($data[0]>0){ print_r($data); } } ?>

Попробовал, что сказать, никаких аномалий не увидел, все тексты отображаются корректно, те места, которые в базе пусты, скрипт вывел нормально, как и должно быть. Уже не удобно Вас просить, но может поможете и далее дилетанту, что далее нужно проверить? Результат выполнения кода выложить?

82

Re: Смена кодировки базы в phpMyAdmin

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

<?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);
    }
}
?>

83 (изменено: 3001, 2010-03-04 15:45:52)

Re: Смена кодировки базы в phpMyAdmin

Hanut
Посмотрел все еще раз внимательнее и обнаружил, что на выполнении уже этого кода (первого)

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, извините за невнимательность roll
Раз это самые первые строки выполняемого кода, то, возможно, имеет значение, что еще есть в файле перед выполняемым кодом. Только это. См.
[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";?>

84

Re: Смена кодировки базы в phpMyAdmin

3001 сказал:

В Array [1] => должно быть название фильма (кириллицей)
Array [3] => перевод (тоже кириллицей)
и. т.д. а Array [12] => должен содержать

Теперь найдите в csv файле эти данные и покажите их (желательно всю строку). Похоже csv не корректен и функция fgetcsv() разбирает его неверно. Надо посмотреть нет ли там лишних неэкранированных кавычек.

Правила csv:
разделитель значений (точка с запятой) - ;
Обрамление строк (двойная кавычка) - "
Экранирование (обратный слеш) - \

85

Re: Смена кодировки базы в phpMyAdmin

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]

86

Re: Смена кодировки базы в phpMyAdmin

Скачал ваш файл и использовал данный скрипт, никаких сложностей, все работает.

<?php
$fp = fopen ("/tmp/temp.csv","r");

while ($data = fgetcsv ($fp, 0, ";")) {
    if($data[0]>0){
        print_r($data);
    }
}
?>

http://i2.fastpic.ru/thumb/2010/0304/42/c50ca61cf87dabfb32a45230578cdd42.jpeg

Значит csv в порядке, скрипт скорее-всего тоже, а вот что является причиной столь странной работы сервера - я даже не знаю.

87 (изменено: 3001, 2010-03-04 20:19:27)

Re: Смена кодировки базы в phpMyAdmin

Hanut
Может быть какой-то совет дадите, может быть переписать как-то код, чтоб подгружал не из csv, а другого файла? Или теребить службу поддержки хостинга? Даже не знаю какие им вопросы задавать. Они пишут, мол, обращайтесь к разработчику скрипта. А где я его найду, уже несколько лет прошло sad Я вот тут подумал, возможно это fgetcsv() работает не корректно на этом хостинге, а вернее с этой версией php, а стоит у хостера php 5.2.12 (spaceweb кстати). Узнал, что на старом хостинге была версия php 4.3.9. Вы на какой тестировали, если не секрет? Возможно это http://www.bvisoft.com/reads/413.php решение проблемы, накопал тут, не поможете реализовать? Там есть такой пункт 3:

Мы не имеем доступа к настройкам сервера, так что о быстром исправлении работы функции fgetcsv не может идти и речи.

интересно, а с помощью .htaccess эти коррективы внести нельзя.

88

Re: Смена кодировки базы в phpMyAdmin

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 файле есть поля имеющие перевод строки.

89

Re: Смена кодировки базы в phpMyAdmin

Hanut
По моему сработало smile Результат вывода в нашем примере:
[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'); уже в сам скрипт. Через пару часиков сообщу о результате. А можно поподробнее об этой конструкции, что она делает?

90

Re: Смена кодировки базы в phpMyAdmin

3001
В документации к функции fgetcsv() есть сноска по поводу обязательной установки локали при использовании однобайтных кодировок.
http://lv.php.net/manual/en/function.fgetcsv.php

Функция setlocale() устанавливает используемую локализацию, то есть, функции работающие с текстом, вроде strtoupper(), будут знать какие таблицы символов использовать для преобразования. Так же локализация действует и на некоторые внутренние преобразования данных, к примеру: у функции date() есть параметр F, который выводит название месяца; при изначальной локализации en_US, [mono]date('F');[/mono] выведет January, а при смене локализации на ru_RU, вывод будет по-русски "Январь".

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

91

Re: Смена кодировки базы в phpMyAdmin

Hanut
Сработало, моей радости нет предела big_smile Помедленнее, по-моему, файл загружаться стал, но это субъективно - главное результат есть - скрипт работает корректно. Как я могу Вас отблагодарить? Серьезно, от души. Не знаю, пьете ли Вы пиво, но с удовольствием "проставился" бы, как говориться. smile Да и из за географической удаленности это вряд ли возможно. Может сайт какой рекламный просмотреть или денежку на 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 соответственно), ума не приложу. Буду рад любой помощи или намеку на дальнейшие действия.

92

Re: Смена кодировки базы в phpMyAdmin

(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/

93

Re: Смена кодировки базы в phpMyAdmin

Hanut
Ваш код помог, большое спасибо. А про цифры я наверно не так выразился. Нужно не ?letter=0, ?letter=1 и т.д., а нажал раз на ссылку вида ?letter=0 и вывелись все, начинающиеся на цифру.

94

Re: Смена кодировки базы в phpMyAdmin

Hanut
Спасибо за помощь, пожертвовал 300р. на я-д. Отличный проект, очень понравилось из http://php-myadmin.ru/about/
[spoiler]Бывает, новички задают простые, тривиальные вопросы, и самое главное здесь — просто быть внимательным к ним.[/spoiler]
Отлично сказано, самого не раз футболили напыщенные админы, модераторы подобных форумов по вопросам программирования. Мол, что Вы задаете такие вопросы, это и ежу понятно, идите читайте мануал, вместо конкретной помощи. Даже прочитав эти тома, новичку сложно будет что-то понять без помощи. Важно помнить, что человек может быть чайником в одном, но профи в другом. И завтра нынешние профи могут стать чайниками и, возможно, будут задавать уже мне такие же "глупые" вопросы. Спасибо за помощь, за терпение и внимание. Не подумайте, я не прощаюсь smile, просто решил поблагодарить. Думаю, что у меня будут еще вопросы и на Вашем форуме я задержусь.

95

Re: Смена кодировки базы в phpMyAdmin

В таком случае нужен поиск по регулярному выражению, пример:

SELECT * FROM `kino_films` WHERE `filmName` REGEXP '^[[:digit:]]+';

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

Всегда добро пожаловать.

96

Re: Смена кодировки базы в phpMyAdmin

Hanut
Что-то не получатся, не хочет выбирать.

97

Re: Смена кодировки базы в phpMyAdmin

3001
Попробуйте в phpMyAdmin этот запрос выполнить.

Покажите как выглядит ваш запрос.

98

Re: Смена кодировки базы в phpMyAdmin

Hanut сказал:

Попробуйте в phpMyAdmin этот запрос выполнить.

Работает, все выбирается как нужно.

Спасибо, решил пойти по другому пути ?letter=0, ?letter=1 и т.д.

99 (изменено: boget, 2010-03-12 20:47:12)

Re: Смена кодировки базы в phpMyAdmin

Добрый вечер. Помогите пожалуйста, возникла проблема кодировки. В панели 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

100

Re: Смена кодировки базы в phpMyAdmin

boget
Уточнение. Данные в phpMyAdmin выводятся хорошо, кириллица читаема, таблицы и поля имеют сравнение cp1251_general_ci?

В этом случае вы все сделали правильно и проблем быть не должно. Посмотрите в браузере используемую кодировку страницы; если не только данные из БД выводятся вопросиками, но и вообще вся страница, то проблема не в БД.