Форум о заработке

Здравствуйте, гость ( Вход | Регистрация )

Внимание: Внимание!!! Начисление оплаты за сообщения на нашем форуме прекращается с 00:00 по московскому времени 06.07.15 г. Всем у кого есть начисленные средства на оплату за сообщения просьба заказать до 00:00 по московскому времени 12.07.15 г. Уважаемые форумчане!!! Форум не закрывается однако оплата за сообщения прекращается,но вы вправе и никто вам не запрещает оставлять свои сообщения и делиться интересными мыслями на нашем форуме на безвозмездной основе.
 
Тема закрытаНачать новую тему
> Синтаксис PHP
SLITE
сообщение 27.11.2008, 18:04
Сообщение #1


Прохожий


Группа: Пользователи
Сообщений: 62
Спасибо сказали: 3
Регистрация: 27.11.2008
Пользователь №: 1980

Заработано: 0.561$
Выплачено: 0$
Штрафы: 0.3$
К выплате: 0.261$





Репутация:   0  


Общие понятия

Язык PHP специально предназначен для веб-программирования. PHP сочетает достоинства языков C и Perl и при этом весьма прост в изучении и обладает значительными преимуществами перед традиционными языками программирования.

Синтаксис PHP очень напоминает синтаксис языка C и во многом заимствован из таких языков как Java и Perl.

Программист С очень быстро освоит язык PHP и сможет использовать его с максимальной эффективностью.
В принципе, в PHP есть практически все операторы и функции, имеющиеся в стандартном GNU С (или их аналоги), например есть циклы (while, for), операторы выбора (if, switch), функции работы с файловой системой и процессами (fopen, *dir, stat, unlink, popen, exec), функции ввода-вывода (fgets,fputs,printf) и множество других...

Цель данного раздела - краткое ознакомление с основами синтаксиса языка PHP. Более подробную информацию по конкретным составляющим синтаксиса PHP вы найдете в соответствующих разделах.

PHP и HTML

Cинтаксис любого языка программирования гораздо легче "почувствовать" на примерах, нежели используя какие-то диаграммы и схемы. Поэтому приведем пример простейшего скрипта на PHP:
Код
<html>
     <head>
         <title>Пример</title>
     </head>
     <body>

         <?
         echo "Привет, я - скрипт PHP!";
         ?>

     </body>
</html>

Вы уже наверняка заметили, что это классический скрипт, с которого начинают изучение языка программирования.

Обратите внимание, что HTML-код корректно обрабатывается интерпретатором PHP.

Начало сценария вас может озадачить: разве это сценарий? Откуда HTML-тэги <html> и <body>? Вот тут-то и кроется главная особенность (кстати, чрезвычайно удобная) языка PHP: PHP-скрипт может вообще не отличаться от обычного HTML-документа.

Идем дальше. Вы, наверное, догадались, что сам код сценария начинается после открывающего тэга <? и заканчивается закрывающим ?>. Итак, между этими двумя тэгами текст интерпретируется как программа, и в HTML-документ не попадает. Если же программе нужно что-то вывести, она должна воспользоваться оператором echo.

Итак, PHP устроен так, что любой текст, который расположен вне программных блоков, ограниченных <? и ?>, выводится в браузер непосредственно. В этом и заключается главная особенность PHP, в отличие от Perl и C, где вывод осуществляется только с помощью стандартных операторов.

Разделение инструкций


Инструкции разделяются также как и в C или Perl - каждое выражение заканчивается точкой с запятой.

Закрывающий тег (?>) также подразумевает конец инструкции, поэтому два следующих фрагмента кода эквиваленты:
Код
<?php
     echo "Это тест";
?>

<?php echo "Это тест" ?>

Комментарии в PHP скриптах

Написание практически любого скрипта не обходится без комментариев.

PHP поддерживает комметарии в стиле 'C', 'C++' и оболочки Unix. Например:
Код
<?php
     echo "Это тест"; // Это однострочный комментарий в стиле c++
     /* Это многострочный комментарий
        еще одна строка комментария */
     echo "Это еще один тест";
     echo "Последний тест"; # Это комментарий в стиле оболочки Unix
?>

Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идет перед ними.
Код
<h1>Это <?php # echo "простой";?> пример.</h1>
<p>Заголовок вверху выведет 'Это пример'.

Будьте внимательны, следите за отсутствием вложенных 'C'-комментариев, они могут появиться во время комментирования больших блоков:
Код
<?php
  /*
     echo "Это тест"; /* Этот комментарий вызовет проблему */
  */
?>

Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идет перед ними. Это означает, что HTML-код после // ?> БУДЕТ напечатан: ?> выводит из режима PHP и возвращает в режим HTML, но // не позволяет этого сделать.

Переменные в PHP

Имена переменных обозначаются знаком $. То же самое "Привет, я - скрипт PHP! " можно получить следующим образом:
Код
<?php
$message = "Привет, я - скрипт PHP!";
echo $message;
?>

Типы данных в PHP

PHP поддерживает восемь простых типов данных:

Четыре скалярных типа:

- boolean (двоичные данные)
- integer (целые числа)
- float (числа с плавающей точкой или 'double')
- string (строки)

Два смешанных типа:

- array (массивы)
- object (объекты)

И два специальных типа:

resource (ресурсы)
NULL ("пустые")

Существуют также несколько псевдотипов:

- mixed (смешанные)
- number (числа)
- callback (обратного вызова)
Выражения в PHP

Основными формами выражений являются константы и переменные. Например, если вы записываете "$a = 100", вы присваиваете '100' переменной $a:
Код
$a = 100;

В приведенном примере $a - это переменная, = - это оператор присваивания, а 100 - это и есть выражения. Его значение 100.

Выражением может быть и переменная, если ей сопоставлено определенное значение:
Код
$x = 7;
$y = $x;

В первой строке рассмотренного примера выражением является константа 7, а во второй строке - переменная $x, т.к. ранее ей было присвоено значение 7. $y = $x также является выражением.

Операторы PHP

Оператором называется нечто, состоящее из одного или более значений (выражений, если говорить на жаргоне программирования), которое можно вычислить как новое значение (таким образом, вся конструкция может рассматриваться как выражение).

Примеры операторов PHP:

Операторы присвоения:
Код
<?php

$a = ($b = 4) + 5; // результат: $a установлена значением 9, переменной $b присвоено 4.

?>

Комбинированные операторы:
Код
<?php

$a = 3;
$a += 5; // устанавливает $a значением 8, аналогично записи: $a = $a + 5;
$b = "Hello ";
$b .= "There!"; // устанавливает $b строкой "Hello There!",  как и $b = $b . "There!";

?>

Строковые операторы:
Код
<?php
$a = "Hello ";
$b = $a . "World!"; // $b содержит строку "Hello World!"

$a = "Hello ";
$a .= "World!";     // $a содержит строку "Hello World!"
?>

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

Основными конструкциями языка PHP являются:

1. Условные операторы (if, else);
2. Циклы (while, do-while, for, foreach, break, continue);
3. Конструкции выбора (switch);
4. Конструкции объявления (declare);
5. Конструкции возврата значений (return);
6. Конструкции включений (require, include).

Примеры конструкций языка PHP:
Код
<?php
if ($a > $b) echo "значение a больше, чем b";
?>

Приведенный пример наглядно показывает использование конструкции if совместно с оператором сравнения ($a > $b).

В следующем примере если переменная $a не равна нулю, будет выведена строка "значение a истинно (true), то есть показано взаимодействие условного оператора (конструкции) if с логическим оператором:
Код
<?php
if ($a) echo "значение a истинно (true) ";
?>

А вот пример цикла while:
Код
<?php
$x=0;
while ($x++<10) echo $x;
// Выводит 12345678910
?>

Пользовательские функции в PHP

В любом языке программирования существуют подпрограммы. В языке C они называются функциями, в ассемблере - подпрограммами, а в Pascal существуют два вида подпрограмм: процедуры и функции.

В PHP такими подпрограммами являются пользовательские функции.

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

Приведем пример пользовательской функции на PHP:
Код
<?php

function funct() {
$a = 100;
echo "<h4>$a</h4>";
}
funct();

?>

Сценарий выводит 100.
Пользовательским функциям в PHP можно передавать аргументы и получать возвращаемые функциями значения.
Встроенные (стандартные) функции PHP

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

PHP имеет достаточно хорошую поддержку объектно-ориентированного программирования (ООП).

В PHP можно создавать классы различных уровней, объекты и достаточно гибко ими оперировать.

Вот пример PHP класса и его использования:
Код
<?php
// Создаем новый класс Coor:
class Coor {
// данные (свойства):
var $name;

// методы:
function Getname() {
echo "<h3>John</h3>";
}

}

// Создаем объект класса Coor:
$object = new Coor;
// Получаем доступ к членам класса:
$object->name = "Alex";
echo $object->name;
// Выводит 'Alex'
// А теперь получим доступ к методу класса (фактически, к функции внутри класса):
$object->Getname();
// Выводит 'John' крупными буквами
?>

Вот так, кратко описав синтаксис, можно охарактеризовать замечательный язык PHP.
Перейти в начало страницы
 
+Цитировать в форуму быстрого ответаЦитировать сообщение
SLITE
сообщение 27.11.2008, 18:05
Сообщение #2


Прохожий


Группа: Пользователи
Сообщений: 62
Спасибо сказали: 3
Регистрация: 27.11.2008
Пользователь №: 1980

Заработано: 0.561$
Выплачено: 0$
Штрафы: 0.3$
К выплате: 0.261$





Репутация:   0  


Делаем форум
Привет. В этот раз я расскажу про основы ПХП, классного языка для создания динамических html-страничек (да и не только станичек). Язык относительно простой, так что имея некоторый опыт программинга (наличие которого предполается), ты его легко освоишь. Я в нем лишь чайник (пока), но единственный способ научиться программировать - писать программы. Например, написать форум Хоррифика. Я не люблю разбирать все по разделам, поэтому буду рассказывать по ходу дела.

Итак, окно форума состоит из трех фреймов. Я вынес их в index.html:

<HTML>
<HEAD>
<TITLE>Programmers&Administrators boards</TITLE>
</HEAD>
<FRAMESET ROWS="100%" COLS="210,*" border=0>
<FRAME NAME="menu" SRC="show.php?action=menu" NORESIZE FRAMEBORDER=1
SCROLLING="YES" frameborder="NO" border=0 MARGINHEIGHT=5
MARGINWIDTH=5 framespacing=0>
<FRAMESET ROWS="50%,50%" border=1>
<FRAME NAME="headers" SRC="show.php?action=headers" SCROLLING="YES"
FRAMEBORDER=1 frameborder="YES" border=1 MARGINHEIGHT=5
MARGINWIDTH=5 framespacing=0>
<FRAME NAME="messages" SRC="show.php?action=messages" SCROLLING="YES"
FRAMEBORDER=1 frameborder="YES" border=1 MARGINHEIGHT=5
MARGINWIDTH=5 framespacing=0>
</FRAMESET>
</FRAMESET>
<NOFRAMES>
<BODY bgcolor="#FFFFFF">
<P>
Sorry, you must use a frames-capable browser (such as Microsoft Internet Explorer 3.0
or higher or Netscape Navigator 2.0 or higher).
</BODY>
</NOFRAMES>
</HTML>

Хорошо видны ссылки на файл show.php. Дабы в него можно было передать какие-то параметры, используется ? (знак вопроса), после которого идут параметры в формате переменная=значение&переменная=значение... Этот метод передачи параметров называется GET. Теперь будем заполнять первый фрейм. Для этого нам надо откуда-то взять названия разделов и все это вывести. Создаем файл show.php:

<?php

?>

Такой импровизированный тэг даст понять веб-серверу, что надо отдать содержимое этого тэга на съедение PHP, который все это переварит и выс.. выдаст контент, то есть станичку. (Кстати, его можно вставлять и посреди страницы, и не один раз). Теперь внутри этого "тега" пишем:

$disp='<html>';

$disp.='</html>';
echo $disp;

Знаком доллара в ПХП обозначаются переменные. Их не надо заранее объявлять, тип определяется автоматически. Операция присваивания обозначается знаком "равно". После оператора, как в любом нормальном языке, ставится точка с запятой. А что там за точка во второй строке? А это сокращенная запись выражений в стиле Си:
$Dlinnaya_peremennaya=$Dlinnaya_peremennaya+$Eshe_odna_super_dlinnaya_peremen
эквивалентна $Super_dlinnaya_peremennaya += $Eshe_odna_super_dlinnaya_peremennaya

Короче, если есть строка $a = $a + $b, то убираем вторую $a, и _перед_ "равно" ставим знак операции (точка является операцией соединения строк).

Теперь, если второй строчкой написать $disp.='Hello, world!';, то веб-сервер выдаст то, что всегда первым делом предлагают вывести при изучении нового языка. А что такое echo? Это операция вывода. В данном случае она отдаст веб-серверу содержимое $disp, в которую мы пихаем содержимое страницы.

Ну хорошо, где/как будем данные доставать? Из базы данных. Не важно какой, ПХП поддерживает туеву хучу СУБД. Я решил воспользоваться самой распространенной среди веб-строителей - MySQL, хоть я и сторонник InterBase (научился у DJB фразе "Not reliable!"). Пусть у нас есть база "forum", в ней таблицы razd - названия разделов, и menu - пункты меню. Как их создать, см. ЗЫ. Коннектимся к СУБД:
$dbh=mysql_connect('адрес хоста','логин','пароль') or die('Не могу к базе приконнектиться');
mysql_select_db('forum',$dbh) or die('Не могу базу открыть');
mysql_query('SET OPTION CHARACTER SET cp1251_win');

В переменную $dbh заносится какая-то хрень, идентифицирующая соединение с СУБД. Функция die() заставит ПХП завершить работу и выдать указанную фразу в случае ошибки. mysql_select_db выбирает базу в данном соединении, а третья строка говорит MySQL, что мы типа русские и хотим использовать кодировку win1251.

Так, хорошо, к базе приконнектились, а страничка? Как мы узнаем, что именно генерить-то надо? Для этого мы передали параметр action, который, если включена опция register_globals, будет обычной переменной в нашем скрипте. Для маньяков, у которых register_globals отключена, есть массив $_GET ($HTTP_GET_VARS в старых версиях), из которого можно выдернуть переменную следующим образом: $_GET['action'] (если используется метод передачи данных POST, то соответственно $_POST ($HTTP_POST_VARS)).

Ну и как разбирать-то будем? Есть оператор switch, опять же, в стиле Си:

switch($action) {

case "menu":
...
break;

case "headers":
...
break;
}

Такой вот эквивалент нашему дельфяжному case. Смысл такой: $action сравнивается со значением после слова case, и, если совпадает, то выполняется код до слова break. Фигурные скобки {} эквивалентны begin end. Таким образом, если юзер запросит левый фрейм, то есть установит $action='menu', то выполнится одно, если $action='headers', то другое, а если кулхацкер Вася Пупкин задаст $action='hrehoten', то он получит пустую станицу, так как ни один обработчик не будет вызван.

Ну, давайте будем генерить меню:
$disp.='<body bgcolor="#000000" >'; - установим черный цвет фона
$res=mysql_query('select name,id from razd order by orderid,id');- запросим названия разделов. В $res записывается результат запроса.

while ($row=mysql_fetch_row($res)) {
..
}

О, что-то новенькое. Оператор while особо ничем не отличается от Делфи, а вот проверка условия опять в стиле доставшего всех Си (но удобно, блин!). Замутка такая: выражение $a=$b (a присвоить значение cool.gif само имеет значение $b, то есть mysql_fetch_row($res) читает очередную запись из $res, это записывается в $row, да еще и while-у передается.(то есть можно написать $q=$w=$e=$r :-)). А когда mysql_fetch_row() даст NULL, то while наконец-то успокоится, так как это не что иное как false.

// это комментарий
$disp.='<table width="100%" CELLPADDING="2" CELLSPACING="0"'.
'BORDER="1" BGCOLOR=#555555 BORDERCOLOR=#999999>'.
'<th BGCOLOR="#999999"><font color="white"><b>'.$row[0].'</b></font><th>';
// создали таблицу на страничке
$res2=mysql_query('select name,id,hint from menu where groupid='.$row[1].' order by orderid,id');
// запросили пункты меню из данного раздела (groupid в menu = id в razd)
while ($row2=mysql_fetch_row($res2)) {
$disp.='<tr><td><a href="show.php?action=headers&menuid='.$row2[1].
'" target="headers"><font color="white"><ABBR title="'.$row2[2].'">'.
$row2[0].'</ABBR></font></a></tr>';
// создаем строчки таблицы
}

Здесь мы создаем линки, кликнув по которым в правый верхний фрейм (target="headers") загрузится страница show.php?action=headers&menuid=<номер меню>Я еще попытался добавить простейшие хинты к ним, но MS Експлопер их почему-то игнорирует (у меня-то Опера, там все круто)

Функция mysql_fetch_row() выдает массив с пронумерованными элементами (то есть обычный), в котором содержится очередная запись из набора данных. Однако некоторые любят mysql_fetch_assoc(), которая выдает массив с именованными полями, например: $row['name']. Есть также универсальная функция mysql_fetch_array(), которой второй параметр указывает что надо вернуть (более подробную информацию ищите в мануале).

Ну, менюшки вроде грузятся. Переходим ко второму фрейму:

case "headers":
if (!isset($menuid)) break;

Ага, всем знакомый оператор условного перехода (во как if по-умному называется :-)). Но оригинальное отличие: нет слова then (ладно хоть else оставили), то есть сразу идет оператор. Если захочешь вставить несколько операторов, то не забудь про эквивалент begin .. end;, то бишь фигурные скобки. Еще условие обязательно надо заключать в скобки, иначе ПХП будет ругаться. Функция isset() чем-то похожа на Assigned() в Delphi: она возвращает TRUE, если переменная существует, и FALSE, если наоборот. Есть еще почти такая же функция empty(), но она возвращает FALSE, если переменная равна нулю или NULL. А наличие $menuid для нас критично, тк мы должны выбрать мессаги из определенного раздела.

"Эй, чувак, неувязочка у тебя, - скажет читатель, - при наличии $menuid условие не выполнится и наоборот! Да еще восклицательный знак какой-то.."

Не, все нормально: восклицательный знак эквивалентен слову not в паскале, то есть он true меняет false, и наоборот.

Мессаги надо как-то группировать, чтобы знать, кто кому отвечает и соответственно делать отступы. Для них я сделал таблицу messages:

id - primary key
menuid - id темы, в которую постят мессаги
groupid - номер группы мессаг
lev - отступ
head - заголовок
nick - имя юзера
link - мыло
txt - текст мессаги
instime - время вставки

В приведенном выше куске исходника мы передаем menuid, по которому и идет выборка.

Полный текст обработчика:

//Если юзер запросил заголоки мессаг
case "headers":
// $menuid нам необходим
if (!isset($menuid)) break;
// формируем линк `создание вопроса`
$disp.='<body><a href="show.php?action=insert&menuid='.$menuid.
'" target="messages">Добавить вопрос</a><hr><table width="100%"
CELLPADDING="0" CELLSPACING="0" BORDER="0" '.
// пошла таблица с заголовками таблицы заголовков :-)
'BGCOLOR="#FFFFFF" BORDERCOLOR="#FFFFFF"><tr><td align="left" width="60%"><font'.
' face="Verdana" size="-2"<Тема</font></td><td width="20%" align="right"><font'.
' face="Verdana" size="-2">Имя</font></td><td width="20%" align="right"><font'.
' face="Verdana" size="-2">Дата [время]</font></td></tr></table>';
$disp.='<table width="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0" BGCOLOR="#FFFFFF"
BORDERCOLOR="#FFFFFF">';
//запрашиваем заголовки мессаг.
$res=mysql_query('select head,id,nick,link,instime,lev from messages where menuid='.$menuid.'
order by groupid desc,lev asc , id asc');
while ($row=mysql_fetch_row($res)) {
$disp.='<tr><td align="left" width="58%" class="myclass2">';
for ($i=0;$i<$row[5];$i++) {
$disp.='&nbsp;&nbsp;';
};
$disp.='<a href="show.php?action=messages&id='.$row[1].'"
target="messages">'.$row[0].'</a></td>'.
'<td width="20%" align="right" class="myclass2">'. ((empty($row[3])) ? $row[2] :
'<a href="mailto:'.$row[3].'">'.$row[2].'</a>') .'</td>';
$disp.='<td width="22%" align="right" class="myclass2">'.$row[4].'</td></tr>';
}
$disp.='</table>';
break;

Так как номер группы постоянно увеличивается, то, чтобы сначала показать новые сообщения, сортируем по groupid по убыванию (order by groupid desc), по lev по возрастанию - чтобы сначала первый уровень показать, затем второй.., а по id - так, для верности (см. "//запрашиваем заголовки.."). Затем в цикле вставляем линки, а перед линком надо вставить пробелы (чтобы явно сказать браузеру, что мы хотим вставить пробел, используется такая шняга: &nbsp;). Для этого мы выбрали значение lev из таблицы. Тут появляется оператор цикла for, который, как вы, наверное, уже догадались, в стиле вездесущего Си: в скобках через точку с запятой указываются три вещи: инициализация переменной цикла, условие, операция приращения переменной цикла.

Здесь надо отметить операцию ++ - это аналог inc() в паскале, но более хитрый: если его поставить после переменной ($a++), то значение этого выражения будет равно переменной до увеличения на единицу, а если перед переменной (++$a), то все это будет равно переменной, увеличенной на единицу. В цикле, конечно, пофиг, где эти плюсы ставить, но потом..

Теперь формируем линк: мы должны передать action=messages, то есть надо показать саму мессагу, и что именно показать - id записи, так как оно уникально. target="messages" укажет, что эта хрень должна загрузиться в третий фрейм по имени messages.

Хорошо, линк есть, отображаем имя как линк на емайл. А что делать, если юзер не указал мыло? Естественно, не делать имя линком. Ладно, а где тогда ветвление? Ну, внимательные, наверно, обратили внимание на эту строку:

((empty($row[3])) ? $row[2] : '<a href="mailto:'.$row[3].'">'.$row[2].'</a>')

Здесь использован так называемый тернарный оператор: это такая "встраиваемая" версия if-а. Все очень просто: сначала условие, вопросительный знак, что подставляем, если условие истинно, затем двоеточие, и что подставляем, если условие ложно. Но приоритет этой операции очень низок, поэтому рекомендуется все это хозяйство помещать в скобки. Здесь вроде все.

Теперь самое простое: показать мессагу.

//юзер запросил мессагу
case "messages":
// без id мы никуда
if (!isset($id)) break;
$disp.='<body><a href="show.php?action=insert&id='.$id.'" target="messages">
Добавить ответ</a><hr>';
$row=mysql_fetch_row(mysql_query('select txt from messages where id='.$id));
$disp.=StripSlashes($row[0]);
break;

ID нам дано, делать нечего - выбрали, показали.. А про StripSlashes немного ниже скажу.

Теперь рекомендую вручную забить несколько мессаг и посмотреть, как это работает, и работает ли вообще :-). Если не работает, то сверяйтесь с исходником.

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

Что небходимо для вставки мессаги? Имя юзера, его емайл, заголовок и текст сообщения, ID темы, ID группы, если это ответ, а также lev, то есть отступ. Давайте так: если это вопрос, то передаем ID темы, а если это ответ, то передаем ID мессаги, на которую отвечаем.


case "insert":
if (isset($id)) {
$row=mysql_fetch_row(mysql_query('select head,menuid,groupid,lev from messages where id='.$id)) or die('Error in insert');

$subj=$row[0];
$menuid=$row[1];
$groupid=$row[2];
$lev=$row[3]+1;
} else {
if (!isset($menuid)) break;
$lev=0;
unset($groupid);
};

Сначала проверяем наличие ID - если есть, то запрашиваем данные этой мессаги, и явно устанавливаем их.

Если нам передали menuid, то явно устанавливаем lev и уничтожаем groupid с помощью процедуры unset().

if (empty($head) or empty($nick) or empty($text)) {
...

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

...
} else {
//вставка мессаги
if (empty($groupid)) {
$row=mysql_fetch_row(mysql_query('select max(groupid)+1 from messages where menuid='.$menuid));
if (empty($row[0])) { $groupid=1; } else { $groupid=$row[0]; };
}
$sql='select count(*) from messages where menuid='.$menuid. ' and groupid='.$groupid.
' and txt="'.AddSlashes(HTMLSpecialChars($text)).'"';
$row=mysql_fetch_row(mysql_query($sql));
if ($row[0]>0) break;
$sql='insert into messages (menuid,groupid,lev,head,nick,link,txt,instime)'.
'values ('.$menuid. ',' .$groupid. ',' .$lev. ',"' .AddSlashes(HTMLSpecialChars($head)).
'","' .AddSlashes(HTMLSpecialChars($nick)). '","' .AddSlashes(HTMLSpecialChars($email)).
'","' .AddSlashes(HTMLSpecialChars($text)). '", \'now\')';
mysql_query($sql);
Header('Location: send.html');
};

Сначала проверяем наличие $groupid - если отсутствует, то выбираем максимальный, вернее, на единицу больше. Про этот запрос нужно громко кричать "Not reliable!!", потому что если два юзера одновременно выполнят такой запрос и получат одинаковые результаты, то оба вопроса окажутся в одной группе. Но вероятность этого достаточно низка, поэтому, как говорят физики, этим можно пренебречь. Затем смотрим, а вдруг уже есть такая мессага? (ну любят люди F5 жать) Если есть, то выходим. Теперь формируем запрос вставки. Для того, чтобы нехорошие люди не вставляли html-тэги, в ПХП есть специальная функция HTMLSpecialChars(), которая преобразует все спецсимволы в корректные html-эквиваленты. А чтобы сам ПХП и MySQL корректно обработали всякие кавычки и прочее перед ними ставится слэш. И есть функция AddSlashes(), которая их расставляет. Обязательно используй эту функцию! Иначе кулхацкер Вася Пупкин может задать какой-нибудь параметр вот так:

"Vasya; select password from table_with_passwords ". И СУБД вместо ваших данных запросит не то, и в худшем случае Вася получит страницу с паролями. Однако, при выводе данных эти слеши нам нафиг не нужны, поэтому для их убирания используется функция StripSlashes. Процедура Header() добавляет http-заголовки, в данном случае предлагает броузеру пойти на.. страницу send.html, которая скажет юзеру, что сообщение принято. Но она работает, если ты еще ничего не вывел (именно поэтому я использую промежуточную переменную)

Ну, вроде все. Счастливого вам форумостроения!

ЗЫ:

Мини-FAQ

Вот открыл я index.html, а в окошках ПХП-шные исходники :-(
А ПХП у тебя на веб-сервере установлен? Или ты решил, что этот язык интегрирован в твой Интернет Експлопер v.847927645+E18? Если все установлено, то попробуй сменить расширение с php на php3 или 4.
А где взять ПХП?
http://php.net
Как мне поставить ПХП на <что-нибудь>?
Я его ставил только на Пингвинуксе под Апач, поэтому не стал рассказывать..
У меня что-то не так работает. Может версия не та?
У меня стоит PHP v. 4.2.2
Я прочитал, но не все (ничего) понял. Что я должен знать?
Основы програмирования, SQL и HTML
А может я так отстойно объясняю..
Кто такой DJB и как переводится "Not reliable"?
DJB - профессор Dan J. Берштейн (из какого-то инстика из Америки), который пишет очень надежные в плане безопасности проги, а "Not reliable" - это его любимая фраза, которая переводится как "Не надежно"
Где включать register_globals?
См. php.ini или мануал
Строчки исходника здесь и в самом исходнике отличаются
Я постоянно дорабатывал исходник и не всегда вспоминал про статью.
Ты обещал про создание таблиц рассказать
Да, было дело.

Создание razd:
CREATE TABLE razd (
id int(10) unsigned NOT NULL auto_increment,
name varchar(20) NOT NULL, - название раздела
orderid int(11) NOT NULL default 0, - порядок сортировки
PRIMARY KEY (id));

Создание menu:
CREATE TABLE menu (
id int(10) unsigned NOT NULL auto_increment,
name varchar(30) NOT NULL, - название темы
orderid int(11) default 0, - порядок сортировки
groupid int(11) NOT NULL, - ID раздела
hint varchar(50) default NULL, - подсказка
PRIMARY KEY (id)

Создание messages:
CREATE TABLE messages (
id int(10) unsigned NOT NULL auto_increment,
txt text NOT NULL, - текст сообщения
groupid int(11) NOT NULL, - ID группы сообщений
menuid int(11) NOT NULL, - ID темы
head varchar(100) NOT NULL, - заголовок
nick varchar(30) NOT NULL, - имя юзера
link varchar(30), - мыло юзера
instime datetime NOT NULL, - дата/время вставки
lev int(11) default 0, - количесто отступаемых пробелов
PRIMARY KEY (id)
Перейти в начало страницы
 
+Цитировать в форуму быстрого ответаЦитировать сообщение
SLITE
сообщение 27.11.2008, 18:07
Сообщение #3


Прохожий


Группа: Пользователи
Сообщений: 62
Спасибо сказали: 3
Регистрация: 27.11.2008
Пользователь №: 1980

Заработано: 0.561$
Выплачено: 0$
Штрафы: 0.3$
К выплате: 0.261$





Репутация:   0  


PHP и Upload (Загрузка файлов на сервер)
Multipart-формы

Загрузка фаилов на сервер осуществляется пользователями сети интернет довольно часто, а именно:

* Веб-итерфейсы почтовых сервисов, которые позволяют добавалять к письму приложение (attach), а для этого нужно сначала загрузить файл на сервер, и только после этого его можно добавлять к письму;
* Интерактивные фотогалереи и фотоальбомы, которые не могут существовать без механизма загрузки файлов на сервер;
* Порталы бесплатного програмного обеспечения, которые используют для обмена файлами различных программ, и.т.д.

Загрузка файла на сервер осуществляется с помощью multipart-формы, в которой есть поле загрузки файла. В качестве параметра enctype указывается значение multipart/form-data:

Код
<form action=upload.php method=post enctype=multipart/form-data>
<input type=file name=uploadfile>
<input type=submit value=Загрузить></form>


Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер):

Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля:

* Поле выбора файла для закачки <INPUT type=File>;
* Поле указания имени файла, которое он должен будет иметь на сервере <INPUT type=text>.

Обработка multipart-форм

Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini, чтобы разрешить загрузку файлов на сервер.

Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:

* file_uploads=On - разрешает загрузку файлов на сервер по протоколу HTTP;
* upoad_tmp_dir=/tmp - устанавливает каталог для временного хранения загруженных файлов;
* upload_max_filesize=2M - устанавливает максимальный объем загружаемых файлов.

Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис:

service httpd restart

Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir, имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES. Этот массив содержит информацию о загруженном файле.

Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on, дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off.

Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым.

* $_FILES['uploadfile']['name'] - имя файла до его отправки на сервер, например, pict.gif;
* $_FILES['uploadfile']['size'] - размер принятого файла в байтах;
* $_FILES['uploadfile']['type'] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
* $_FILES['uploadfile']['tmp_name'] (так мы назвали поле загрузки файла) - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;
* $_FILES['uploadfile']['error'] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0. С соответствующими кодами ошибок вы можете ознакомиться здесь

После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:

Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES['uploadfile']['name']. В этом случае скрипт должен сразу скопировать файл с именем $_FILES['uploadfile']['tmp_name'] в какой-нибудь каталог (необходимы права на запись в этот каталог).

Копирование файла производится функцией copy():

Используйте только функцию копирования copy(), а не перемещения, поскольку:

* Временный файл будет удален фвтоматически;
* Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.

Предположим, нам нужно загрузить файл в каталог uploads, который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot).

// На всякий случай создадим каталог. Если он уже создан,
// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:

@mkdir("uploads", 0777);

// Копируем файл из /tmp в uploads
// Имя файла будет таким же, как и до отправки на сервер:

copy($_FILES['uploadfile']['tmp_name'],"uploads/".basename($_FILES['uploadfile']['name']));

В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads. Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root, создайте каталог uploads и измените его владельца и права доступа следующим образом:

// Создаем каталог uploads

mkdir uploads

// Устанавливаем имя владельца apache и его группу - тоже apache:

chown apache:apache uploads

// Разрешение записи всем (777) + установка закрепляющего бита (1):

chmod 1777 uploads

Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads - указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса.

Вот теперь можно загружать файлы на сервер.

Пишем PHP скрипт загрузки файлов на сервер

Код
<?php

// Каталог, в который мы будем принимать файл:
$uploaddir = './files/';
$uploadfile = $uploaddir.basename($_FILES['uploadfile']['name']);

// Копируем файл из каталога для временного хранения файлов:
if (copy($_FILES['uploadfile']['tmp_name'], $uploadfile))
{
echo "<h3>Файл успешно загружен на сервер</h3>";
}
else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }

// Выводим информацию о загруженном файле:
echo "<h3>Информация о загруженном на сервер файле: </h3>";
echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['uploadfile']['name']."</b></p>";
echo "<p><b>Mime-тип загруженного файла: ".$_FILES['uploadfile']['type']."</b></p>";
echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['uploadfile']['size']."</b></p>";
echo "<p><b>Временное имя файла: ".$_FILES['uploadfile']['tmp_name']."</b></p>";

?>


Загрузка на сервер нескольких файлов

Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input.

Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox:

Код
<form action="upload.php" method="post" enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Отправить файлы ">
</form>


В случае, если такая форма была отправлена, массивы $_FILES['userfile'], $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on, также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов.

Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin. В таком случае переменная $_FILES['userfile']['name'][0] будет иметь значение some.html, а переменная $_FILES['userfile']['name'][1] - значение file.bin. Аналогично, переменная $_FILES['userfile']['size'][0] будет содержать размер файла some.html и так далее.

Переменные $_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] и $_FILES['userfile']['type'][0] также будут инициализированы.

Заключение:

Как видите, организовать загрузку файлов на сервер не так сложно. Сложнее обеспечить необходимый уровень безопасности, так как загрузка файлов на сервер может использоваться злоумышленниками для атаки на сервер. О том, как обеспечить необходимый уровень безопасности, работая с Uploads, смотрите здесь.
Перейти в начало страницы
 
+Цитировать в форуму быстрого ответаЦитировать сообщение
cityvagrant
сообщение 13.1.2009, 21:51
Сообщение #4


Прохожий


Группа: Пользователи
Сообщений: 33
Спасибо сказали: 0
Регистрация: 19.11.2008
Пользователь №: 1901

Заработано: 0.33$
Выплачено: 0$
Штрафы: 0$
К выплате: 0.33$





Репутация:   0  


хорошая инфа для начинающих.спасибо за код форума))
Перейти в начало страницы
 
+Цитировать в форуму быстрого ответаЦитировать сообщение

Тема закрытаНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 21.9.2017, 23:36IPB Style
Яндекс.Метрика