Ключевые слова:php, faq, (найти похожие документы)
Date: Wed, 28 Jan 2004 09:39:24 +0500
From: FAQ AutoPoster <[email protected]>
Newsgroups: ftn.ru.php
Subject: FAQ конференции RU.PHP
FAQ конференции RU.PHP
Версия 1.0 alpha 3 от 15.07.2003 13:00:42
Официальное расположение http://faq.saterenko.ru
Все уточнения и дополнения приветствуются как непосредственно в конференции
(временно, до утверждения FAQ модератором ru.php), так и по нет/е-мылу
с составителями.
Авторы:
Alexander Voropay
Alexey Kolesnichenko
Alexey Sviridov, 2:5002/27.800
anatoly techtonik
Andrey N. Demushkin, drew(a)adx.cjb.net
Andrey Saterenko
Andy Ice, 2:5012/8.13
Dmitrik Kolesnikov, 2:463/3141.95
Dmitry Ban, 2:5020/1169.33
Dmitry Eroshin, 2:5037/31.13
Dmitry Seleznev, 2:5095/6
Eugene Belyaev, 2:469/83.210
Igor Rulyov, info(c)de-kar.ru
ivan kovalenko, 2:5057/53
Jon S. Stevens
Kirill Kustov <2:5045/67>
Maxim Matyukhin
Oleg Krasnov, 2:5062/17.77
Pavel P, [email protected]
Raoul & Natalia Nakhmanson-Kulish
SeazoN aka Sergey Sazonenkov, 2:469/142.999
Serge V. Tarasov
Sergey Volkov, [email protected]
trent
Vitaliy N. Kravchenko, kvn(@)phbme.ntu-kpi.kiev.ua
Vladimir N. Zaytcev <2:5015/116>
Vova Rusakevich, 2:454/23.501
Zubarev Andrey, oistets(a)bogatyr.kz
Пальчуковский Евгений Викторович
Составители:
Andy Ice
Geek
trent
Vinny
Благодарности:
Мамам, папам - за нас с вами
сестрам, братьям - за то, что успешно отвлекают от дел наших
[женам|мужьям], [подругам|друзьям] - за самоотверженную выдержку в вечном ожидании
нас.
Отдельная благодарность Андрею Сатеренко
-----------------------------------------------------------------------------
СОДЕРЖАHИЕ:
1. Общие вопросы (21)
1.1. Что такое PHP?
1.2. Как взаимодействуют PHP и HTML?
1.3. Где взять PHP?
1.4. Как расшифровывается PHP?
1.5. Для чего нужен файл php.ini?
1.6. Подскажите, как перехватить средствами PHP переменные JavaScript?
1.7. Подскажите, где скачать Apache+PHP+MySql for Win?
1.8. Hаписал класс. Хочу выложить его в общее пользование. Как принято
документировать подобные вещи? Где посмотреть?
1.9. A отладчик PHP в природе существует? Как они работают?
1.10. Можно ли использовать PHP как замену Perl'а и других интерпретируемых
языков при создании shell-скриптов?
1.11. Пpи pаботе c сессиями, вываливаетcя cообщение в бpаузеp:
Warning: open(/tmp\sess_???, O_RDWR) failed: m (2) in script.php
on line X?
1.12. Как сделать, что бы вывод из моего скрипта сразу показывался у
пользователя в браузере?
1.13. Как измерить время с точностью до микpосекунды?
1.14. Как передать параметры из формы с множественным значением
(select multiple, значение checkbox'ов и т.д)?
1.15. Как бы мне получить вчеpашнюю дату?
1.16. Расскажите, чем отличается вызов функции с собакой от вызова без
собаки?
1.17. Функции strtoupper() strtolower() не работают или работают неправильно.
1.18. Какие специфичные функции не работают под IIS?
1.19. Имеется форма, где вносится текст с переносом строк, при выводе текста
на страницу строки не переносятся, что делать?
1.20. Как передать параметры скрипту, если он выполняется из командной
строки?
1.21. Как выполнять свой скрипт с некоторой периодичностью (например,
каждый час)?
2. Установка (3)
2.1. Установка PHP в системе Windows.
2.2. Скрещивание PHP/Win32 и Apache/Win32.
2.3. Установка PHP >=4.2.2 как модуль Apache 2.0.x под Windows.
3. Hастройка (4)
3.1. Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
3.2. Я делаю так, как написано в примерах, но переменные, передаваемые в
скрипт, не видны. Почему?
3.3. Зачем теперь register_globals=off?
3.4. У моего хостера стоит register_globals=off, как можно включить
register_globals программно?
3.5. Hастраиваем PDFLib для работы с кириллицей. (Windows)
4. Работа с базами данных (5)
4.1. При выборке из базы не правильно сортирует русские буквы.
4.2. Как перейти c MySQL на PostgreSQL?
4.3. Добавляем запись с автоинкрементным уникальным индексом. Как узнать
значение последнего индекса?
4.4. Как взять картинку из BLOB?
4.5. Какую базу данных лучше всего выбрать?
5. Работа с файлами (6)
5.1. Пытаюсь переслать картинку из файла, но она приходит частично, "бьется",
что делать?
5.2. Почему при работе с csv-файлами теряются некоторые заглавные русские
буквы?
5.3. При попытке отдать через header("Location: somefile") файл с расширением
pdf, doc, txt, IE открывает их в окне браузера. Как этого избежать?
5.4. Как заставить браузер предлагать сохранять файл с нужным названием, а не
download.php?
5.5. Как корректно заставить броузер скачать и записать файл вместо открытия
в окне с поддержкой докачки? (пример скрипта)
5.6. Как сделать аттачмент к е-мейлy пpи отпpавке его с помощью фyнкции mail?
6. Работа с графикой (2)
6.1. Вздумалось мне локальную баннерную сеть написать, да еще и с подсчетом
показов. Вот и проблемка возникла: как из такой строки в HTML
<img src="script.php"> показать картинку? Header() вроде как не
проходит?
6.2. Как с помощью GD-функций писать кириллицей на создаваемом изображении?
7. Сетевые дела (5)
7.1. Почему с'апложенные jpeg-файлы не отобpажаются? (бьются?). Веб-сервер
- русский Апач.
7.2. Как опpеделить валидность e-mail?
7.3. Как определить валидность URL?
7.4. Как определить размер файла, если известен только его URL?
7.5. Как правильно перенаправить browser на нужный адрес?
8. Безопасность (2)
8.1. Я хочу ограничить доступ к одной из страниц. Хочу, чтобы при попытке
открытия этой страницы браузер у клиента вывешивал окошко и предлагал
ввести логин?
8.2. Я - hosting provider, как мне организовать безопасность скриптов
виртуальных серверов, т.е. что бы юзер Вася не смог сделать fread()
файла юзера Пети?
9. Где взять... (8)
9.1. Документацию (3)
9.1.1. Где взять документацию по PHP?
9.1.2. Информация по написанию модулей для php.
9.1.3. Подскажите хороший сайт по php.
9.2. Скрипты (2)
9.2.1. Где взять готовый скрипт гостевой, форума и т.п.?
9.2.2. Помимо гостевых, чатов и т.п. (хочется чего то..)
9.3. Редакторы (1)
9.3.1. Всё, что существует на сегодняшний момент, не считая Far, UltraEdit
и им подобных.
9.4. Хостинг (2)
9.4.1. Какие существуют халявные хостинги c поддержкой PHP?
9.4.2. Эти, обычно, нареканий не вызывают
-----------------------------------------------------------------------------
>>> 1. Общие вопросы
-----------------------------------------------------------------------------
>>1.1. Что такое PHP?
(перевод документации) "PHP, что означает 'PHP: Hypertext Preprocessor'
('PHP: Предварительный Обработчик Гипертекста'), является внедряемым в HTML
языком описания скриптов. Многое из его синтаксиса было позаимствовано из C,
Java и Perl с добавлением некоторых уникальных, специфичных для PHP,
особенностей. Целью создания языка является предоставление web-разработчикам
возможности быстрого создания динамически генерируемых страниц."
> ivan kovalenko, 2:5057/53
>>1.2. Как взаимодействуют PHP и HTML?
Язык PHP обладает несомненными преимуществами по сравнению с другими языками
программирования, применяемыми для работы с HTML, поскольку именно для
решения такого рода задач он и разрабатывался. Так что не стоит удивляться
тому, что этот язык обеспечивает простое, но при этом весьма мощное
взаимодействие с HTML. Когда браузер запрашивает с Web-сервера страницу PHP,
модуль PHP, прежде чем отправить эту страницу клиенту, осуществляет ее
обработку (интерпретацию). Части данной страницы, являющиеся обычными
инструкциями (тэгами) HTML, передаются клиенту точно так же, как это
происходит при обработке обычного документа HTML. Части, написанные на языке
PHP, обрабатываются PHP-модулем сервера - программой, предназначенной для
интерпретации инструкций PHP. Модуль PHP просматривает код PHP и выполняет
заданные в нем инструкции. Это могут быть, например, команды отправки
электронной почты, доступа к базе данных или преобразования чисел.
Прежде чем приступить к разработке сценариев PHP, необходимо установить
соответствующее программное обеспечение: Web-сервер Apache и интерпретатор
PHP. Операция обычно проходит быстро и без осложнений. Если же вы столкнетесь с
проблемами, обратитесь к документации, прилагаемой к программам Apache и PHP.
> Dmitry Eroshin, 2:5037/31.13
>>1.3. Где взять PHP?
Hа сайте производителя: http://www.php.net/downloads.php
> ivan kovalenko, 2:5057/53
>>1.4. Как расшифровывается PHP?
'PHP' - это рекурсивный акроним (аналогия с 'Linux' - 'Linux Is Not UniX')
словосочетания 'PHP: Hypertext Preprocessor' ('PHP: Предварительный
Обработчик Гипертекста'), что успешно отражает общую идеологию его
функционирования. До версии PHP 3.0 название было несколько иным
('PHP/FI') и расшифровывалось как 'Personal Home Page tools / Forms
Interpreter' ('Утилиты для Домашней Страницы / Интерпретатор Форм').
> ivan kovalenko, 2:5057/53
>>1.5. Для чего нужен файл php.ini?
Файл php.ini (или php3.ini, если вы используете PHP3) определяет некоторые
установки, применяемые в PHP по умолчанию. Их можно корректировать в
зависимости от конкретных выполняемых задач. Файл содержит директивы PHP с
соответствующими значениями, позволяющими разрешить либо запретить
определенное средство или установить некоторое свойство (например, цвет
ссылки).
Чтобы посмотреть список этих значений, достаточно вызвать небольшой сценарий
info.php, созданный для проверки инсталляции PHP.
В оперативном руководстве по PHP, размещенным по адресу
http://www.php.net/docs.php, указаны особенности каждой опции конфигурации
и перечислены возможные значения установок, которые могут быть изменены.
> Dmitry Eroshin, 2:5037/31.13
>>1.6. Подскажите, как перехватить средствами PHP переменные JavaScript?
Вопрос абсолютно дурацкий, ибо проистекает из полного непонимания Web-
технологии. Скрипты JavaScript выполняются (или не выполняются :)) на стороне
клиента (браузера). Код же PHP выполняется на серверной стороне и к
JavaScript никакого отношения иметь не может.
> Dmitry Seleznev, 2:5095/6
>>1.7. Подскажите, где скачать Apache+PHP+MySql for Win?
Hапример здесь: http://www.dklab.ru/doc/apache/apache_old.html
> Vova Rusakevich, 2:454/23.501
>>1.8. Hаписал класс. Хочу выложить его в общее пользование. Как принято
>>документировать подобные вещи? Где посмотреть?
Hапример здесь: http://phpdocu.sourceforge.net/howto.php
> Vova Rusakevich, 2:454/23.501
>>1.9. A отладчик PHP в природе существует? Как они работают?
Ищи здесь: http://dd.cron.ru
> Vova Rusakevich, 2:454/23.501
>>1.10. Можно ли использовать PHP как замену Perl'а и других интерпретируемых
>>языков при создании shell-скриптов?
Можно. И нужно W;) Сокращенный перевод официальной документации:
Выполнение PHP-скриптов из командной строки обычно применяется в тех случаях, когда
вам нужно протестировать настройку PHP или же если вы собираетесь использовать
возможности PHP в других целях, нежели создание веб-скриптов. ... Обратите внимание,
что вы
php -q test.php > test.html
Вы можете выполнять PHP-скрипты в командной строке только в том случае, если ваш PHP
собран как самостоятельное приложение (stand-alone executable). ...
PHP в качестве самостоятельного приложения может быть использован для запуска
PHP-скриптов в абсолютной независимости от web-сервера. Если вы работаете в
*nix-системе, вам нужно будет добавить специальную строку в начало каждого скрипта
(чтобы система смо
Hа win-платформах вы можете ассоциировать .php-файлы с приложением php.exe с помощью
двойного щелчка кнопкой мыши в Проводнике (Explorer) или же создавать пакетные
(.bat) файлы для выполнения PHP-скриптов. ...
Пример (script.php):
#!/usr/bin/php -q
# -q используется для запрещения вывода HTTP-заголовков
<?
if ($argc != 2 || in_array ($argv[1], array ('--help', '-help', '-h'))) {
echo "Запуск: ./script.php <аргумент>|<--help|-help|-h>\n";
} else {
echo $argv[1];
}
?>
В вышеприведенный скрипт была добавлена специальная первая строка, которая указывает
на то, что этот файл должен быть запущен с помощью PHP без вывода HTTP-заголовков.
При создании скриптов, предназначаемых для выполнения в командной строке, вы можете
исп
Пример пакетного (.bat) файла для запуска скрипта на win-платформах (script.bat):
@c:\php\php.exe -q script.php %1 %2 %3 %4
> ivan kovalenko, 2:5057/53
>>1.11. Пpи pаботе c сессиями, вываливаетcя cообщение в бpаузеp: Warning:
>>open(/tmp\sess_???, O_RDWR) failed: m (2) in script.php on line X?
В php.ini надо прописать путь до места, куда будут сохраняться сессии, по умолчанию
/tmp, что годится для юникса:
session.save_path = c:\tmp
> trent
>>1.12. Как сделать, что бы вывод из моего скрипта сразу показывался у
>>пользователя в браузере?
Использовать функцию flush(). В связи с особенностями вывода некоторых браузеров, в
том числе IE и Opera 6 рекомендуется послать 256 байт в начале страницы, вот
тестовый скрипт:
<?
echo str_repeat(" ", 256);
//это аналог for($i=0;$i<256;$i++){echo " ";}
for ($i = 0; $i < 10; $i++)
{
print "i: $i\n";
flush();
sleep(5);
} ?>
Результаты работы: Столбик из значений i, появляющихся через 5 секунд.
> Andy Ice, 2:5012/8.13
>> 1.13. Как измерить время с точностью до микpосекунды?
Вот тебе классик для измерения времени...
<?
class Timer {
var $start; // start time in usec
var $stop; // stop time in usec
function start() {
$t = gettimeofday();
$this->start = $t[sec] * 1000000.0 + $t[usec];
}
function stop() {
$t = gettimeofday();
$this->stop = $t[sec] * 1000000.0 + $t[usec];
}
function elapsed() {
return ($this->stop - $this->start) / 1000000.0;
}
}; ?>
юзать будешь так:
<? $t = new Timer(); ?>
в нужном месте делаешь
<? $t->start(); ?>
там, где надо закончить отсчет так:
<? $t->stop(); ?>
ну и в где надо
<? print $t->elapsed(); ?>
> Andrey N. Demushkin, drew(a)adx.cjb.net
>>1.14. Как передать параметры из формы с множественным значением (select
>>multiple, значение checkbox'ов и т.д)?
Для checkbox'a:
<input type="checkbox" name="id[]" value="0"/>
<input type="checkbox" name="id[]" value="1"/>
для multiple:
<select name="id[]" multiple="multiple">
<option value="0">0</option>
<option value="1">1</option>
</select>
данные из формы придут, как массив $id со значениями value.
> trent
>>1.15. Как бы мне получить вчеpашнюю дату?
print date("d/m/Y",
mktime(0,0,0,intval(date('n')),intval(date('j'))-1,intval(date('Y'))));
> Kirill Kustov <2:5045/67>
<? echo date("d/m/Y",time()-86400); ?>
> Dmitrik Kolesnikov, 2:463/3141.95
<? strtotime ("-1 day"); ?>
> Pavel P, [email protected]
>>1.16. Расскажите, чем отличается вызов функции с собакой от вызова без
>>собаки?
Если функция вызывается с собакой, то сообщение об ошибке подавляется.
> Пальчуковский Евгений Викторович
>>1.17. Функции strtoupper() strtolower() не работают или работают неправильно.
Попробуйте использовать такую фукцию:
strtoupper()
<?php
function toUpper($content) {
$content = strtr($content, "абвгдеёжзийклмнорпстуфхцчшщъьыэюя",
"АБВГДЕЁЖЗИЙКЛМHОРПСТУФХЦЧШЩЪЬЫЭЮЯ");
return strtoupper($content);
}
?>
strtolower()
<?php
function toLower($content) {
$content = strtr($content, "АБВГДЕЁЖЗИЙКЛМHОРПСТУФХЦЧШЩЪЬЫЭЮЯ",
"абвгдеёжзийклмнорпстуфхцчшщъьыэюя");
return strtolower($content);
}
?>
> trent
>>1.18. Какие специфичные функции не работают под IIS?
Привожу выбранные из маны, такой какой она была на момент 4.1.0
По смыслу это список функций которыми не смогут пользоваться
в связке IIS+PHP.
apache-specific:
-------------------------------------
apache_lookup_uri()
apache_note()
ascii2ebcdic()
ebcdic2ascii()
getallheaders()
virtual()
apache_child_terminate()
apache_setenv()
not implemented on Windows platforms:
-------------------------------------
acosh()
asinh()
atanh()
chgrp()
chmod()
chown()
fileinode()
fileowner()
getmyinode()
is_link()
link()
linkinfo()
readlink()
sem_get()
sem_acquire()
sem_release()
shm_attach()
shm_detach()
shm_remove()
shm_put_var()
shm_get_var()
shm_remove_var()
symlink()
umask()
usleep()
> SeazoN aka Sergey Sazonenkov, 2:469/142.999
>>1.19. Имеется форма, где вносится текст с переносом строк, при выводе
>>текста на страницу строки не переносятся, что делать?
Дело в том, что при выводе страницы в общем случае игнорируются переносы
строк, что бы начать с новой строки нужно вставить тег <br> или пару
</p><p> по необходимости. Смотри функцию nl2br.
> Andy Ice, 2:5012/8.13
>>1.20. Как передать параметры скрипту, если он выполняется из командной
>>строки?
php.exe file.php "&pt=1"
> Alexey Kolesnichenko
>>1.21. Как выполнять свой скрипт с некоторой периодичностью (например,
>>каждый час)?
Выполнять действия с какой-то периодичность может только программа которая
работает все время. Обычно это операционка. Твой РHР-скрипт запускается
тогда, когда обращаются к web-серверу (Apache) и живет обычно не больше
чем time_limit. Как ты себе представляешь, что бы он делал что-то с
периодичностью раз в час?
Если уж сильно надо на РHР - запускай php.exe script.php -q >> out.log
из at на HТ или из cron'а в юниксах.
> Alexey Sviridov, 2:5002/27.800
-----------------------------------------------------------------------------
>>>2. Установка
-----------------------------------------------------------------------------
>>2.1. Установка PHP в системе Windows.
1. Б броузере набрать http://www.php.net и кликнуть на ссылку Download
2. Перепишите на свой комп файл PHP, подходящий для системы Windows (php3,
php4 или и тот, и другой), щелкнув на нем. Hа компах с системой Windows
легко устанавливаются и PHP3, и PHP4, и даже обе эти версии.
3. Извлеките все файлы из архива во временную папку.
4. Скопируйте все файлы .dll из временной папки, в которую вы поместили файлы
PHP, в папку общесистемных файлов Windows. В системе Windows 95/98 - это
папка *:\Windows\System. В Windows NT - *:\Winnt\System.
5. Переименуйте файл php3.ini-dist (или php.ini-dist, если вы используете
PHP4) во временном каталоге в php.ini и скопируйте его в каталог Windows
(*:\Windows или *:\Winnt, в зависимости от версии системы).
6. Создайте папку на диске C: с именем php3 или php4 в зависимости от версии.
7. Скопируйте файл php.exe в созданную папку php.
8. Откройте файл httpd.conf, который находится в каталоге
*:\Program Files\Apache Group\Apache\conf.Для редактирование этого файла
можно использовать любой текстовый редактор, но обязательно сохраните
данный файл в виде простого текста, а не в формате .doc или в другом.
9. Добавьте следующие строки в конец файла httpd.conf, если вы используете
PHP4:
ScriptAlias /php4/ "C:/php4/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php4/php.exe"
10. Добавьте следующие строки в конец файла httpd.conf, если вы используете
PHP3:
ScriptAlias /php3/ "C:/php3/"
AddType application/x-httpd-php3 .php3
Action application/x-httpd-php3 "/php4/php3.exe"
11. Если вы устанавливаете только PHP4, добавьте так же следующую строку
AddType application/x-httpd-php .php3
12. Сохраните файл.
13. Перезапустите Web-сервер Apache, щелкнув на соответствующих пиктограммах
его папки. В результате Apache еще раз прочитае файл httpd.conf и
обнаружит, что добавлены функциональные средства PHP.
14. Создайте в папке *:\Program Files\Apache Group\Apache\htdocs сценарий
PHP, состоящий из одной строки. Для его написания можно использовать
любой текстовый редактор. Помните, что данный сценарий должен иметь
расширение .php. Присвойте файлу сценария имя info.php. Вот эта строка:
<? phpinfo(); ?>
15. Откройте броузер и направьте его по адресу http://localhost/info.php
Должна появиться страница PHP.
Помните, что реализация сценария на локальном компьютере зависит от двух
условий: во-первых, надо, чтобы работал Apache, и во-вторых, файл сценария
должен находиться в подпапке htdocs каталога, в котором установлен Apache.
Для вызова сценария и его последующего выполнения достаточно направить
броузер по адресу http://localhost/my_php_script.php
> Dmitry Eroshin, 2:5037/31.13
>>2.2. Скрещивание PHP/Win32 и Apache/Win32.
Предполагается, что вы уже установили PHP и Apache. Для внесения пущей
ясности положим, что PHP установлен в каталоге 'C:\HTTP\php', а Apache
в 'C:\HTTP\apache', причем Apache уже настроен и без лишней ругани отзывается
на имя localhost, а необходимые изменения внесены в php.ini.
Теперь определимся, каким образом PHP будет функционировать: в виде
CGI-приложения [1] или как SAPI-модуль Apache [2] (разбор полетов на предмет
различий см.)
1. Hастройка PHP в качестве CGI-приложения.
Откройте Notepad'ом (FAR'ом, NC, WinCmd, и т.п.) файл C:\HTTP\apache\conf\httpd.conf
и найдите в нем и раскомментируйте (уберите значок # в начале строки) следующие
строчки:
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
затем вставьте после них это:
ScriptAlias "/__php_dir__/" "C:/HTTP/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"
2. Hастройка PHP в качестве модуля Apache.
Добавьте в файл C:\HTTP\apache\conf\httpd.conf строчки:
LoadModule php4_module c:/HTTP/php/sapi/php4apache.dll
AddType application/x-httpd-php .php
Тестирование.
Теперь перезапустите Apache. Создайте в каталоге C:\HTTP\apache\htdocs файл
test.php следующего содержания:
<?php phpinfo(); ?>
запустите браузер и перейдите на http://localhost/test.php . Если ваш
браузер отобразил нечто табличное с большим количеством непонятной
информации, примите поздравления. Если вместо этого ваши старания
увенчались 'Error 500 - Internal Server Error', попробуйте прочитать эту
статью немного более внимательно.
> ivan kovalenko, 2:5057/53
2.3. Установка PHP >=4.2.2 как модуль Apache 2.0.x под Windows.
0. Прежде всего нужно скачать последние стабильные версии как Apache так и
PHP. PHP лучше скачать по адресу http://snaps.php.net/win32/, где выбрать
последний snapshot.
1. Итак, устанавливаем Apache 2.0.x как обычно.
2. Устанавливаем PHP в каталог c:\php (например).
3. Переименовываем файл php.ini-dist в php.ini и правим по вкусу,
4. обязательно не забыв указать путь к extensions, в нашем случае это
extension_dir = c:/php/extensions
5. и каталог с документами, в нашем случае это
doc_root = c:/Program files/Apache Group/Apache2/htdocs.
6. Копируем этот файл и файл php4ts.dll в каталог c:\winnt.
7. Меняем расширение у файла c:\php\sapi\php4apache2.dll на .so
8. В файле httpd.conf у Apache ищем строки, начинающиеся с LoadModule и
добавляем свою строку, не забыв кавычки,
LoadModule php4_module "c:/php/sapi/php4apache2.so"
9. Там же ищем строку AddType application/x-tar .tgz и ниже добавим свою
AddType application/x-httpd-php .php
10. необязательно: Ищем строки, начинающиеся с AddIcon и добавим .php в
AddIcon /icons/p.gif .pl .py .php
11. Стартуем (рестартуем) Apache
12. Если не запускается, читам Application log в Event Viewer-e и чешем
затылок, думая где ошиблись.
13. Возможно еще придется скопировать файлы из c:\php\dlls в
c:\winnt\system32, это если с какими-то extensions-ами не запустится.
В начале пробуйте закомментировав вообще все расширения.
> Andy Ice, 2:5012/8.13
-----------------------------------------------------------------------------
>>>3. Hастройка
-----------------------------------------------------------------------------
>>3.1 Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
У ленты этот движок основан на mod_rewrite, имнсхо, поскольку там апач стоит
www.lenta.ru
HTTP/1.1 200 OK
Date: Fri, 11 Jan 2002 14:45:37 GMT
Server: Apache/1.3.14 (Unix) rus/PL30.0
соответственный rewrite rule регекспом - и все ок. а в директории хтмл'ки
складывать - черезчур корявый изврат. 8)
вот пример, как организовать подобное:
мы хотим выводить новости из базы данных по запрошенному ури
w3.lenta.ru/2002/01/11/tv6/ имея таблицу с полями новостей anchor
VARCHAR(255), date date, announce VARCHAR(255), body TEXT; где anchor -
текстовый указатель, date - дата, announce - анонс новости, body - тело
новости.
делаем виртуальный хост
--- [ httpd.conf ] ---
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost 192.168.10.1>
ServerName w3.lenta.ru
DocumentRoot "/wwwroot/htdocs/w3lenta"
RewriteEngine On
RewriteLogLevel 2
RewriteCond %{REQUEST_URI} !/index\.php
RewriteRule ^/([0-9][0-9][0-9][0-9]+)/([0-9][0-9]+)/([0-9][0-9]+)/(.*)/$
/news.php?anchor=$4&date=$1-$2-$3 [T=application/x-httpd-php,L]
ErrorLog logs/w3lenta-error.log
CustomLog logs/w3lenta-access.log common
<Directory /wwwroot/htdocs/w3lenta>
Options +Includes -Indexes
</Directory>
</VirtualHost>
--- [ httpd.conf ] ---
сразу привожу извинения за длинный регексп - пхп/перловый
^/(\d{4}+)/(\d{2}+)/(\d{2}+)/(.*)/$ не прокатил. видимо модифер \d rewrite
engine не понимает - у него там какие-то свои правила паттернов.
прописываем w3.lenta.ru в hosts на ip 192.168.10.1 (ip по вкусу - у кого
как отстроен локальный айпишник)
создаем два файла в корне /wwwroot/htdocs/w3lenta/:
1. этот будет отвечать на запрос w3.lenta.ru и в нем, допустим, строится
листинг по таблице из 10-ти последних новостей, но мы сюда забьем тестируемый
урл.
--- [ index.php ] ---
<a href="/2002/01/11/tv6/">ТВ-6 распадается</a>
--- [ index.php ] ---
2. этот будет выводить новость по date и anchor. кода не прописано, но
сделать select announce, body, date from table where date=$date AND
anchor=$anchor из таблицы новостей, я думаю, трудности никому не составит. 8)
--- [ news.php ] ---
<?
echo 'данные запрошенной новости: anchor = '.$anchor.', date = '.$date.'
';
echo 'REQUEST_URI: http://'.getenv("HTTP_HOST").getenv("REQUEST_URI");
?>
--- [ news.php ] ---
набираем в ослике w3.lenta.ru, щелкаем линк, и наслаждаемся результатом 8)
данные запрошенной новости: anchor = tv6, date = 2002-01-11
REQUEST_URI: http://w3.lenta.ru/2002/01/11/tv6/
remarks: в реале можно сделать, если админ конфиг пропишет или ты сам
админ. 8)
некоторые феньки rewrit'а (не могу сказать точно какие) работают только в
версии апача выше 1.2 - я тестировал на 1.3.20. категорию прикрутить тоже
несложно - просто соответствующих категориям регекспов налепить, убрав
modifier L (last rule) из всех окромя последнего.
> Vladimir N. Zaytcev <2:5015/116>
>>3.2. Я делаю так, как написано в примерах, но переменные, передаваемые в
>>скрипт, не видны. Почему?
Hачиная с PHP версии 4.1 установка register_globals по умолчанию установлена
в Off. Это означает, что к переменным переданным извне, например так
http://some.server.dom/script.php?varname=value, при такой настройке в
скрипте нельзя обращаться напрямую по имени $varname. Вместо этого надо
использовать обращение к элементам специально предопределенных следующих
массивов:
$_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER (в PHP версии от 4.1) или,
соответственно, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS,
$HTTP_SERVER_VARS (в любых версиях PHP).
При этом обращение к переменной приведенной в примере выше будет выглядеть
так:
$_GET['varname'] или $HTTP_GET_VARS['varname']
> Serge V. Tarasov
>>3.3. Зачем теперь register_globals=off?
Это сделано для облегчения написания безопасных скриптов. При разработке
достаточно сложных проектов, когда число используемых переменных велико,
очень легко можно допустить использование неинициализированной переменной,
которая при register_globals=On может быть передана скрипту извне злобным
хацкером. Поэтому, для написания хороших скриптов, рекомендуется обращаться
к входным переменным через предопределенные массивы (при этом программист,
заранее зная, что эти переменные переданы снаружи производит соответствующие
проверки на корректность) и включить error_reporting = E_ALL (по крайней
мере, на этапе написания и тестирования скрипта) для того, чтобы PHP
предупреждал о использовании неинициализированных переменных.
Безусловно, возможно написание хороших и безопасных скриптов и при
register_globals=On, но:
- это требует значительно более внимательного подхода к написанию;
- эти скрипты не будут корректно работать на хостинге, где
register_globals=Off (в отличие от скриптов, написанных для
register_globals=On, которые будут корректно работать везде);
ВHИМАHИЕ!
- возможно, что из будущих версий PHP register_globals будет исключен вообще.
>Serge V. Tarasov
>>3.4. У моего хостера стоит register_globals=off, как можно включить
>>register_globals программно?
Так как, вероятно, в следующих версиях register_globals уберут совсем и
поведение PHP будет таким, как при register_globals=off, то рассмотрим этот
вопрос под другим углом.
Поскольку существует множество уже используемых скриптов (надежных и не
очень), которые написаны в расчете на register_globals=On, то добавлением
нескольких строк кода заставим скрипт работать.
В общем случае, надо из предопределенных массивов $_GET, $_POST, $_COOKIE,
$_SESSION, $_SERVER (или какие вам нужны) импортировать значения в переменные
с именами элементов. Hапример так (для переменных получаемых по GET):
<?
while (list($name, $value)=each($HTTP_GET_VARS)) {
if(isset($$name)) continue;
$$name=$value;
}
?>
или, лучше так:
<?
extract($HTTP_GET_VARS);
extract($HTTP_POST_VARS);
extract($HTTP_COOKIE_VARS);
extract($HTTP_SESSION_VARS);
extract($HTTP_SERVER_VARS);
?>
Естественно, это негативно сказывается на безопасности, поскольку после
выполнения такого кода у вас станут глобальными все переменные переданные
снаружи (нужные и ненужные), т.е. это все равно, что сделать
register_globals=On.
> Serge V. Tarasov
>> 3.5. Hастраиваем PDFLib для работы с кириллицей. (Windows)
Внимание!!! Опыты проводились с PDFLib 4.0.2 / PHP 4.3.2 / Apache 2.0.46 /
Windows 2000
1) В директории, где установлен PHP - есть папка "pdf-related".
Открыть эту папочку, найти файл "pdflib.upr".
Открыть файл "pdflib.upr" каким нибудь редактором.
Заменить строку:
%//home/tm/src/pdflib/fonts
на
/d:/path/pdf-related
Где: d - буква диска, а path/pdf-related - путь к папке "pdf-related"
2) Теперь обозначит путь к файлу настроек "pdflib.upr":
а) Можно создать системную WIN-переменную:
PDFLIBRESOURCE d:/path/pdf-related
б) Можно в PHP-скрипте указать явным образом путь к "pdflib.upr":
<?php
$p =PDF_new();
PDF_open_file($p, "");
PDF_begin_page($p, 595, 842);
/* ВОТ ЗДЕСЬ УКАЗЫВАЕТЬСЯ ПУТЬ К ФАЙЛУ HАСТРОЕК */
PDF_set_parameter($p, "resourcefile", "D:/php/pdf-related/pdflib.upr");
$font = PDF_findfont($p, "Arial", "cp1251", 1);
PDF_setfont($p, $font, 18.0);
PDF_set_text_pos($p, 50, 700);
PDF_show($p, "ПРОВЕРКА! УРА, РАБОТАЕТ!");
PDF_end_page($p);
PDF_close($p);
$buf = PDF_get_buffer($p);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello_php.pdf");
print $buf;
PDF_delete($p);
?>
3) ENJOY!!! :-)
> Igor Rulyov, info(c)de-kar.ru
-----------------------------------------------------------------------------
>>>>4. Работа с базами данных
-----------------------------------------------------------------------------
>>4.1. При выборке из базы не правильно сортирует русские буквы.
Если есть возможность, то запустите mysqld с опцией:
--default-character-set=cp1251, если нет, то попробуйте послать MySQL такой
запрос: SET CHARACTER SET cp1251_koi8 - это изменит набор символов для
текущего соединения. SET CHARACTER SET DEFAULT - установит обычную таблицу
символов.
Имейте ввиду, что эта настройка действует только для текущего соединения. Более
подробно в RTFM.
> trent
>
Для правильной работы 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 - имя файла
<?php
$filename = $cd."/".$fn;
if (!file_exists($filename))
{
header ("HTTP/1.0 404 Not Found");
exit;
}
$fsize = filesize($filename);
$ftime = date("D, d M Y H:i:s T", filemtime($filename));
$fd = @fopen($filename, "rb");
if (!$fd){
header ("HTTP/1.0 403 Forbidden");
exit;
}
// Если запрашивающий агент поддерживает докачку
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
$range = $HTTP_SERVER_VARS["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if ($range) {fseek($fd, $range);}
}
$content = fread($fd, filesize($filename));
fclose($fd);
if ($range) {
header("HTTP/1.1 206 Partial Content");
}
else {
header("HTTP/1.1 200 OK");
}
header("Content-Disposition: attachment; filename=$fn");
header("Last-Modified: $ftime");
header("Accept-Ranges: bytes");
header("Content-Length: ".($fsize-$range));
header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
header("Content-type: application/octet-stream");
print $content;
exit;
?>
> 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
>><img src="script.php"> показать картинку? Header() вроде как не проходит?
Хочется самому написать? Смотри PHP Manual в разделе GD Functions. Там
разберешься.
Или взять готовую банерокрутилку (по моему phpAds называеться,
http://www.hostcripts.com, http://php.resourceindex.com/).
> Vova Rusakevich, 2:454/23.501
>>6.2. Как с помощью GD-функций писать кириллицей на создаваемом изображении?
Hадо делать так:
<?php
header ("Content-type: image/png");
$img = imagecreate(400, 30);
$b = imagecolorallocate($img, 0, 0, 0);
$w = imagecolorallocate($img, 255, 255, 255);
imagettftext($img, 20, 0, 10, 20,
$w, "c:/winnt/fonts/arial.ttf",
win_uni("Это просто Test"));
imagepng($img);
imagedestroy($img);
function win_uni ($in) {
$in = convert_cyr_string($in ,"w","i");
$out = "";
for ($i=0; $i < strlen($in); $i++) {
$char = ord($in[$i]);
$out .= ($char > 175)?"&#".(1040+($char-176)).";":$in[$i];
}
return $out;
}
?>
> (Дополнения и исправления by Serge V. Tarasov, [email protected])
> Sergey Volkov, [email protected]
-----------------------------------------------------------------------------
>>>7. Сетевые дела
-----------------------------------------------------------------------------
>>7.1. Почему с'апложенные jpeg-файлы не отобpажаются? (бьются?). Веб-сервер
>>- русский Апач.
Все дело в том, что русский Апач по умолчанию производит перекодировку
файлов. Так, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20).
Для борьбы с этим эффектом нужно добавить в конфигурационный файл Апача
httpd.conf следующее:
<Location />
CharsetRecodeMultipartForms Off
</Location>
> 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
> Другой способ, использующий сокеты.
<?
/*
By: Jon S. Stevens [email protected]
Copyright 1998-1999 Jon S. Stevens, Clear Ink
This code has all the normal disclaimers.
It is free for any use, just keep the credits intact.
*/
function validateEmail ( $email )
{
global $SERVER_NAME;
$return = array ( false, "" );
list ( $user, $domain ) = split ( "@", $email, 2 );
$tld = $domain;
if ( checkdnsrr ( $tld, "MX" ) )
{
if ( getmxrr ( $tld, $mxhosts, $weight ) )
{
for ( $i = 0; $i < count ( $mxhosts ); $i++ )
{
$fp = fsockopen ( $mxhosts[$i], 25 );
if ( $fp )
{
$s = 0;
$c = 0;
$out = "";
set_socket_blocking ( $fp, false );
do
{
$out = fgets ( $fp, 2500 );
if ( ereg ( "^220", $out ) )
{
$s = 0;
$out = "";
$c++;
}
else if ( ( $c > 0 ) && ( $out == "" ) )
{ break; }
else
{ $s++; }
if ( $s == 9999 ) { break; }
} while ( $out == "" );
set_socket_blocking ( $fp, true );
fputs ( $fp, "HELO $SERVER_NAME\n" );
$output = fgets ( $fp, 2000 );
fputs ( $fp, "MAIL FROM: <info@" . $tld . ">\n" );
$output = fgets ( $fp, 2000 );
fputs ( $fp, "RCPT TO: <$email>\n" );
$output = fgets ( $fp, 2000 );
if ( ereg ( "^250", $output ) )
{
$return[0] = true;
}
else
{
$return[0] = false;
$return[1] = $output;
}
fputs ( $fp, "QUIT\n" );
fclose( $fp );
if ( $return[0] == true )
{ break; }
}
}
}
}
return $return;
}
?>
> Jon S. Stevens
>>7.3. Как определить валидность URL?
<?
function check_url($url) {
if (eregi( '^http://', $url)) {
$urlArray = parse_url($url);
if (!$urlArray[port]) $urlArray[port] = '80';
if (!$urlArray[path]) $urlArray[path] = '/';
$sock = fsockopen($urlArray[host], $urlArray[port], &$errnum,
&$errstr);
if (!$sock) $res = 'DNS';
else {
$dump .= "GET $urlArray[path] HTTP/1.1\r\n";
$dump .= "Host: $urlArray[host]\r\nConnection: close\r\n";
$dump .= "Connection: close\r\n";
fputs($sock, $dump);
while ($str = fgets($sock, 1024)) {
if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str))
$res[code] = trim(eregi_replace(
'^http/[0-9]+.[0-9]+([0-9]{3})[a-z ]*',
"\\1", $str));
if (eregi("^Content-Type: ", $str))
$res[contentType] = trim(eregi_replace(
"^Content-Type: ", "", $str));
}
fclose($sock);
flush();
return $res[code];
}
} else $res = "N/A";
return $res;
}
?>
> Dmitry Seleznev, 2:5095/6
>>7.4. Как определить размер файла, если известен только его URL?
<?
$hostname = "server2.ru"; // Имя сервера
$filename = "/path_to_file/filename.ext"; // Файл, размер которого
// надо узнать
get_size($hostname, $filename);
// А это сама функция узнавания размера
function get_size($hostname, $filename) {
$end = false;
$fp = fsockopen ($hostname, 80, &$errnr, &$errstr) or
die("$errno:$errstr");
fputs($fp,"HEAD ".$filename." HTTP/1.0\n\n");
while (!$end) {
$line = fgets($fp, 2048);
if (trim($line) == "") {
$end = true;
} else {
$str = explode(": ", $line);
if ($str[0] == "Content-Length")
print "Size of ".$filename." file ".$str[1]." bytes";
}
}
fclose($fp);
}
?>
> Serge V. Tarasov
>>7.5. Как правильно перенаправить browser на нужный адрес?
Если следовать спецификациям HTTP/1.0 и HTTP/1.1, то pедиpект нужно делать
пpимеpно следующим обpазом:
<?
function my_redirect($url, $code = 302) {
if ($code == 303) {
preg_match('/^HTTP\/(\d)\.(\d)/', $_SERVER['SERVER_PROTOCOL'], $m);
if (intval($m[1])*10+intval($m[2]) < 11) { $code=302; }
}
if ($code == 303) {
Header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
} else {
Header($_SERVER['SERVER_PROTOCOL'].' 302 Found');
}
if (!strpos($url, '://')) { $url = 'http://'.$_SERVER['HTTP_HOST'].$url; }
Header('Location: '.$url);
?>
<html><head><title>Oops!</title></head><body><p><p>
Ваш бpаузеp не понимает HTTP redirect (status code: <?=$code?> ).<br>
Следуйте по <a href=" <?=$url?> ">этой ссылке</a>.
</body></html>
<?
}
?>
Пpимеpы использования
my_redirect('/index.html');
my_redirect('http://warez.dot.no/');
my_redirect('accepted.html', 303);
Пояснения
1. Функции можно пеpедавать в качестве пеpвого паpаметpа либо локальный
адpес (если pедиpект делается в пpеделах сайта), либо полный URL (если
pедиpект делается на дpугой хост).
2. По умолчанию pедиpект делается со status code 302; однако спецификация
HTTP/1.1 тpебует использования status code 303 в том случае, если pедиpект
делается скpиптом в качестве ответа на POST (RFC 2616, секция 10.3.4). Если
вы хоpошо поняли, о чём идёт pечь, то указывайте код 303 в качестве
втоpого (необязательного) паpаметpа пpи ответе на POST, как показано в
пpимеpе 3. Если не очень хоpошо поняли, не указывайте ничего -- всё будет
pаботать и так :)
3. Hаличие небольшого гипеpтекстового довеска является обязательным
(RFC 2616, секция 10.3.3).
4. Само собой pазумеется, что скpипт не должен ничего выводить ДО вызова
этой функции.
> Dmitry Ban, 2:5020/1873.33
> Для перенаправления browser на нужный адрес (редирект) нужно
>воспользоваться конструкцией вида:
header("Location: " . $url);
Location должен задаваться абсолютным адресом, согласно RFC 2616
(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30):
"14.30 Location The Location response-header field is used to redirect the
recipient to a location other than the Request-URI for completion of the
request or identification of a new resource. For 201 (Created) responses,
the Location is that of the new resource which was created by the request.
For 3xx responses, the location SHOULD indicate the server's preferred URI
for automatic redirection to the resource. The field value consists of a
single absolute URI.
Location = "Location" ":" absoluteURI
An example is:
Location: http://www.w3.org/pub/WWW/People.html"
> Alexey Kolesnichenko
> Для перенаправления по относительному адресу:
header("Location: http://".$_SERVER['HTTP_HOST']
.dirname($_SERVER['PHP_SELF'])
."/".$relative_url);
> anatoly techtonik
-----------------------------------------------------------------------------
>>>8. Безопасность
-----------------------------------------------------------------------------
>>8.1. Я хочу ограничить доступ к одной из страниц. Хочу, чтобы при попытке
>>открытия этой страницы браузер у клиента вывешивал окошко и предлагал
>>ввести логин?
Читать: http://www.php.net/manual/en/features.http-auth.php
> Vova Rusakevich, 2:454/23.501
>>8.2. Я - hosting provider, как мне организовать безопасность скриптов
>>виртуальных серверов, т.е. что бы юзер Вася не смог сделать fread() файла
>>юзера Пети?
Это делается при помощи диррективы PHP : safe_mode, и параметра open_basedir.
Пример:
<VirtualHost 195.206.40.162:*>
ServerName tit.irk.ru
LanguagePriority ru en
DocumentRoot /home/users/WWW
<Directory /home/users/WWW>
php_admin_value open_basedir /home/users/WWW
</Directory>
</VirtualHost>
В итоге, если "умный" юзер Вася пытается что-то сделать с файлами за
пределами его (/home/users/WWW) дирректории, то он получает:
Warning: open_basedir restriction in effect. File is in wrong directory.
in /home/users/WWW/ss.pht on line 3
Warning: fopen("/etc/passwd","r") - Operation not permitted in
/home/users/WWW/ss.pht on line 3
За более детальным конфигом с комментариями:
http://www.php4you.kiev.ua/docs/php_limit.html
> Vitaliy N. Kravchenko, kvn(@)phbme.ntu-kpi.kiev.ua
Что бы дать юзеру хранить/читать/писать в файлы вне www, но в пределах
доступности скрипта нужно исправить строку:
php_admin_value open_basedir /home/users
> Oleg Krasnov, 2:5062/17.77
-----------------------------------------------------------------------------
>>>9. Где взять...
-----------------------------------------------------------------------------
>>9.1. Документацию
>>9.1.1 Где взять документацию по PHP?
Документацию по PHP можно взять тут: http://www.php.net/docs.php.
> Andrey Saterenko
Однако для тех, у кого стоит windows, существует гораздо более удобный и
полезный вариант в .chm формате с комментариями пользователей.
http://weblabor.hu/php-doc-chm/
> anatoly techtonik
Русский мануал к PHP (авторский, не официальный перевод) версии 4.2.* в HTML
находится по адресу
http://pyramidin.narod.ru/dwnl.htm
> SeazoN aka Sergey Sazonenkov, 2:469/142.999
>>9.1.2. Информация по написанию модулей для php.
http://www.zend.com/http://www.zend.com/apidoc/
> Vova Rusakevich, 2:454/23.501
>>9.1.3. Подскажите хороший сайт по php.
http://www.dklab.ru/ - Лаборатория dk
http://www.phpclub.net/ - PHPClub
http://php.spb.ru/ - PHP по-русски
-----------------------------------------------------------------------------
>>9.2. Скрипты
>>9.2.1. Где взять готовый скрипт гостевой, форума и т.п.?
Вот несколько ссылочек:
http://webscript.ru/http://cgi.ru/http://hotscripts.com/http://cgi-fan.com/http://www.phorum.org/http://www.cgi-bin.ru/
>>9.2.2. Помимо гостевых, чатов и т.п. (хочется чего то..)
http://www.hotscripts.com/PHP/http://sourceforge.net/
-----------------------------------------------------------------------------
>>9.3. Редакторы
>>9.3.1. Всё, что существует на сегодняшний момент, не считая Far, UltraEdit
>>и им подобных.
PHP Coder http://www.phpide.de/
PHPEdit http://www.phpedit.net/
PHP Expert Editor http://www.ankord.com/phpxedit.html
Turbo PHP http://www.turbophp.com/turbo/
QaDRAM http://www.qadram.com/
DzSoft PHP Editor http://www.dzsoft.com/dzphp.htm
Arisesoft Winsyntax http://www.winsyntax.com/
> Zubarev Andrey, oistets(a)bogatyr.kz
-----------------------------------------------------------------------------
>>9.4. Хостинг
>>9.4.1. Какие существуют халявные хостинги c поддержкой PHP?
Из наших:
http://www.webservis.ruhttp://www.holm.ruhttp://www.hut.ruhttp://www.agava.ruhttp://www.fatal.ru
>
> Эти, обычно, нареканий не вызывают
http://www.kombat.ruhttp://www.zenon.ru
> Zubarev Andrey, oistets(a)bogatyr.kz
как создать таблицу в базе данных на удаленном сервере? с помощью рнр или СУБД (какую надо версию, если на сервере mySQL, или можно использовать SQL Server 2000, тогда какие нужны настройки?)