вторник, 11 ноября 2008 г.

О дальнейшем постинге

По сути основы изучены.
Осталось разобраться с локальными переменными. Фактически они все в PHP локальные. То есть глобальные можно ввести, но как-то мутно.
Встроенные функции php удобно даны в документации на оффициальном сайте php.net
Кроме того, письменное фиксирование каждого прочитанного абзаца сильно снижает скорость изучения. Поэтому частота и количество постов должн
ы неизбежно уменьшиться.

Определение функций в PHP

Функции должны быть определены перед их использованием. Т.е. сначала идет определение функции и только в последующих строках её можно вызывать в скрипте.
Общий синтаксис таков

function MyFunction(arg1=value1, ... , argN=valueN)
{
operators;
};

Если функация не должны иметь аргументов, то круглые скобки после её имени оставляются пустыми.
Инструкция return
возвращает результат действия функции.
Пример

function mySqrt($x)
{
return $n*$n;
}
$value=mySqrt(4);
echo $value; //выведет 16
echo MYSqrt(10); //выведет 100

Параметры функции, которые могут быть опущены, должны всегда располагаться справа.

int func_num_args() - возвращает общее число аргументов, переданных функции при вызове
mixed func_get_arg(int $num) - возвращает значение аргумента с номером $num
list func_get_args() - возвращает список всех аргументов, указанных при вызове функции
Пример
//Переменное число параметров функции

<?php
function MyEcho()
{
for ($i=0; $i<func_num_args(); $i++)
{
echo func_get_arg($i)."<br />\n";
}
}
myecho("Меркурий", "Венера", "Земля", "Марс");
?>

Или проще

<?php
function myecho()
{
foreach (func_get_args() as $v)
{
echo "$v <br />\n";
}
}
myecho("Меркурий", "Венера", "Земля", "Марс");
?>

понедельник, 10 ноября 2008 г.

Сериализация: упаковка/распаковка

Сериализацией называется процесс упаковки/распаковки переменных в строку/из строки.
Упаковка:
string serialize(mixed $obj);
Распаковка
mixed unserialize(string $str);

Разбиение и слияние строк: explode() и implode()

explode() разбивает строку $str по подстроке $substr с возможностью указания предельного количества блоков разбиения $lim (наличие подстроки в последнем блоке игнорируется).
Имеет синтаксис
list explode(string $substr; string $str [, int $lim]);
Таким образом функция explode() возвращает список, состоящий из блоков количеством не более $lim
Функции implode() и её синоним join() производят обратную операцию - склейку блоков из списка $list при помощи заданной подстроки $substr и имеют синтаксис
string implode(string $substr; list $list);
string join(string $substr; list $list);

воскресенье, 9 ноября 2008 г.

Перебор массивов

Перебирать ассоциативные массивы можно с помощью функций reset() и next() для прямого перебора или end() и prev() - для обратного перебора.
for (reset($massiv); $k=key($massiv); next($massiv))
reset() - возвращает значение первого элемента массива
next() - возвращает значение элемента следующего за текущим
end() - возвращает значение последнего элемента массива
prev() - возвращает значение элемента пердшествующего текущему

Прямой метод перебора
foreach($massiv as $k=>$v)

Слияние массивов

Пусть у нас имеется два ассоциативны массива (!не нумерованных массива-списка!) $a и $b.
Тогда для их слияния используем операцию
$c=$a+$b;
Это действие некоммутативно, т.е. $a+$b не равно $b+$a
Для массивов-списков с цифровой нумерацией (индексацией) эта операция неприменима, т.к. оба списка неизбежно содержат элементы с одинаковыми индексами, которые не могут быть ни заменены, ни сложены с помощью этой операции. Новый массив в этом случае будет содержать элементы первого слагаемого для пересекающихся индексов. Впрочем и для ассоциативных массивов с нецифровой индексацией справедливо то же, если названия некоторых элементов совпадают - на этих местах останутся элементы первого слагаемого.
Слияние массивов с обновлением элементов массива может быть произведено с помощью функции array_merge()
$c=array_merge($a,$b);
либо можно воспользоваться оператором цикла foreach()
foreach($b as $i=>$v) $a[$i]=$v;

Функция count()

озвращает количество элементов массива.
В качестве её аргумента могут выступать также объекты и обычные переменные (значение count() для них всегда 1, как для массивов, состоящих из одного элемента).
Синтаксис
$n=count($massiv);

Создание массивов. Оператор array()

Синтаксис на примерах
$massiv=array("Nakhodkin"=>"Ivan", "Kubov"=>"Semen", "Dergach"=>"Petr"); //создает ассоциативный массив

$имена=array("Ivan Nakhodkin", "Semen Kubov", "Petr Dergach"); //создает
нумерованный массив с элементами [0][1][2] (по сути тоже ассоциативный)

2- и более мерные массивы создаются подобным же образом с помощью оператора array(). Отличие лишь в том, что слева от оператора присваивания стоит не переменная массива, а элемент этого массива, т.е. 2-мерный массива составляется как одномерный, каждый элемент которого в свою очередь является одномерным массивом.
Вот пример

$X_files=array(
"Nakhodkin"=array("имя"=>"Ivan", "семейное_положение"=>"холост"),
"Kubov"=array("имя"=>"Semen", "семейное_положение"=>"холост"),
"Dergach"=array("имя"=>"Petr", "семейное_положение"=>"женат")
);

Обращение к информации происходит с помощью указания 2-х индексов. Например, чтобы получить информацию об имени запрос должен выглядеть так

echo $X_files["Kubov"]["имя"]; //будет напечатано "Semen"

Каждый элемент ассоциативного массива в адресуется строго по ключу (переменной массива с индексом/индексами). Адресовать массив, если его возвращает некая фукция, напрямую через имя этой функции нельзя.
Т.е. запись типа

echo Некая_функция_возвращющя_массив()[4];

недопустима.
Сначала нужно инициализировать переменную, которая будет содержать возвращаемый функцией массив, и адресовать элементы массива уже через эту переменную.
Примерно так

$massiv=Некая_функция_возвращющя_массив();
echo $massiv[4];

суббота, 8 ноября 2008 г.

Оператор list()

присваивает элементам одномерного массива заданные значения.
Синтаксис

list($имя, $фамилия, $отчество, $дата_рождения)=$список;

Элементы списка, которым ничего присваивать не нужно, просто пропускаются.
Например

list(, $фамилия, , $дата_рождения)=$список;

Ассоциативные массивы

Существуют обычные нумерованные массивы типа $massiv[n], которые чаще именуются списками, элементы в которые могут добавляться как по номеру

$massiv[0]="Ivan Nakhodkin";
$massiv[1]="Semen Kubov";
$massiv[2]="Petr Dergach";

, так и последовательно, без указания номера (или индекса)

$massiv[]="Ivan Nakhodkin";
$massiv[]="Semen Kubov";
$massiv[]="Petr Dergach";

Главное в обоих случаях следить, чтобы имя переменной, задействованное под массив (в нашем случае это $massiv[]) не было уже ранее инициализированно.
Но списки могут быть не только нумерованными цифрами, элементы списка могут метиться также и строками (т.е. не только одним словом, но и предложениями, символами перевода строки и т.д.) Такие массивы называются ассоциативными массивами.
Можно переделать наш массив-список в простой ассоциативный массив, который по структуре будет напоминать записную книжку

$massiv["Nakhodkin"]="Ivan";
$massiv["Kubov"]="Semen";
$massiv["Dergach"]="Petr";

Инструкции require и include

С помощью этих инструкций можно разбить текст программы на несколько файлов.синтаксис

require "имя_файла";

При работе скрипта эта инструкция просто заменяется на содержимое файла.Однако так поступать не рекомендуется как раз из-за в общем-то излишнего дробления кода, что делает его неудобочитаемым и замедляет к тому же.Инструкция include идентична require за исключением случая невозможности подключения файла. Тогда вместо аварийного завершения скрипта выводится диагностическое сообщение.


Инструкции однократного включения
В больших и сложных скриптах, зачастую состоящих из нескольких файлов, приходится прибегать к инструкциям включения. Но в этом случае становится сложно отследить повторные включения, которые чаще всего ведут к ошибкам.Выход из такой ситуации предлагают инструкции однократного включения.

require_once

include_once

Отличаются от require и include тем, что если обнаруживают, что требуемый код уже был однажды влкючен, то просто не пытаются включить его повторно, что позволяет избежать конфликтов переопределения.

пятница, 7 ноября 2008 г.

Конструкция switch case

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

switch (выражение)
{
case: значение1: команды1; [break;]
...
case: значениеN: командыN; [break;]
[default: команды_по_умолчанию; [break;]]
}

Операторы break; необязательны, но если их нет, то в случае case: значениеX: выполнятся не только команды непосредственно следующие за case: значениеX:, но и все дальнейшие.
Альтернативный синтаксис таков

switch (выражение):
case значение1: команды1; [break;]
...
case значениеN: командыN; [break;]
[default: команды_по_умолчанию; [break;]]
endswitch;

Цикл foreach

предназначен специально для перебора всех элементов массива
Синтаксис

foreach ($массив as $ключ=>$значение)
команды;

Например отобразим содержимое всех переменных окружения

<?php
foreach ($_SERVER as $k=>$v)
echo "<strong>$k</strong> => <tt>$v</tt> <br /> \n";
?>

Альтернаривный синтаксис (когда не интересует название ключа массива)

foreach ($массив as $значение)
команды;

Полезно для работы с массивами-списками.
Цикл foreach оперирует не исходным массивом, а его копией. Это в частности означает, что изменения, внесенные в массив после вызова цикла, не будут доступны сразу.
Чтобы иметь возможность изменять массив прямо из тела цикла, используется синтаксис

foreach ($массив as $ключ=>$значение)
{
// здесь можно изменять $значение
// При этом меняются элементы исходного массива $массив
}

Полезный пример использования цикла do while с break


<!-- Модель сценария для обработки формы -->
<?php
$WasError=0; //это индикатор ошибки, если не 0, то ошибка была
if (isset($_REQUST['doSubmit'])) do // Если нажата кнопка Submit с именем "doSubmit" то начинам цикл do while
{
if ($_REQUEST['login']!='user_login') {$WasError=1; break;}
if ($_REQUEST['password']!='user_password') {$WasError=1; break;}
//Если и совпали, то все в порядке
echo "Congratulation! All is correct!";
exit();
while(0);
}
if ($WasError)
{echo "Wrong! Try again."}
?>

Это обычный способ организации диалога с проверкой данных.
Вот форма для вышеприведенного скрипта

<form action"<?=$_SERVER['REQUEST_URI']?>" mathod=post>
Login: <input type="text" name="login" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" name"doSubmit" value="ENTER" />
</form>

Запустив скрипт без параметров, пользователь получит данную форму с приглашением ввести свой логин и пароль.
При нажатии кнопки запускается тот же самый сценарий, который в этот раз проверяет, была ли введенная информация верна и если нет, то выводится та же форма с сообщением о неверном вводе. Если же все верно, то выводится приветствие.
Цикл исполняется всегда один раз, т.к. выражение while(0) всегда заведомо ложно.

Инструкции break и continue

Иногда во время исполнения цикла необходимо прервать его при выполнении какого-то условия.
Для этого и существует команда break(n), где n-номер цикла из которого следует выйти (отсчитывается от текущего цикла наружу),
Синтаксис на примере

for ($i=0; i<count($matrix); $i++)
{
for ($j=0; $j<count($matrix[$i]); $j++)
{
if ($matrix[$i][$j]==0) break(2);
}
}
if ($i<10) echo 'Обнаружен нулевой элемент матрицы';

Функция count() в рассмотренном примере возвращает кол-во элементов в матрице.

Команда continue при выполнении заданного условия немедленно переходит к следующей итерации цикла.
Синтаксис
continue(n);
где n -номер цикла, считая от текущего, который должен быть продолжен (по умолчанию n=1).
В качестве примера приведен цикл, который печатает только те элементы массива $file с именами файлов и директорий, которые являются файлами

for ($i=0; $i<count($file); $i++)
if ($file[$i]==".") continue;
if ($file[$i]=="..") continue;
if (is_dir($file[$i])) continue;
echo "Найден файл: $file[$i]<br />";

четверг, 6 ноября 2008 г.

Циклические конструкции

Цикл с предусловием WHILE
Сначала проверяется предусловие и пока оно верно, выполняется заданный набор команд.
Синтаксис
while (пред/условие)
{
команда1;
команда2;
}
Например
<?php
$i=1; $n=2;
while ($i<=32)
{
echo $n;
$n*=2;
$i++;
}
?>

Цикл с постусловием DO WHILE
Команды в теле этого цикла выполняются хотя бы один раз, т.к. проверка условия производится после.
Синтаксис
do {
команды;
}
while (условие);

Цикл FOR
for (инициализирующие команды; условие; команды после прохода)
{
тело цикла;
}
Например
for ($i=0, $j=0, $k="Test"; $i<10; $j++ , $i+=$j) $k.=".";
Альтернативный синтаксис
for (инициализирующие команды; условие; команды после прохода)
тело цикла;
endfor;

Условная конструкция IF () ELSE

Синтаксис
if (условие)
команда1;
else
команда2;

Если команды неодиночные, тогда этот блок команд заключается в фигурные скобки:
if (условие) {
команда1;
команда2;
}
else {
команда3;
команда4;
}
В случае истинности условия IF выполняется первый блок команд.
Если условие не выполнено, управление передается следующим командам.
Таким образом, если необходимо обработать всего одно условие IF (без отдельной обраборки ELSE), тогда достаточно просто опустить ELSE.
Если же рассматривается случай обработки множественных условий, тогда дополнительно используется конструкция ELSE IF или слитно ELSEIF:
if (условие1) {
команда1;
команда2;
}
elseif (условие2) {
команда3;
команда4;
}
else {
команда5;
команда6;
}
Можно не использовать фигурные скобки, но тогда нужно сообщить о завершении условной конструкции командой ENDIF.
if (условие1):
команда1;
команда2;
elseif (условие2):
команда3;
команда4;
else:
команда5;
команда6;
endif
Следует также заметить, что в этом случае обязательно двоеточие после каждого условия(!), иначе выдается ссобщение о синтаксической ошибке.

среда, 5 ноября 2008 г.

Работа со списками

Передача (или, иначе, трансляция) полей формы работает корректно в случае, если каждый элемент формы имеет свое уникальное имя. Если же это не так, то в качестве значения передается последнее значение.
Например:
<select name="Vybor" multiple>
<option />1
<option />2
<option />3
<option />4
<option />5
</select>
если выбрать в этой форме любые две строки (3 и 5), то передано будет значение только последней выбранной (Vybor=5).
Выход из этой ситуации предлагает автомассив.
<select name="Vybor[]" multiple>
<option />1
<option />2
<option />3
<option />4
<option />5
</select>
По умолчанию он начинается с нулевого элемента и при пустом аргументе в квадратных скобках [номере элемента массива] добавляет еще один элемент за последним.
Теперь при множественном выборе будем иметь Vybor[]=3&Vybor[]=5
Переменная окружения $_REQUEST[], сама являющаяся массивом, будет тогда содержать в себе еще один массив, т.е. при обработке запроса оперировать следует 2-мерным массивом данных:
echo $_REQUEST['Vybor'][0]; // будет выведено 3
echo $_REQUEST['Vybor'][1]; // будет выведено 5
Автомассивы могут применяться с любыми элементами формы, не только с <select>
И поскольку массивы могут содержать различные элементы, то один и тот же автомассив может быть одновременно применен для разных элементов.

Работа с формами

Данные, введенные в форму можно получить либо разбором (парсирование) строки из переменной окружения QUERY_STRING
echo $_SERVER[QUERY_STRING];
либо напрямую из массива переменной _REQUEST
$_REQUEST['login'];
$_REQUEST['pass'];

В php-вставках в html-коде вместо <?echo выражение ?> для вывода текста можно пользоваться короткой формой <?=выражение ?>
Чтобы не привязываться к конкретному имени скрипта можно воспользоваться переменной окружения $_SERVER['SCRIPT_NAME'] (особенно полезно в случае рекурсивного скрипта, т.е. ссылающегося на себя)

Константы в PHP

определяются оператором define(); следующим образом
define("pi",3.14159);

вторник, 4 ноября 2008 г.

Выражения/Операции


Выражения
Примеры выражений
$x=4;
$y=$x;
$y=($x=4); или $y=$x=4;

Преобразование типа переменной
Пусть имеем переменную $b типа string, но содержащию последовательность цифр, образующих целое число типа integer. Такую переменную можно получить например следующим образом:
$b="" . (70+$x);
Теперь приведем её к типу integer, чтобы с ней можно было например совершать арифметические операции
$c=intaval($b);
либо
$c=(int)$b;

Вот список функций преобразования типа:
$b=intaval(expression); либо $b=(int)(expression);
$b=doubleval(expression); либо $b=(double)(expression);
$b=strval(expression); либо $b=(string)(expression);
$b=(bool)(expression);

Логические операторы
> больше
< меньше
== равно
!= не равно
&& логическое И
|| логическое ИЛИ (OR)
! логическое отрицание НЕ
Эти операторы могут быть по мере надобности скомбинированы в логическое выражение, значение которого (true или false) может быть присвоено переменной.
Например $eq=$x==5; // $eq=true если $x==5
if ($eq) echo "все верно";


Строки
$multiline="Первая строка
вторая строка
..."

Строковые значения могут заключаться либо в апострофы либо в кавычки. Отличие заключается во внутристроковом синтаксисе.
Внутри апострофов не обрабатываются никакие спецсимволы. Для обеспечения возможности отображения всех символов имеется два исключения:
\' для отображения символа '(апостроф) внутри строки
\\ для отображения символа \(обратный слэш) внутри строки
Строка в кавычках - в этом случае обрабатываются спецсимволы $переменная а также
\n символ новой строки
\r возврат каретки
\t табуляция
\$ собственно $ для отличия от переменных
\" кавычка
\\ обратный слэш
\xNN NN-шестнадцатеричное представление символа

Вызов внешней программы
Строка в обратных апострофах `` заставляет запустить внешнюю программу.
$pr=`someprogram.com/d`
echo "<pre>$pr</pre>";
Получим ответ, что выдала программа. Впрочем, если включен "безопасный режим" PHP, то не все программы могут быть запущены на исполнение.

Операции
Арифметические
x+y сложение
x-y вычитание
x*y умножение
x/y деление
x%y остаток от деления (предпочтительно использовать с целыми x и y)

Строковые
a.b слияние строк
a[n] n-й символ строки
strlen();
substr();

Присваивание
$y=($x=2)+7;

$n=6;
$n += 1; //увеличить $n на 1
$msg="Woken";
$msg .="up $n times"; // теперь строка $msg="Woken up 7 times"

Инкремент/декремент
В связи с частым применением операций $x+=1 и $x-=1 введены их сокращенные записи $x++ и $x-- соответственно
Будущи присвоены некоей переменной операторы ++/-- передают этой переменной значение до своего действия (увеличения/уменшения).
Например
$x=15;
$y=$x--;
echo "x=$x , y=$y"; // x=14 , y=15
А будучи расположенными слева - значение после своего действия:
$x=15;
$y=--$x;
echo "x=$x , y=$y"; // x=14 , y=14

Операции с битами
a&b число с битами, которые установлены и в a и в b
a|b число с битами, которые выставлены либо в a либо в b
a<<b число, полученное сдвигом a на b битов влево
a>>b число, полученное сдвигом a на b битов вправо

Оператор эквивалентности
=== сравнивает не только переменные, но и их типы

Оператор @ перед переменной отключает сообщения об её ошибках.

понедельник, 3 ноября 2008 г.

Отладочные функции

string print_r(mixed $expression; bool $return=false);
Пример работы:
$a=array('a'=>'apple', 'b'=>'banana', 'c'=>array('x','y','z'));
echo "<pre>"; print_r($a); echo "</pre>";
в результате получим

Array
(
[a] => apple
[b] => banana
[c] => Array
(
[0] => x
[1] => y
[2] => z
)

)


string var_dump(mixed $expression, bool $return=false);
Выводит не только значения переменных, но и их типы.

string var_export(mixed $expression; bool $return=false);
выводит значения переменных в php-синтаксисе. Таким образом такая выдача может быть напрямую вставлена в php-код. Возможна автоматическая генерация скриптов.


Для всех вышеописанных отладочных функций справедливо следующее:
Если в функции будет указан параметр $return=true, тогда в браузере ничего не выводится, а возвращается отладочное представление в виде строки.

Ссылочные переменные в PHP

Жесткая ссылка
Ссылается на другую переменную с присвоенным той значением. Ссылка на ссылку не поддерживается.
Жесткая ссылка работает в обе стороны, т.е. при изменении значения одной из переменных меняется значение и другой переменной. Отсюда видимо и термин "жесткая" ссылка.
Для создания жесткой ссылки используется оператор =&
Пример:
$i=5;
$j=& $i; //объявляем жесткую связь (ссылку) между и
$j=8; //после такого присвоения переменная также приобретает значение 8
echo "i=$i , j=$j\n"; //действительно, на выходе видим i=8 , j=8

При объявлении жесткоссылочной переменной физическая память под неё не выделяется, а во внутренних таблицах PHP помечается лишь факт жесткой связки двух переменных. Соответственно при деинициалзации жесткоссылочной переменной разрывается лишь ссылочная связь, но физическая память не освобождается, ибо она и не была выделена. Память освобождается только при деинициализации первой объявленной переменной.

Символическая ссылка
- это стриковая (тип string) переменная, хранящая имя другой переменной.
Чтобы получить значение исходной переменной через символическую ссылку, нужно просто поставить перед символической ссылкой еще один знак $
Пример:
$x="большой";
$y="маленький";
$size="x"; //создаем символическую ссылку на переменную $x
echo $$size; //выведется значение переменной $x, т.е. слово "большой"
$$size="средний" //а так мы присваиваем переменной $x новое значение "средний"

Объектные ссылки
<?php
class ExampleName{} //объявляем новый класс
$n1=new ExampleName{};
$n1->inlel=12; //присваиваем значение атрибуту класса
$n2=$n1;
$n2->intel=40;
echo "Intelligence1= {$n1->intel} , intelligence2= {$n2->intel}";
?>
В PHP5 будут выведены два разных значения, т.к. хотя обе переменные и ссылаются на один объект, но это каждый раз новый объект одного класса.

Действия с переменными в PHP

= - присвоение значения. Оператор присваивания следует отличать от оператора сравнения ==
isset($a) - проверка существования переменной $a. Результат - boolean.
unset($a) - уничтожение (деинициализация) переменной $a. Целесообразно применять для удаления элемента массива.
is_integer($a) - true, если переменная $a типа integer
is_double($a) - true, если переменная $a типа double
is_string($a) - true, если переменная $a типа string
is_numeric($a) - true, если переменная $a либо число, либо строковое представление числа. Полезно использовать, т.к. тогда с числами, переданными через строковую переменную можно выполнять арифметические действия.
is_bool($a) - true, если переменная $a типа boolean, т.е. имеет значение true или false
is_scalar($a) - true, если переменная $a скалярная (все перечисленные выше типы переменных - скалярные)
is_array($a) - true, если переменная $a является массивом
is_null($a) - true, если переменная $a типа NULL
is_object($a) - true, если переменная $a содержит ссылку на объект
gettype($a) - возвращает строковое значение типа переменной $a: integer, double, string, array, boolean, null, object или unknown type для неродных PHP переменных, привнесенных например модулями-расширениями для PHP.
settype($a, $type) - преобразование типа переменной $a в переменную типа $type (например строка->число). settype возвращает значение true, если преобразование удалось и false если не удалось.

воскресенье, 2 ноября 2008 г.

Типы переменных в PHP5

integer - целое 32-битное число. 232 (-2 147 483 648 ... 2 147 483 647)
double - вещественное число с плавающей точкой. 264
string - строка текста. Может быть от пустой до какой угодно.
array - ассоциированный массив $a=array("0"=>"ноль", ..., "first_name"=>"petya", "last_name"=>"vasechkin", ...); адресация элемента массива имеет синтаксис $a["last_name"]
resource - ресурс. Это может быть например дескриптор файла.
boolean - false/true или 0/1(и все числа, отличные от нуля)
NULL(или null) - это особый тип переменной.

Комментарии в PHP

Однострочные комментарии в помечаются символом // в начале строки.Многострочные комментарии , как и в HTML размечаютсся следующим образом
/* - это начало комментариятело комментария
*/ - это окончание комментария
Однако пользоваться многострочными комментариями на кириллице не рекомендуется, т.к. возможны синтаксические конфликты.

Открывающие/закрывающие теги в PHP

В качестве кратких аналогов тегоов <?php ... ?> используются также <? ... ?> или <% ... %> . По умолчанию в php.ini включена опция short open tag , позволюющая использовать теги <? ... ?>, а опция asp tags , позволяющая использовать <% ... %> , по умолчанию выключена.Если в скрипте используются также XML-теги <?xml ... ?>, то необходимо, чтобы опция short open tag была выключена (Off), иначе <?xml будет трактоваться как начало PHP-кода и соответственно будет выдаваться синтаксическая ошибка.

Отладка PHP-кода. Интерактивный отладчик DBG

Для облегчения работы по отладке PHP-скриптов можно пользоваться интерактивным Open Source отладчиком DBG, который является составной частью PHPEd платной (и весьма платной!) NuSphere IDE. Скачать можно по адресам http://dd.cron.ru/dbg/downloads.php и http://sourceforge.net/projects/dbg2/ версии как для Windows так и для Linux.

Локальный Proxy

Для отслеживания HTTP-запросов и ответов хорошо использовать локальный Proxy, контролируя по мере необходимости его логи. Proximitron.

суббота, 1 ноября 2008 г.

PHP в виде модуля Apache

Удобно пользоваться PHP, подключенным к Apache в виде модуля.
В этом случае нам также предстоит произвести настройки httpd.conf
Будем использовать тот же метод Include.
В отдельном файле, назовем его php5_mod.conf, прописываем
LoadModule php5_module "/usr/local/php5/php5apache2_2.dll"
AddHandler application/x-httpd-php php
А в httpd.conf дописываем строку
Include conf/php5_mod.conf
Строка Include conf/php5_cgi.conf в этом случае удаляется или комментируется знаком #

Apache и PHP: PHP как внешняя CGI-программа

С целью настройки нужно произвести изменения в файле настроек Apache httpd.conf
Удобнее будет вынести необходимые настройки
AddType application/x-httpd-php5 php5
ScriptAlias /_php5/ "/usr/local/php5/"
Action application/x-httpd-php5 "/_php5/php-cgi.exe"
в отдельный файл с названием например php5_cgi.conf, а потом включить (include) эти настройки в httpd.conf единственной директивой
Include conf/php5_cgi.conf

Для того, чтобы при запуске PHP в виде внешней CGI-программы использовались наши настройки из файла php.ini, нужно изменить переменную окружения PHPRC. Это делается посредством пакетного bat-файла коммандой
set PHPRC=\usr\local\php5
тогда нам придется и сервер впредь запускать из того же файла. Назовем этот файл например start.bat
@echo off
title Run Apache in Console
IF NOT EXIST X: subst X: ..
X:
set PHPRC=X:\usr\local\php5
set PATH=%PHPRC%,%PATH%
cd \usr\local\apache\bin
httpd.exe -w -f ".\conf\httpd.conf"

Настройки php.ini

error_reporting = E_ALL
include_path = ".;\usr\local\php5\PEAR"
SMTP = localhost.or.mail.provider
session.save_path = "/tmp" + создать X:\tmp
Конфигурация расширений (extensions) PHP
extension_dir = "./ext"
extension=php_gd2.dll - работа с изображениями
extension=php_mysql.dll - работа с базами данных MySQL
extension=php_xsl.dll - XSLT-процессор