DenIT

Рейтинг
123
Регистрация
03.01.2007

Можно взять уже существующий запрос, но все равно придется менять формат вывода данных (не думаю, что вам нужна для импорта html-верстка). Можно сделать и внутри имеющегося скрипта, главное, потом не запутаться в коде (т.к. он разрастется из-за дополнительных настроек и условий).

Ссылка должна вести на обычный php-скрипт. Код этого файла я привел выше.

Результат вашего sql-запроса нужно поместить в переменную $rec (если смотреть на код выше).

В результате, при переходе по ссылке на этот php-скрипт пользователю будет предложено сохранить файл с названием $filename.csv (имя можно сформировать самому, см. заголовки), в качестве содержимого будут данные из $rec. Все достаточно просто, с остальным можно поэкспериментировать:)

Если так же утрированно - то формировать заголовки и содержимое, аналогичное обычному скачиванию файла. Вот, например, для csv (выдернул из контекста):


$filename = "export".date("dmY");
header("Content-Disposition: attachment; filename=\"$filename.csv\"");
header("Content-Type: application/x-force-download; name=\"$filename.csv\"");
header('Expires: 0');
if (USR_BROWSER_AGENT == 'IE') {
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
} else {
header('Pragma: no-cache');
}

echo $rec;
exit();

в переменную $rec можно запихнуть что угодно, что собственно и будет составлять контент файла.

PS: не претендую на абсолютную правильность, да и коду уже лет 5, но вроде до сих пор работает:)

дубль сообщения

Без. (линк на mysql.com)

Сопоставление - необязательный параметр, можно ничего не писать, т.е. вот так:

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;

блин, не заметил про перл:)

например, iconv

Максим Концепция, это не влияет на кодировку, в которой хранятся данные. Да и потом, вместо этих команд можно написать SET NAMES 'utf8'; - это в общем-то аналогично. Но меняет параметры подключения, а не кодировку данных.

перекодировать данные из utf в cp1251

Например:


function utf8win1251($s){
$out = $c1 = "";
$byte2=false;
for ($c=0;$c<strlen($s);$c++){
$i=ord($s[$c]);
if ($i<=127) $out.=$s[$c];
if ($byte2){
$new_c2=($c1&3)*64+($i&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
if ($new_i==1025){
$out_i=168;
}
else{
if ($new_i==1105){
$out_i=184;
}
else {
$out_i=$new_i-848;
}
}
$out.=chr($out_i);
$byte2=false;
}
if (($i>>5)==6) {
$c1=$i;
$byte2=true;
}
}
return $out;
}

Надежнее всего - сделать дамп, в нем автозаменой поменять у таблиц кодировку. Код будет выглядеть примерно так:

CREATE TABLE `XXX` (
....
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Нужно поменять cp1251 на нужное значение (utf8, например), и закачать обратно дамп.

Можно и без дампа (начиная с версии 4.1):

ALTER DATABASE db_name [DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]]

но через дамп все же надежнее (а может, просто привычнее :) )

в какой кодировке таблицы в базе? Какая кодировка используется при подключении?

Возможно, база создалась в какой-нибудь кривой кодировке (типа latin1, дефолтная ненастроенная кодировка), а скрипт жестко вытаскивает данные в кириллице (SET NAMES 'cp1251'), в общем, проблема где-то рядом:)

UPD: перечитал исходник - проблема действительно с кешем, я описал решение проблемы с кодировкой... :)

Всего: 872