Часто задаваемые вопросы (FAQ) по PHP

Часто задаваемые вопросы (FAQ) по PHP

FAQ взят из конференции fido7.ru.php, дополняется и пополняется из той же конференции, а также из других источников. FAQ по PHP разрабатывается.

1. Общие вопросы

1.1 Что такое PHP?

(перевод документации) 

"PHP, что означает ‘PHP: Hypertext Preprocessor‘ 
(‘PHP: Предварительный Обработчик Гипертекста‘),  
является внедряемым в HTML языком описания скриптов. 

Многое из его синтаксиса было позаимствовано из C, Java и Perl 
с добавлением некоторых уникальных, 
специфичных для PHP, особенностей. 

Целью создания языка является предоставление web-разработчикам 
возможности быстрого создания 
динамически генерируемых страниц." 

(ответ ivan kovalenko, 2:5057/53)

1.2 Где взять PHP?

Hа сайте производителя: http://www.php.net/downloads.php 

(ответ ivan kovalenko, 2:5057/53)

1.3 Как расшифровывается ‘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)

2. Сетевые дела

2.1 Почему с‘апложенные jpeg-файлы не отобpажаются? (бьются?) Веб-сервер - русский Апач

Все дело в том, что русский Апач по умолчанию производит перекодировку файлов.
Так, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20).
Для борьбы с этим эффектом нужно добавить в конфигурационный файл 
Апача httpd.conf следующее:

    CharsetRecodeMultipartForms Off

(ответ Дмиртия Селезнева, 2:5095/6)

2.2 Как опpеделить валидность e-mail?

Функция, предложенная Maxim Matyukhin :

function valid_mail ($email) {
	if (eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-.]+).([a-z]{2,3}$)",
          $email, $check)) {
		if (getmxrr($check[1] . "." . $check[2]) return "Valid";
		else return "No MX for " . $check[1] . "." . $check[2];
	}

	else return "Badly formed address";
}

Есть другой способ, использующий сокеты, предложенный Jon S. Stevens

/*
By: Jon S. Stevens jon@clearink.com
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_NAMEn" );
                    $output = fgets ( $fp, 2000 );

                    fputs ( $fp, "MAIL FROM: 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, "QUITn" );
                    fclose( $fp );

                    if ( $return[0] == true )
                    { break; }

                }
            }
        }
    }
    return $return;
}


?> 

2.3 Как опpеделить валидность 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.1rn";
          $dump .=  "Host: $urlArray[host]rnConnection: closern";
          $dump .=  "Connection: closernrn";
          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 ]*‘,  "", $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; } ?> (ответ Дмиртия Селезнева, 2:5095/6)

3. PHP и БД

3.1 Имеем MySQL. Добавляем запись с автоинкрементным уникальным индексом.
Как узнать значение последнего индекса?

Есть замечательная функция mysql_insert_id ([идент. соединения]).
 Возвращает целое значение, которое и есть необходимый идентификатор, 
сгенерированный полем AUTO_INCREMENT в последем операторе INSERT. 

Подробно см. в доках по функциям PHP. 

(ответ Дмиртия Селезнева, 2:5095/6)

4. PHP на Win32

4.1 Скрещивание PHP/Win32 и Apache/Win32

Предполагается, что вы уже установили PHP и Apache. 
Для внесения пущей ясности положим, что PHP установлен в каталоге 
‘C:HTTPphp‘, а Apache в ‘C:HTTPapache‘, причем Apache уже настроен и 
без лишней ругани отзывается на имя localhost, а необходимые изменения 
внесены в php.ini. Теперь определимся, каким образом PHP будет 
функционировать: в виде CGI-приложения [1] или как SAPI-модуль 
Apache [2] (разбор полетов на предмет различий см.)

1. Hастройка PHP в качестве CGI-приложения.

Откройте Notepad‘ом (FAR‘ом, NC, WinCmd, и т.п.) файл 
C:HTTPapacheconfhttpd.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:HTTPapacheconfhttpd.conf строчки: 

      LoadModule php4_module c:/HTTP/php/sapi/php4apache.dll
      AddType application/x-httpd-php .php

Тестирование 

Теперь перезапустите Apache. Создайте в каталоге 
C:/HTTP/apache/htdocs файл test.php следующего содержания:

Запустите браузер и перейдите на http://localhost/test.php. Если ваш 
браузер отобразил нечто табличное с большим количеством непонятной
 информации, примите поздравления. Если вместо этого ваши старания 
увенчались ‘Error 500 - Internal Server Error‘, попробуйте прочитать 
эту статью немного более внимательно.