Xpoint
   [напомнить пароль]

Программирование::PHP - F.A.Q.

Как правильно читать ман. Все перечитал - а нужного не нашел...
Полезные ссылки
  1. www.google.com. Это, без шуток, самая важная ссылка по PHP. При некотором умении в ней можно нейти ответ на любой вопрос. Но даже и не обладая особыми навыками в поиске, можно получать порясающие результаты. Например, просто введите в строку поиска ту ошибку, которую выдал РНР.
  2. Языки программирования - PHP на WebClub.RU - www.webclub.ru/content/programming_php/ Ссылка оставлена в мемориальных целях...
  3. Официальная документация по PHP. Самая главная, полная, подробная и актуальная, с комментариями пользователей.
  4. Собрание ссылок на различные варианты документации, в том числе и русские переводы - http://phpfaq.ru/docs
  5. phpfaq.ru - Ответы на САМЫЕ ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ. Обязательно к прочтению. Вы обязательно столкнетесь с каждым из освещенных там вопросов.
  6. Клуб российских PHP разработчиков - http://www.phpclub.net/. Там же - самая мощная система форумов по PHP в России.
  7. Самый известный, наверное, российский ресурс - PHP по-русски. Во всяком случае, Яндекс, Гугль и я считаем именно так.
  8. Сайт Дмитрия Котерова, автора книги "Самоучитель по РНР", постоянного посетителя данного форума. Содержит значительное количество интересных материалов и оригинальных разработок, таких, как "Денвер", "Орфо". Недавно появился форум
  9. WebScript.Ru - каталог Internet, в котором собраны преимущественно свободно распространяемые скрипты, документация по языкам программирования Perl и PHP. Неплохой форум.
  10. http://spectator.ru/issues/161 - «Как сделать, чтобы URL в строке адреса был ясным и понятным, но без лишних заморочек». Дмитрий Смирнов пишет про ЧПУ (Человекопонятный УРЛ :-), в том числе - и про обработку 404-й ошибки (запрашиваемый документ документ не был найден).
  11. Числа прописью
  12. PHP в деталях. Собрание авторских статей на самые разные темы, посвященные РНР, и часто задаваемым вопросам по нему.
  13. Помоги себе сам. Как правильно задавать вопросы. Обширный текст, который реально может помочь с тем, как найти ответ на свой вопрос, и как правильно задать его в форуме.
Некоторые западные ресурсы:
  1. http://www.phpwizard.net/ - ресурс, ориентированный на PHP. Проекты (такие как phpMyAdmin, phpChat), ссылки, руководства и т.п.
  2. http://www.phpbuilder.com/ - статьи. много и умные.
  3. http://www.zend.com/ - "Zend - лидер в технологии PHP. Наша миссия - в том, чтобы обеспечить коммерческую жизнеспособность и поддержку PHP решений для Web."
  4. http://www.soysal.com/PHPEd/ - небольшой редактор, сделанный по подобию HomeSite, но для php
  5. http://www.hotscripts.com/PHP/ - одно из самых больших собраний готовых скриптов.
  6. http://sourceforge.net/ - сервис для разработчиков, работающих по принципу Открытого Исходного Кода: форумы, исходники и т.п.
  7. http://www.devshed.com/Server_Side/PHP/
  8. WeberDev.com (англ.) - http://www.weberdev.com/ "... был задуман в качестве демонстрации примеров кода, так, чтобы это было более легко для программистов новичка в области php3..."
  9. Графическая библиотека GD (англ.): A graphics library for fast image creation - http://www.boutell.com/gd/
Передача из формы параметров с множественным значением (коллекция SELECT multiple и т.п.)
При передаче данных из одного файла PHP далее для обработки, передается массив вида имя_элемента - значение.
Но есть некоторые элементы (например 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>";
  }
}
?>
Как сделать upload картинки через форму?
Простой HTML-код для организации закачки файла с машины пользователя выглядит так:
<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
Как я могу вызвать скрипт .php3 внутри другого скрипта и передать туда некоторые переменные? Что-то аналогичное <!--#include virtual="second.php3?my_var=test" --> для SSI
Используйте include ("second.php3");
или
require("second.php3");

Вложенный таким образом скрипт "увидит" существующие переменные, все что Вам нужно - проинициализировать переменные перед вызовом:
$my_var = "test";
Как можно прочитать строку из файла?
Помимо использования функция fgetc() fgets() fgetss(), Вы можете использовать
$file = file($filename). Она читает $filename в массив($file).

Пример:
$file=file($filename);
for ($i=0; $i<=count($file); $i++) {
    echo $file[$i], "
"; }
Как передать значение переменной из PHP скрипта в функцию JavaScript или в HTML-код?

Просто вывести их как <?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>
Как я могу перенаправить посетителя на другой URL из php скрипта?
Воспользоваться функцией:
Header("Location: $URL");
Как сделать так, чтоб не выдавалась строка "Content-Type ...", когда я запускаю PHP из командной строки?
вызов: 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           Эта справка
Я использую шифрование паролей с помощью UNIX, как мне проверить соответствие введенного пароля зашифрованному?

Шифрование - одностороннее, это означает, что вы не можете декодировать зашифрованный пароль, вы можете только сравнить два зашифрованных пароля.

Например:
if (crypt($InputPassword) == $StoredPassword) {
    echo "Pasword PASS...";
} else {
    echo "Password FAIL...";
}
Как узнать URL выполняемого скрипта, страницу, с которой пришел посетитель и т.п.?
В PHP (и не только) существуют предопределенные переменные окружения веб-сервера. Ниже - список для сервера Apache... Как сказано в руководстве: "если Вы используете другой веб-сервер, мы не гарантируем наличия всех, нижеприведенных переменных...."

Вот некоторые из таких переменных:

$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
имя скрипта.
Полный список - раздел Predefined variables в руководстве по PHP http://ru.php.net/manual/en/language.variables.predefined.php
Так же список всех переменыых окружения и настроек PHP выводится функцией phpinfo(). Рекомендуется запускать ее для проверки на каждом новом для Вас хостинге. Встречаются некоторые коварные хостинги, на которых переменные окружения Апача могут определяться не совсем так, как мы того ожидаем ...
Cookie не устанавливается или выдается сообщение об ошибке при обращении к SetCookie.
Дело в том, что Cookie явлается частью HTTP-заголовка документа. Указание SetCookie() должно происходить до окончания вывода HTTP-заголовка (подробнее см. Hypertext Transfer Protocol -- HTTP/1.1).

На практике это означает, что если перед вызовом SetCookie() есть какой-либо вывод: echo, HTML-текст вне PHP-кода или PHP-скрипт, устанавливаюший Cookie, вызывается включением через <!--#include ... -->, то SetCookie выдает ошибку или (в последнем случае) cookie не установится.

Если Вы не можете вызвать SetCookie() в начале, то придется воспользоваться выставлением cookie через JavaScript или <META ..>-тэги.

Для сведения: в PHP4 есть возвожность кеширования вывода, т.е. cookie можно выставить в любом месте скрипта, а интерпретатор PHP выдаст страницу клиенту после выполнения.


Как отследить повторный вызов скрипта при обновлении страницы
СКРИПТ отрисовывает форму и посылает данные ПОСТом самому себе.

Если все правильно - добавляем запись и делаем ПЕРЕНАПРАВЛЕНИЕ Status: 301 Moved Permanently\n Location: $relocation\n

Если нет - опять рисуем форму и выдаем сообщение об ошибке

Как отключить кеширование страницы php-скрипта?
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
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");

Работа с сокетами. Пример: как скачать файл(страничку) через прокси
прокси-сервер: IP: 192.165.0.10 PORT: 3128
 
// так выглядит запрос 
$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) Сергей Захаров
Ручной Download, или как скриптом открыть пользователю окошко сохранения файла.
Чтобы в браузере открылся диалог "Сохранить файл" с названием файла file.dat, скрипт, перед отдачей файла, должен послать такие заголовки:
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 с помощью файла .htaccess
Многие опции, обычно указываемые в файле php.ini, могут быть изменены с помощью файла .htaccess. Существует два формата:
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 читайте ман к Апачу.
Как заставить Sablotron говорить по-русски?
Что по этому поводу пишет производитель:
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
Обновление картинки, сформированной php-скриптом
Варианты решения: 1. Выдавать заголовки, отключающие кеширование
// 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'>";
Как из РНР узнать разрешение экрана у пользователя?
Никак. РНР исполняется на сервере и ничего о компьютере клиента не знает.
В php.ini отключено использование cookies для передачи SID в сессиях. Но PHP всё равно пытается передавать SID в куках и не пытается даже подставлять SID в ссылки.
Скомпилируйте PHP с ключом --enable-trans-sid , собранный с таким ключом PHP будет автоматически подставлять session id в ссылки.
Где можно найти информацию для начинающих в РНР?
Где взять русскую документацию по РНР4? А по MySQL?
Человек по имени Александр Пирамидин перевел документацию от версии 4.2.1
Зеркало на PHPClub-е

Это достаточно свежий перевод, вполне подходящий для изучения PHP, но надо помнить, что более точной является документация на оригинальном сайте.

Русская документация по MySQL
Не передаются переменные!!!
Данные в скрипт передаются. Просто начаная с версии 4.1, РНР перестал автоматически назначать их переменным. За это отвечает параметр register_globals в php.ini. Если он выключен, то получить значение переменной можно обратитившись к массиву, соответствующему способу передачи данных в скрипт.
Например:
Передаем методом GET: script.php?var=value
echo $_GET['var'] напечатает "value".
Подробнее об этом можно прочитать здесь: http://www.xpoint.ru/archive/topic8/43/8759.html
Как писать русскими буквам в GD без TrueType?
Вот есть такая страничка http://www.sbnet.ru/soft/gdfonts/pages/index.htm
Там написано, как в gd рисовать по-русски, не дергая truetype при этом.
(c) Гоша
Почему разработчики PHP не рекомендуют использовать его с Apache 2.x?

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.

Максим Деркачев

Как средствами GD поместить прозрачный логотип на свою фотографию
Если Вы хотите поместить прозрачное PNG-изображение на другое изображение, необходимо использовать ImageAlphaBlending, а также все использующиеся PNG-изображения должны быть сохранены в формате PNG-24 (опция Save for Web в Фотошопе). например Вы хотите поместить прозрачный логотип на свою фотографию. Тогда нужно сделать так:
<?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);
?>
как прочитать скриптом данные, посланные методом POST напрямую?
1. Размер блока переданных данных передается в переменной окружения CONTENT_LENGTH и читается из $_ENV["CONTENT_LENGTH"] или getenv("CONTENT_LENGTH")

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
Как сделать красивую превьюшку средствами GD
Для этого рекомендутся воспользоваться функциями imagecreatetruecolor() (для создания новой "правильноцветной" картинки и функцией imagecopyresampled() (для создания уменьшенной копии исходной картинки)
Как форсировать кеширование динамически-выдаваемых картинок

// кеш-френдли вывод картинки

$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);


© Гоша
Функция mail слишком долго отправляет письма. Как можно ускорить процесс отправки?
Отправлять письма не в рамках выполнения основного скрипта, а пораждать еще один процесс, выполняемый в фоновом режиме. Как из ПХП запустить процес в фоновом режиме, можно прочитать тут
XSLT-преобразования в PHP. Sablotron error on line 1: XML parser error 4: not well-formed (invalid token)
Не смотря на то, что написано в документации, реально в качестве аргументов xslt_process надо передавать не имена файлов, а их содержимое:
$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 — это путь на диске.
Как проверить, полностью ли докачался файл у пользователя (то есть, не отменил ли он загрузку на середине или вдруг у него инет вырубило)?
никак
Powered by POEM™ Engine Copyright © 2002-2005