3001
Попробуйте заменить строку:while ($data = fgetcsv ($fp, 0, ";")) {
Неактивен
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 (2010-03-04 12:49:42)
Неактивен
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, то же самое, "проглатываются" кириллица, регистр значения не имеет.
Hanut написал:
<?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
Посмотрел все еще раз внимательнее и обнаружил, что на выполнении уже этого кода (первого)
Hanut написал:
<?php $fp = fopen ("/tmp/temp.csv","r"); while ($data = fgetcsv ($fp, 0, ";")) { if($data[0]>0){ print_r($data); } } ?>
обнаруживается эта ошибка. Вот пример вывода этого кода:
Спойлер:
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)] )
В Array [1] => должно быть название фильма (кириллицей)
Array [3] => перевод (тоже кириллицей)
и. т.д. а Array [12] => должен содержать
Спойлер:
не это " , пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город." А это "В Мехико на рубеже веков две совершенно непохожих друг на друга женщины из разных слоев общества становятся парочкой грабительниц банков, пытаясь противостоять таким образом безжалостному шерифу, терроризирующему их город."
Hanut, извините за невнимательность ![]()
Раз это самые первые строки выполняемого кода, то, возможно, имеет значение, что еще есть в файле перед выполняемым кодом. Только это. См.
Спойлер:
<?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>
Далее код и подвал <?include"adminfoot.php";?>
Отредактированно 3001 (2010-03-04 15:45:52)
Неактивен
3001 написал:
В Array [1] => должно быть название фильма (кириллицей)
Array [3] => перевод (тоже кириллицей)
и. т.д. а Array [12] => должен содержать
Теперь найдите в csv файле эти данные и покажите их (желательно всю строку). Похоже csv не корректен и функция fgetcsv() разбирает его неверно. Надо посмотреть нет ли там лишних неэкранированных кавычек.
Правила csv:
разделитель значений (точка с запятой) - ;
Обрамление строк (двойная кавычка) - "
Экранирование (обратный слеш) - \
Неактивен
Hanut
Похоже на то, но в csv ничего необычного не обнаружил. Вот строка
Спойлер:
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)]
Сам файл выложил сюда
Неактивен
Скачал ваш файл и использовал данный скрипт, никаких сложностей, все работает.
<?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. Вы на какой тестировали, если не секрет? Возможно это решение проблемы, накопал тут, не поможете реализовать? Там есть такой пункт 3:
Мы не имеем доступа к настройкам сервера, так что о быстром исправлении работы функции fgetcsv не может идти и речи.
интересно, а с помощью .htaccess эти коррективы внести нельзя.
Отредактированно 3001 (2010-03-04 20:19:27)
Неактивен
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
По моему сработало
Результат вывода в нашем примере:
Спойлер:
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)] )
Попробую вписать эту строку @setlocale(LC_ALL, 'ru_RU.CP1251'); уже в сам скрипт. Через пару часиков сообщу о результате. А можно поподробнее об этой конструкции, что она делает?
Неактивен
3001
В документации к функции fgetcsv() есть сноска по поводу обязательной установки локали при использовании однобайтных кодировок.
Функция setlocale() устанавливает используемую локализацию, то есть, функции работающие с текстом, вроде strtoupper(), будут знать какие таблицы символов использовать для преобразования. Так же локализация действует и на некоторые внутренние преобразования данных, к примеру: у функции date() есть параметр F, который выводит название месяца; при изначальной локализации en_US, date('F'); выведет 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. Как бы мне их отсортировать все независимости от столбца и по алфавиту? Пример:
Спойлер:
Выводит: (первые 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
И еще в каталоге есть названия, начинающиеся с цифр, как сделать так, чтоб, скажем передав переменной ?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`
С цифрами все точно так же, как и с буквами.
Страница помощи проекту здесь:
Неактивен
Hanut
Ваш код помог, большое спасибо. А про цифры я наверно не так выразился. Нужно не ?letter=0, ?letter=1 и т.д., а нажал раз на ссылку вида ?letter=0 и вывелись все, начинающиеся на цифру.
Неактивен
Hanut
Спасибо за помощь, пожертвовал 300р. на я-д. Отличный проект, очень понравилось из
Спойлер:
Бывает, новички задают простые, тривиальные вопросы, и самое главное здесь — просто быть внимательным к ним.
Отлично сказано, самого не раз футболили напыщенные админы, модераторы подобных форумов по вопросам программирования. Мол, что Вы задаете такие вопросы, это и ежу понятно, идите читайте мануал, вместо конкретной помощи. Даже прочитав эти тома, новичку сложно будет что-то понять без помощи. Важно помнить, что человек может быть чайником в одном, но профи в другом. И завтра нынешние профи могут стать чайниками и, возможно, будут задавать уже мне такие же "глупые" вопросы. Спасибо за помощь, за терпение и внимание. Не подумайте, я не прощаюсь
, просто решил поблагодарить. Думаю, что у меня будут еще вопросы и на Вашем форуме я задержусь.
Неактивен
В таком случае нужен поиск по регулярному выражению, пример:
SELECT * FROM `kino_films` WHERE `filmName` REGEXP '^[[:digit:]]+';
Спасибо за перевод, деньги мы получили, можете быть уверены, что они будут потрачены именно на проект.
Всегда добро пожаловать.
Неактивен
Hanut
Что-то не получатся, не хочет выбирать.
Неактивен
3001
Попробуйте в phpMyAdmin этот запрос выполнить.
Покажите как выглядит ваш запрос.
Неактивен
Hanut написал:
Попробуйте в 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 (2010-03-12 20:47:12)
Неактивен
boget
Уточнение. Данные в phpMyAdmin выводятся хорошо, кириллица читаема, таблицы и поля имеют сравнение cp1251_general_ci?
В этом случае вы все сделали правильно и проблем быть не должно. Посмотрите в браузере используемую кодировку страницы; если не только данные из БД выводятся вопросиками, но и вообще вся страница, то проблема не в БД.
Неактивен
|
|