Программирование::PHP - F.A.Q.
- www.google.com. Это, без шуток, самая важная ссылка по PHP. При некотором умении в ней можно нейти ответ на любой вопрос. Но даже и не обладая особыми навыками в поиске, можно получать порясающие результаты. Например, просто введите в строку поиска ту ошибку, которую выдал РНР.
- Языки программирования - PHP на WebClub.RU - www.webclub.ru/content/programming_php/ Ссылка оставлена в мемориальных целях...
- Официальная документация по PHP. Самая главная, полная, подробная и актуальная, с комментариями пользователей.
- Собрание ссылок на различные варианты документации, в том числе и русские переводы - http://phpfaq.ru/docs
- phpfaq.ru - Ответы на САМЫЕ ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ. Обязательно к прочтению. Вы обязательно столкнетесь с каждым из освещенных там вопросов.
- Клуб российских PHP разработчиков - http://www.phpclub.net/. Там же - самая мощная система форумов по PHP в России.
- Самый известный, наверное, российский ресурс - PHP по-русски. Во всяком случае, Яндекс, Гугль и я считаем именно так.
- Сайт Дмитрия Котерова, автора книги "Самоучитель по РНР", постоянного посетителя данного форума. Содержит значительное количество интересных материалов и оригинальных разработок, таких, как "Денвер", "Орфо". Недавно появился форум
- WebScript.Ru - каталог Internet, в котором собраны преимущественно свободно распространяемые скрипты, документация по языкам программирования Perl и PHP. Неплохой форум.
- http://spectator.ru/issues/161 - «Как сделать, чтобы URL в строке адреса был ясным и понятным, но без лишних заморочек». Дмитрий Смирнов пишет про ЧПУ (Человекопонятный УРЛ :-), в том числе - и про обработку 404-й ошибки (запрашиваемый документ документ не был найден).
- Числа прописью
- PHP в деталях. Собрание авторских статей на самые разные темы, посвященные РНР, и часто задаваемым вопросам по нему.
- Помоги себе сам. Как правильно задавать вопросы. Обширный текст, который реально может помочь с тем, как найти ответ на свой вопрос, и как правильно задать его в форуме.
- http://www.phpwizard.net/ - ресурс, ориентированный на PHP. Проекты (такие как phpMyAdmin, phpChat), ссылки, руководства и т.п.
- http://www.phpbuilder.com/ - статьи. много и умные.
- http://www.zend.com/ - "Zend - лидер в технологии PHP. Наша миссия - в том, чтобы обеспечить коммерческую жизнеспособность и поддержку PHP решений для Web."
- http://www.soysal.com/PHPEd/ - небольшой редактор, сделанный по подобию HomeSite, но для php
- http://www.hotscripts.com/PHP/ - одно из самых больших собраний готовых скриптов.
- http://sourceforge.net/ - сервис для разработчиков, работающих по принципу Открытого Исходного Кода: форумы, исходники и т.п.
- http://www.devshed.com/Server_Side/PHP/
- WeberDev.com (англ.) - http://www.weberdev.com/ "... был задуман в качестве демонстрации примеров кода, так, чтобы это было более легко для программистов новичка в области php3..."
- Графическая библиотека GD (англ.): A graphics library for fast image creation - http://www.boutell.com/gd/
Но есть некоторые элементы (например SELECT с опцией множественного выбора MULTIPLE), где в качестве значения фигурирует не одно, а группа (коллекция). Что делать в этом случае?
Такие элементы передаются в виде коллекции.
В HTML коде подобного элемента в названии элемента следует указать []
Например:
<select name=collect[] multiple> <option value="one">one</option> <option value="two">two</option> <option value="three">three</option> <option value="next">next</option> </select>
В этом случае, в качестве значения в принимающий PHP скрипт попадет массив под именем $collect и размерности, равной числу выбранных элементов!
Более того! Подобный прием можно использовать для объединения в коллекцию и других параметров формы:
<? // php скрипт, демонстрирующий получение коллекций ?> <html> <head><title>Get Collection</title></head> <body> <form method="post" enctype="multipart/form-data" action="collection.php3"> <!-- элементы типа checkbox объединяются в коллекцию $collect1 --> <input type=checkbox name=collect1[] value="chk1"> one<br> <input type=checkbox name=collect1[] value="chk2"> two<br> <input type=checkbox name=collect1[] value="chk3"> три <p> <!-- коллекция $collect2 служит для передачи значения SELECT с множественным выбором --> <select name=collect2[] multiple> <option value="one">one</option> <option value="two">two</option> <option value="three">three</option> <option value="next">next</option> </select> <p> <input type="submit" name="Submit" value="post"> </form> </body> </html> <? if(count($collect1) > 0) { echo "<b>Checkboxes:</b><br>"; for ($i=0; $i<count($collect1); $i++) { echo $collect1[$i], "<br>"; } } if(count($collect2) > 0) { echo "<p><b>Selected:</b><br>"; for ($i=0; $i<count($collect2); $i++) { echo $collect2[$i], "<br>"; } } ?>
<html> <head></head> <body> <!-- указание enctype="multipart/form-data" является обязательным!!! --> <form method="post" action="upload.php3" enctype="multipart/form-data"> <b>Файл</b><br><input type="file" name="form_data" size=40 maxlength=255> <br> <input type="submit" name="sibmit" value="upload"> </form> </body></html>
Принимающий скрипт, выглядит примерно так:
<? $data = fread(fopen($form_data, "r"), filesize($form_data)); // если надо класть файл в БД, то нужна предварительная операция: // $data = addslashes(fread(fopen($form_data, "r"), filesize($form_data))); // путь к директории, в которую будут сохраняться файлы $path = "/repository/"; $fpwrite = fopen("$path$form_data_name", 'wb'); if(!$fpwrite) { echo "$errstr ($errno)<br>\n"; exit; } else { fwrite($fpwrite, $data, filesize($form_data)); fclose($fpwrite); echo "download file: $form_data_name - PASS!"; } ?>Замечание:
==========
Достаточно частой ошибкой является перекодирование http-сервером принимаемых данных.
Если у Вас русский Apache, то эта проблема "лечиться" выставлением директивы:
CharsetRecodeMultipartForms off
Эта директива может быть выставлена как в файле httpd.conf, так и в .htaccess
или
require("second.php3");
Вложенный таким образом скрипт "увидит" существующие переменные, все что Вам нужно - проинициализировать переменные перед вызовом:
$my_var = "test";
$file = file($filename). Она читает $filename в массив($file).
Пример:
$file=file($filename); for ($i=0; $i<=count($file); $i++) { echo $file[$i], "
"; }
Просто вывести их как <?echo somephpvar?>
Пример:<? $somephpvar = "http://$SERVER_NAME$REQUEST_URI"; ?> <script language="JavaScript"> var somejsvar = "<?echo $somephpvar?>"; alert(somejsvar); </script> <form action="<?echo $somephpvar?>" method=post> <input type=submit name="submit" value="ok"> </form>
Header("Location: $URL");
вызов: php [-q] [-h] [-s] [-v] [-i] [-f ] | { [args...]} -q Quiet-mode. Подавление заголовка HTTP. -s Подсветка синтаксиса . -f <file> Parse . Implies `-q' -v Номер версии -p Pretokenize a script (creates a .php3p file) -e Execute a pretokenized (.php3p) script -c <path> Искать файл php3.ini в -i PHP information -h Эта справка
Шифрование - одностороннее, это означает, что вы не можете декодировать зашифрованный пароль, вы можете только сравнить два зашифрованных пароля.
Например:if (crypt($InputPassword) == $StoredPassword) { echo "Pasword PASS..."; } else { echo "Password FAIL..."; }
Вот некоторые из таких переменных:
- $HTTP_REFERER
- Адрес страницы (если имеется), c которой агент пользователя был направлен на текущую страницу. Устанавливается агентом рользователя; не все агенты пользователя установливат это значение!
- $SERVER_NAME
- имя сервера, на котором выполняется скрипт, например: 'www.webclub.ru'
- $REQUEST_URI
- URI вызавемого скрипта, пример: /vars.php3. $GATEWAY_INTERFACE Какая версия спецификации CGI используется сервером, например: 'CGI/1.1'.
- $SERVER_SOFTWARE
- Строка идентификации Сервера, указываемая в заголовках при ответе на запросы.
- $SERVER_PROTOCOL
- Название и версия протокола обращения к странице, например: 'HTTP/1.0';
- $REQUEST_METHOD
- Метод обращения к странице: 'GET', 'HEAD', 'POST', 'PUT'.
- $QUERY_STRING
- строка запрашиваемых в URL параметров при обращении к странице (если есть).
- Комметарий: надежнее использовать функцию getenv:
$query=getenv("QUERY_STRING");
- $DOCUMENT_ROOT
- корневая директория сервера $REMOTE_ADDR IP адрес, с которого обратились к странице.
- $REMOTE_PORT
- Порт, используемый в машине пользователя, чтобы связаться с сервером сети
- $SCRIPT_FILENAME
- Абсолютный путь к скрипту.
- $PATH_TRANSLATED
- путь для файловой системы (не root!) к вызванному скрипту.
- $SCRIPT_NAME
- имя скрипта.
Так же список всех переменыых окружения и настроек PHP выводится функцией phpinfo(). Рекомендуется запускать ее для проверки на каждом новом для Вас хостинге. Встречаются некоторые коварные хостинги, на которых переменные окружения Апача могут определяться не совсем так, как мы того ожидаем ...
На практике это означает, что если перед вызовом SetCookie() есть какой-либо вывод: echo, HTML-текст вне PHP-кода или PHP-скрипт, устанавливаюший Cookie, вызывается включением через <!--#include ... -->, то SetCookie выдает ошибку или (в последнем случае) cookie не установится.
Если Вы не можете вызвать SetCookie() в начале, то придется воспользоваться выставлением cookie через JavaScript или <META ..>-тэги.
Для сведения: в PHP4 есть возвожность кеширования вывода, т.е. cookie можно выставить в любом месте скрипта, а интерпретатор PHP выдаст страницу клиенту после выполнения.
Если все правильно - добавляем запись и делаем ПЕРЕНАПРАВЛЕНИЕ Status: 301 Moved Permanently\n Location: $relocation\n
Если нет - опять рисуем форму и выдаем сообщение об ошибке
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0", false);
header("Cache-Control: max-age=0", false);
header("Pragma: no-cache");
// так выглядит запрос $head="GET http://www.rambler.ru HTTP/1.1\r\n\r\n"; // соединяемся с прокси сервером $fp = fsockopen("192.165.0.10", 3128); if($fp) {// если все cool, то... // передаем запрос fputs($fp,$head); // читаем 65000 байт $returndata= fread($fp,65000); // закрываем соединение fclose($fp); } // выводим результат print $returndata;
(C) Сергей Захаров
header("Content-Disposition: attachment; filename=file.dat"); header("Content-Type: application/x-force-download; name=\"file.dat\"");Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php.
Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.
(c) Владимир Палант
php_value <value_name> <value> и
php_flag <flag_name> 1|0 - для задания булевых значений.
Например:
php_value auto_prepend_file /path/from/root/directory/authorise.inc.php
или так:
php_flag dispaly_errors 1
Естсетвенно, следует помнить, что действие .htaccess распространяется на текущую и вложенные директории, и в конфигурации Апача должна быть задана опция AllowOverride All (or Options). В общем, про работу с .htaccess читайте ман к Апачу.
http://www.gingerall.com/charlie/ga/xml/l_sab_faq.xml#q7
Более полный ответ здесь:
http://faq.phpclub.net/index.php3?theme=1&level=4&question_id_select=41&chapitre_id_select=41&document_id_select=2
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
2.Добавлять в конец сылки, выводящей кртинку, какую-то случайную величину: function ShowPic()
{
document.images["pic"].src="http://127.0.0.1/php/echo_test.php?"+Math.random();
}
или так:
srand ((double) microtime() * 1000000);
$rnd=rand();
echo "<img src='http://127.0.0.1/php/echo_test.php?смысловые_параметры&rnd=$rnd'>";
Зеркало на PHPClub-е
Это достаточно свежий перевод, вполне подходящий для изучения PHP, но надо помнить, что более точной является документация на оригинальном сайте.
Русская документация по MySQL
Например:
Передаем методом GET: script.php?var=value
echo $_GET['var'] напечатает "value".
Подробнее об этом можно прочитать здесь: http://www.xpoint.ru/archive/topic8/43/8759.html
Там написано, как в gd рисовать по-русски, не дергая truetype при этом.
(c) Гоша
1. Apache2 по всем тестам работает процентов на 15-20 медленнее Apache 1.3*. Этот факт давно известен, в том числе и разработчикам Apache. Выигрыш от его использования может быть только на очень больших сайтах и заключается только в меньшем расходе памяти при большой нагрузке (100 процессов httpd жрут памяти больше, чем 100 нитей Apache2). В Apache2, несмотря на то, что разработчики называют его стабильным, довольно часто находят довольно серьезные баги. Это объяснимо, учитывая то, что код Apache2 еще достаточно новый, в отличие от вылизанного временем кода Apache1.3
2. В PHP полно расширений, при программировании которых не была применена практика безопасного программирования для нитей (thread-safe). Поэтому, даже если ядро языка перестанет быть экспериментальным для Apache2, никто не гарантирует, что любое из расширений не сможет вызвать крах системы.
3. Наконец, последняя версия Apache2 нисколько не "свежее" последней версии ветки 1.3.
Максим Деркачев
<?php $photoImage=ImageCreateFromJPEG("photo.jpg"); ImageAlphaBlending($photoImage, true); $logoImage=ImageCreateFromPNG("logo.png"); $logoW=ImageSX($logoImage); $logoH=ImageSY($logoImage); ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, $logoW, $logoH); ImageJPEG($photoImage); // вывод в браузер ImageDestroy($photoImage); ImageDestroy($logoImage); ?>
2. Если PHP установлен как CGI и ваша программа работает из коммандной строки (в консольном режиме), то данные можно читать из стандартного потока ввода stdin, как из обычного файла.
Для этого достаточно открыть этот поток:
$stdin = fopen("php://stdin", "r");
3. Если PHP как модуль, то данный можно получить из глобальной переменной $HTTP_RAW_POST_DATA (она же $GLOBALS['HTTP_RAW_POST_DATA']). Для этого необходимо в файле php.ini раскомментировать/добавить следующую строчку:
always_populate_raw_post_data = On
или добавить в файл .htaccess:
php_flag always_populate_raw_post_data On
// кеш-френдли вывод картинки
$fname=@$_GET['fname']; // обязательно проверить имя!
if(!is_readable($fname))
exit();
$headers=getallheaders();
$rtime=strtotime(@$headers['If-Modified-Since']);
$fp=fopen($fname,'rb');
$fs=fstat($fp);
$mtime=$fs['mtime'];
if($rtime>=$mtime){
header("HTTP/1.0 304 Not Modified");
exit();
}
header('Content-Type: application/x-shockwave-flash');// или image/jpeg итп
header('Content-Length: '.filesize($fname));
header('Last-Modified: '.gmdate('D, d M Y H:i:s',$mtime).' GMT');
header('Cache-control: public');
fpassthru($fp);
© Гоша
$arguments = array( '/_xml' => $xml, '/_xsl' => $xsl ); $res = xslt_process($xs,'arg:/_xml', 'arg:/_xsl', NULL, $arguments);Исследования же Михаила Кюршина выявили, что xslt_process принимает адреса файлов. Нужен именно адрес (URL) а не путь на диске.
К примеру:
file://C:/xxx/ooo.xml — это адрес
а
C:/xxx/ooo.xml — это путь на диске.