- RU.PHP ------------------------------------------------------------- RU.PHP -
Msg : #1092 [1443]
От : FAQ AutoPoster 2:5012/8.13 27 июня 03, 16:29
Кому : All 30 июня 03, 22:21
Тема : FAQ [4/5]
-------------------------------------------------------------------------------
>
Для правильной работы ORDER BY и GROUP BY сервер MySQL должен знать текущий
набор символов. К сожалению, версии 3.х и 4.х MySQL могут иметь только _один_
charset на все базы одновременно. Задается в /etc/my.cnf:
[mysqld]
default-character-set=koi8_ru
Проверить можно так:
mysql> show variables like 'character_sets' ;
mysql> show variables like 'character_set' ;
В этом случае все символьные поля _во_всех_ таблицах будут храниться в KOI8-R.
Для того, чтобы работали клиенты ODBC из под Windows необходимо, чтобы первым
SQL оператором в Windows-приложении была команда:
SET CHARACTER SET cp1251_koi8 ;
Тогда включится перекодировка "на лету". Hа сервере будет KOI8-R, а на клиенте
Windows-1251 и все сортировки будут работать. Эту же команду можно прописать в
MyODBC 3.5х "SQL command on connect" (STMT=), она выполнится автоматически.
Другой вариант -- не использовать KOI8-R, а хранить базы в Windows-1251 и
сообщить об этом серверу, прописав в /etc/my.cnf:
[mysqld]
default-character-set=cp1251
> Alexander Voropay
>>4.2. Как перейти c MySQL на PostgreSQL?
Рекомендую http://www.webmasterbase.com/subcats/6
Migrate your site from MySQL to PostgreSQL -- Part 1
Migrate your site from MySQL to PostgreSQL -- Part 2
> Vova Rusakevich, 2:454/23.501
>>4.3. Добавляем запись с автоинкрементным уникальным индексом. Как узнать
>>значение последнего индекса?
Для MySQL
Есть замечательная функция mysql_insert_id ([идент. соединения]).
Возвращает целое значение, которое и есть необходимый идентификатор,
сгенерированный полем AUTO_INCREMENT в последем операторе INSERT.
Подробно см. в доках по функциям PHP.
Cледует обратить внимание на то, что mysql_insert_id получает число типа INT,
поэтому необходимо быть осторожным при использовании этой функции с полями
типа BIGINT.
> Dmitry Seleznev, 2:5095/6
Для MSSQL
Hужно сразу после insert выполнить запрос 'select @@IDENTITY newID from
Твоя_Таблица'. Получишь идентификатор для только что вставленной записи.
Подробнее о переменных см. в доках MS SQL.
> Andy Ice, 2:5012/8.13
>>4.4. Как взять картинку из BLOB?
Для MSSQL
Просто использовать функции mssql_* не получится, но можно использовать
odbc_*
Для ODBC
Должен быть создан так называемый System DSN в ODBC Admin
Вызов: getfoto.php?id=13
$sql = odbc_connect("namedsn", "user", "password") or die('die message');
$query = odbc_exec($sql, "select FOTOFIELD from FOTOTABLE where ID=$id");
if ($fetched = odbc_fetch_row($query)) {
$dbimage = odbc_result($query, "FOTO");
}
else
{
$filename = "./none.jpg"; // Пустая картинка
$fd = fopen ($filename, "rb");
$dbimage = fread ($fd, filesize ($filename));
fclose ($fd);
}
header('Content-type: image/jpeg');
//header('Content-Disposition: attachment; filename='.$id.'.jpg');
print $dbimage;
flush();
odbc_close($sql);
?>
> Andy Ice, 2:5012/8.13
>>4.5. Какую базу данных лучше всего выбрать?
Выбор базы данных (SQL-сервера) зависит от задач, которые планируются.
> Andy Ice, 2:5012/8.13
-----------------------------------------------------------------------------
>>>5. Работа с файлами
-----------------------------------------------------------------------------
>>5.1. Пытаюсь переслать картинку из файла, но она приходит частично,
>>"бьется", что делать?
Бинарные файлы нужно открывать с ключем "b", иначе в некоторых случаях файл
считается текстовым. Обычно такое происходит под Windows, но если в Вашей
системе параметр "b" не требуется, то он будет игнорироваться, поэтому
рекомендуется его все-таки употреб
$fp = fopen("/home/rasmus/file.txt", "rb");
?>
> Andy Ice, 2:5012/8.13
>>5.2. Почему при работе с csv-файлами теряются некоторые заглавные русские
>>буквы?
Потому что csv-файл должен удовлетворять одному, главному условию: текстовые
поля должны быть ограничены кавычками, т.е. пример такого плана:
1, "Фамилия Имя Отчество", "Должность"
> Andy Ice, 2:5012/8.13
>>5.3. При попытке отдать через header("Location: somefile") файл с
>>расширением pdf, doc, txt, IE открывает их в окне браузера. Как этого
>>избежать?
При отдаче файла через header("Location: somefile"), web сервер отдает еще
Content-type этого файла, который узнается по расширению файла. Информация о
соответствии content-а расширению берется web сервером из конфигурационного
файла mime.types. Броузеры в зависимости от получаемого Content-type знают
что дальше делать с этим файлом. При этом расширение файла броузеру ни о чем
не говорит, и если web сервер отдаст, к примеру, файл best_music.mp3 с
Content-type: application/msword, то, если в системе клиента установлен MS
Word, этот файл будет открыт им.
Для решения проблемы описанной в вопросе существуют два способа:
1. Отредактировать файл mime.types поставив желаемым расширениям файлов
(которые надо скачивать, а не открывать) в соответствие тип
application/octet-stream.
Hедостатки:
- этот путь годится, если Вы яляетесь администратором сервера;
- изменения коснутся всех файлов, тип которых Вы переопределили, даже тех,
которые HАДО открывать в броузере.
2. Отдавать файл клиенту, не посредством header("Location: somefile"), а
организовав собственную процедуру отдачи файла. При этом появляется
возможность динамически менять Content-type, предоставив пользователю выбор,
открыть ли файл в броузере или просто скачать, записав на диск.
Hедостатки:
- бОльшая нагрузка на сервер;
- бОльшие требования к объему RAM на сервере.
> Serge V. Tarasov
>>5.3. Как заставить браузер предлагать сохранять файл с нужным названием,
а не download.php?
В msdn нашел:
header("Content-Disposition: attachment; filename=work1.doc");
$x = fread(fopen("test.doc", "rb"), filesize("test.doc"));
echo $x;
?>
> Alexey Kolesnichenko
>>5.4 Как корректно заставить броузер скачать и записать файл вместо открытия
в окне с поддержкой докачки? (пример скрипта)
Предполагается, что
$cd - путь к файлу,
$fn - имя файла
> Serge V. Tarasov
>>5.5 Как сделать аттачмент к е-мейлy пpи отпpавке его с помощью фyнкции
mail?
function XMail( $from, $to, $subj, $text, $filename)
{
$f = fopen($filename,"rb");
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: PHPMail Tool\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}
?>
> Eugene Belyaev, 2:469/83.210
-----------------------------------------------------------------------------
>>>6. Работа с графикой
-----------------------------------------------------------------------------
>>6.1. Вздумалось мне локальную баннерную сеть написать, да еще и с подсчетом
>>показов. Вот и проблемка возникла: как из такой строки в HTML
>> показать картинку? Header() вроде как не проходит?
Хочется самому написать? Смотри PHP Manual в разделе GD Functions. Там
разберешься.
Или взять готовую банерокрутилку (по моему phpAds называеться,
http://www.hostcripts.com, http://php.resourceindex.com/).
> Vova Rusakevich, 2:454/23.501
>>6.2. Как с помощью GD-функций писать кириллицей на создаваемом изображении?
Hадо делать так:
175)?"".(1040+($char-176)).";":$in[$i];
}
return $out;
}
?>
> (Дополнения и исправления by Serge V. Tarasov, max@arkos.ru)
> Sergey Volkov, deoxyribonuclein@gmx.net
-----------------------------------------------------------------------------
>>>7. Сетевые дела
-----------------------------------------------------------------------------
>>7.1. Почему с'апложенные jpeg-файлы не отобpажаются? (бьются?). Веб-сервер
>>- русский Апач.
Все дело в том, что русский Апач по умолчанию производит перекодировку
файлов. Так, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20).
Для борьбы с этим эффектом нужно добавить в конфигурационный файл Апача
httpd.conf следующее:
CharsetRecodeMultipartForms Off
> Dmitry Seleznev, 2:5095/6
>>7.2. Как опpеделить валидность e-mail?
function valid_mail ($email) {
if (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-\.]+)\.([a-z]{2,4}$)",
$email, $check)) {
if (getmxrr($check[1] . "." . $check[2], $mxhosts)) {
return "Valid";
} else {
return "No MX for " . $check[1] . "." . $check[2];
}
} else {
return "Badly formed address";
}
}
?>
> Maxim Matyukhin
--- GMT v1.04beta5
* Origin: Two Beer Or Not Two Beer? (2:5012/8.13)
При переходе по баннеру - скидка 25% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!