308РНР-шаг за шагом, глава4

увлечения и хобби Богданова Игоря, для всех самоделкиных

Поиск
 
 

Результаты :
 

 


Rechercher Расширенный поиск

Талисман 2021 года

гороскоп
Гороскопы и Сонники
⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂Погода
!!!Погода в Рощино

влажность:

давление:

ветер:

⁂⁂
Похожие темы
Социальные закладки
Социальные закладки reddit      

Поместите адрес форума Песочница Увлечённых Самоделкиных в редакции Гарика на вашем сайте социальных закладок (social bookmarking)

Андрей Щедрин рулит...index.php (336×448)Ремонт ГБЦ на Дельте=и ЛеночкаРНР-шаг за шагом, глава4 0_fcbb3_a46da45a_XXXL
Посмотреть на Яндекс.ФоткахРНР-шаг за шагом, глава4 0_fcbbc_adb6f71f_M
Посмотреть на Яндекс.Фотках
Фото131.jpg 110kv Фото129.jpg
моя фея

и ДЖИН

фортуна

Вы не подключены. Войдите или зарегистрируйтесь

РНР-шаг за шагом, глава4

Перейти вниз  Сообщение [Страница 1 из 1]

1РНР-шаг за шагом, глава4 Empty РНР-шаг за шагом, глава4 Вт Окт 29 2013, 00:10

Gor

Gor
Admin


Функции работы с MySQL. Часть 3.
Другой подход к обработке результатов запроса предлагает функция MYSQL_FETCH_ARRAY. Эта функция возвращает ассоциативный массив, сформированный из очередной обрабатываемой строки. Первый параметр, как обычно, указатель на ресурс результатов выборки, второй - флаг (константа), отвечающий за содержимое возвращаемого функцией ассоциативного массива. Рассмотрим пример. Надо вывести список книг из нашей таблицы books вместе с именами авторов.

//для формирования SELECT-а

$sel_fields=array(\'author\' => \'Автор\', \'namebook\' => \'Название книги\');

$link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));

//выбрали БД

$db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));

//переменная $type принимает значение одной из следующих

//констант: MYSQL_ASSOC, MYSQL_NUM, and MYSQL_BOTH

$type=MYSQL_ASSOC;

reset($sel_fields);    //внутренний указатель массива на первый элемент

//работает в версиях PHP3 и PHP4

while(list($k,$v)=each($sel_fields)) {//сформируем строку для SELECT-а

     $sel_str[]=" $k as \'$v\'";

}

//закомментированная часть работает только в PHP4

//это альтернативное решение для цикла по массиву

//установка указателя на первый элемент для foreach-цикла не требуется

//foreach($sel_fields as $k=>$v) {

//    $sel_str[]=" $k as \'$v\'";

//}

$sel_str=implode(\',\',$sel_str);    //сделать строку из массива, используя разделитель

//на выходе имеем строку $sel_str = "author as \'Автор\', namebook as \'Название книги\'"

$result=mysql_query("SELECT ".$sel_str." FROM ".$table, $link) or die(mysql_errno($link).mysql_error($link));

//пройдемся по результату выборки

while($data=mysql_fetch_array($result,$type)) {

    while(list($k,$v)=each($data)) {    //версия для PHP 3,4

         echo "$k => $v
";

    }

    //в комментариях альтернатива while-циклу (только для PHP4)

      //foreach($data as $k=>$v) {

      //echo "$k => $v
";

      //}

}


В зависимости от значения второго параметра функции MYSQL_FETCH_ARRAY мы получим (для нашего примера) либо ассоциативный массив со значениями вида ($type = MYSQL_ASSOC)

Автор => Р. Яргер и др.

Название книги => MySQL и mSQL. Базы данных для небольших предприятий и Интернета

Автор => Ларри УОЛЛ

Название книги => Программирование на Perl


либо ($type = MYSQL_NUM)

0 => Р. Яргер и др.

1 => MySQL и mSQL. Базы данных для небольших предприятий и Интернета

0 => Ларри УОЛЛ

1 => Программирование на Perl


(здесь имеем ассоциативный массив, в котором ключ - номер поля в затребованной последовательности полей таблицы в select-е, значение - выбранное значение для поля; нумерация полей начинается с нуля) либо для значения MYSQL_BOTH получаем "винегрет" из первых двух вариантов:

0 => Р. Яргер и др.

Автор => Р. Яргер и др.

1 => MySQL и mSQL. Базы данных для небольших предприятий и Интернета

Название книги => MySQL и mSQL. Базы данных для небольших предприятий и Интернета.

0 => Ларри УОЛЛ

Автор => Ларри УОЛЛ

1 => Программирование на Perl

Название книги => Программирование на Perl


(Еще раз хочу обратить внимание. Имена полей здесь получились по-русски потому, что в select-е использована стандартная для SQL декларация алиасов:select field as \'некий текст\'.)
Еще один метод обработки выбранных данных - функция MYSQL_FETCH_OBJECT. Она по своей сути аналогична MYSQL_FETCH_ARRAY (как по параметрам, так и по значениям второго параметра - константам), с той лишь разницей, что возвращаемое значение - объект:

while($row=mysql_fetch_object($result,$type)) {

$data=get_object_vars($row);

//сформировали ассоциативный массив из переменных объекта

while(list($k,$v)=each($data)) {

echo "$k => $v
";

}

}


Здесь любопытна вторая строка. Дело в том, что, если бы мы не использовали строки с пробелами в алиасах select-а, то синтаксически все бы выглядело так:

//где-то выше было сказано $result=MYSQL_QUERY("select author, namebook from books");

while($row=mysql_fetch_object($result,$type)){ //остальные функции работы с классами в PHP

//мы рассмотрим в шаге, посвященном классам

echo "$row->author => $row->namebook
";

}


Все. Но как обратиться к переменной объекта с именем \'Название книги\', я так и не придумал.
Еще две fetch-функции (MYSQL_FETCH_FIELD() и MYSQL_FETCH_LENGTHS()) возвращают служебную информацию. Их мы рассмотрим в следующем шаге.
P.S. Остальные функции MySQL будут рассмотрены после того, как мы разберем минимальный набор строковых функций, функций работы с массивами и прочие полезности, т.к. без этого далее двигаться крайне затруднительно. Иными словами, двигаться в глубь PHP мы будем сразу по всему "функциональному фронту", постепенно расширяя и наращивая наши возможности.


Функции работы с MySQL. Часть 4.
Функции (MYSQL_FETCH_FIELD() и MYSQL_FETCH_LENGTHS) возвращают служебную информацию. MYSQL_FETCH_FIELD возвращает объект, содержащий характеристики полей, участвовавших в запросе. Например,

//где-то выше выполнен селект:

$res=mysql_db_query("books","select * from books");

//теперь, имея идентификатор QUERY-ресурса, получаем служебную информацию

$i=0;

while($i//получим количество полей в запросе

$field=mysql_fetch_field($res,$i)//и выводим по каждому полю информацию

foreach(($vars=get_object_vars($field)) as $k => $v) {

echo "$k => $v
";

}

$i++;

}


В результате получим что-то вроде этого:

name => id

table => books

def =>

max_length => 1

not_null => 1

primary_key => 1

multiple_key => 0

unique_key => 0

numeric => 1

blob => 0

type => int

unsigned => 0

zerofill => 0


и т.д. для каждого поля запроса (мы организовали цикл по всем полям - см. код). Что мы тут имеем (в данном случае, для поля \'ID\' таблицы \'BOOKS\')?
Функции MYSQL_FETCH_FIELDS были переданы 2 параметра: идентификатор результата SQL-запроса и номер поля в запросе. Функция вернула объект со следующими полями:
Name - имя поля в запросе (или alias, если он использован), table - сама таблица, def - НЛО какое-то! я так и не выяснил, что это за значение; это не DEFAULT-атрибут поля таблицы (документация и php.net вместе с zend.com-ом молчат как рыба об лед! :-( ), max_length - максимальная длина среди результатов (имеется в виду не объявленная при создании таблицы длина поля, а количество символов самого длинного значения для данного поля таблицы, полученное при данном запросе. Остальные атрибуты, я думаю, очевидны. Напомню лишь по последнему значению: zerofill означает, что для цифрового поля при выводе (select-е) вместо лидирующих пробелов будут нули.
Теперь о функции MYSQL_FETCH_LENGTHS. Здесь все совсем просто. Единственный параметр - все тот же идентификатор ресурсов, возвращаемый query-функцией. На выходе - обычный массив, заполненный длинами для всех полей текущей строки запроса к базе.
Если взять i-е поле запроса, то

mysql_fetch_fields($res,$i) == MAX( mysql_fetch_length($res) [$i] )


где MAX - обозначение процедуры поиска максимального значения среди i-ых элементов всех массивов, возвращаемых MYSQL_FETCH_LENGTH при переборе всех строк, полученных в запросе к базе.
На этом дальнейшее рассмотрение mysql-функций PHP пока закончим. Остальное рассмотрим позднее - когда разберемся с стринговыми функциями, массивами и прочими необходимыми для дальнейшего развития нашего книжного проекта возможностями PHP.


Функции работы с массивами.
Рассмотрев минимальное подмножество функций работы с sql-сервером, перейдем к другим частям "джентльментского набора".
Пока верстался номер...Wink На сайте "How IT works", в серии статей по PHP опубликовано описание работы с массивами в PHP. Как нельзя кстати!
"Массивных" функций в PHP целых 46 штук. Причем штук 20 из них появились в 4-й версии PHP. Это в основном группа функций вида ARRAY_xxxxx, гдеxxxxx - функциональность.
Функция ARRAY() - самая основная в этой группе. Она предназначена для создания массива из списка.

$fruits = array (

"fruits"  => array ("a"=>"orange", "b"=>"banana", "c"=>"apple"),

"numbers" => array (1, 2, 3, 4, 5, 6),

"holes"   => array ("first", 5 => "second", "third")

);


Это пример взят из мануала. Вполне удачный. Что мы тут видим? Создается ассоциативный массив, первый элемент которого представляет ассоциативный массив из трех элементов, второй - обычный массив из 6-ти элементов (отсчет индексов ведется с нуля) и третий - обычный массив из трех элементов, индекс первого из которых - "0", второго - "5" и третьего - "6" (следующий после индекса предыдущего элемента).
Как достучаться до элементов массива? Ну, например, так:

echo $fruits["fruits"]["a"];


Результат:

orange


Или так:

foreach($fruits["fruits"] as $k => $v) {

echo "$k => $v
";

}


Видим

a => orange

b => banana

c => apple


И, наконец, весь массив:

foreach($fruits as $k => $v) {

foreach($v as $k2 => $v2) {

echo "$k2 => $v2
";

}

}


Получаем:

a => orange

b => banana

c => apple

0 => 1

1 => 2

2 => 3

3 => 4

4 => 5

5 => 6

0 => first

5 => second

6 => third


В примерах задействован оператор языка FOREACH. Этот оператор появился в 4-й версии PHP. Для 3-й версии для получения того же результата потребуется задействовать сразу три важных функции: RESET()EACH() и LIST().
RESET(массив) устанавливает внутренний указатель массива (указатель на текущий обрабатываемый элемент) на начало массива. EACH(массив) возвращает ассоциативный массив из 4-х элементов:

reset($fruits["fruits"]);

$arr=each($fruits["fruits"]);



1 => orange

value => orange

0 => a

key => a


Или в более общем виде:
$arr["0"] => {$key|$index}, $arr["1"] => $value, $arr["key"] => {$key|$index}, $arr["value"] => $value, где $key - ключ в ассоциативном массиве, $index - индекс для обычного массива,$value - значение ключа или индекса. Внутренний указатель перемещается на следующий элемент. Если достигнут конец массива, то вернется false. И LIST(список переменных) присваивает последовательно элементы массива переменным, указанным в параметрах функции. Например, конструкция

list(,,$a,$b)=array(1,2,3,4,5,6);


присвоит переменным $a и $b значения третьего и четвертого элементов массива(первый, второй и все остальные после четвертого мы "прокинули"). Кстати, в примере с while-list-each мы так и поступили - использовали в LIST() только первые два элемента возвращаемого EACH() массива.
Теперь пример, аналогичный FOREACH-конструкции, приведенной в начале шага:

echo "";

reset($fruits);

while((list($k,$v)=each($fruits))) {

echo "";

reset($v);

while((list($k2,$v2)=each($v))) {

echo "";

}

}

echo "
$k:
$k2 => $v2
";


Еще три функции навигации по массивам: CURRENT(массив) возвращает значение текущего элемента массива; если достигнут конец массива - вернется false(при этом для пустого массива также вернется false). NEXT(массив) и PREV(массив) - перемещение внутреннего указателя вперед/назад. Как обычно, достижение начала/конца массива сопровождается возвратом false.END(массив) переместит указатель на конец массива - антоним RESET-а!


Функции работы с массивами. Часть 2.
В предыдущем шаге я в числе прочего описал функцию CURRENT(), возвращающую
значение текущего элемента маасива, и совсем забыл отметить, что функция есть
POS() - синоним для CURRENT(). Просто алиас.
Теперь продолжим по массивам. Функция EXTRACT() создает переменные на основе
ассоциативного массива. Функция имеет три параметра: исходный массив, тип операции (необязателен),
строка-префикс (необязательный; для типов операций EXTR_PREFIX_SAME и EXTR_PREFIX_ALL) -
для создания переменных с строкой-префиксом в названии, не попадающих под правило, определяемое
типом операции.
Теперь подробнее. Но сначала для большей наглядности демонстрационный пример, взятый из мануала
и несколько переделанный:

    //массив типов операций

    $types=array(EXTR_OVERWRITE, EXTR_SKIP, EXTR_PREFIX_SAME, EXTR_PREFIX_ALL);

    //массив, над которым будем измываться Wink

    $var_array = array ("color" => "blue",

                        "size"  => "medium",

                        "shape" => "sphere");

    foreach($types as $type) {

        //инициализация перед очередным вызовом extract-а

        unset($color,$shape,$wddx_color,$wddx_size,$wddx_shape);

        $size = "large";

        echo "

";

        //позвали

        extract ($var_array, $type, "wddx");

        print "$color, $size, $shape; $wddx_color, $wddx_size, $wddx_shape
\\n";

    }


Результат выполнения:

blue, medium, sphere; , ,

blue, large, sphere; , ,

blue, large, sphere; , medium,

, large, ; blue, medium, sphere


Как Вы, наверное, заметили, тип операции задается константой (допустимые значения от 0 до 3).
Перед выполнением EXTRACT()-а проинициализирована одна из создаваемых функцией
переменных - $size. Значение 2-го параметра EXTR_OVERVIEW (значение по умолчанию)
заставляет функцию перезаписывать значение этой переменной новым значением (из массива).
EXTR_SKIP не "портит" значение $size.
EXTR_PREFIX_SAME также не изменяет $size,

но создает одноименную переменную с префиксом, передаваемым в третьем параметре (в этом случае
третий параметр обязателен - умолчания нет!), т.е. в данном примере переменную wddx_size.
И наконец, EXTR_PREFIX_ALL, не трогая $size, создает на каждый ключ массива
переменную с префиксом.
Остается добавить, что функция предназначена только для обработки ассоциативных массивов.
Если встретившийся ей элемент массива не является ассоциативным, то функция посчитает
его некорректным и проигнорирует, т.к. не сможет создать переменную, начинающуюся с цифры.
То же касается и случая

$var_array=array("Кто назвал"=>"даму сэром?");


т.к. в имени переменной не может быть пробелов - ключ для функции неверен.
Мануал предлагает использовать эту функцию для обработки массивов с результатами работы функции группы WDDX_xxxx (от сюда и строка префикса в примере).
К WDDX-группе мы перейдем ближе к финалу рассмотрения возможностей PHP, когда вплотную займемся работой с XML. По описанию на сайте разработчиков WDDX-концепция основана на XML-технологии (DTD) и предназначена для сериализации данных, под которой авторы понимают сохранение и передачу данных между разными скриптовыми технологиями на стороне сервера (например, PHP Wink. Необходимоть такого решения обуславливается различиями внутреннего формата данных в разных скриптовых решениях (ColdFusion, Perl, ASP, Java, JavaScript, PHP и пр.).
(Надеюсь, я правильно понял описание...)

Функция KEY() возвращает текущее значение ключа массива (напомню, когда речь идет о текущем значении, имеется в виду внутренний указатель на элемент массива). В качестве параметра передается массив. Если массив неассоциативный, то ключем является индекс.
Функция RANGE() создает массив из диапазона чисел:

foreach(range(10,20) as $k=>$v) {

   echo "$k => $v
";

}


Функция SHUFFLE() случайным образом "перемешивает" содержимое массива (правда, для полноценной "случайности" надо проинициализировать псевдослучайную последовательность функцией SRAND(), дав ей на вход уникальное число, например, от функции TIME()).
Вот пример (взят из мануала).

srand(time());

$q=range(10,20);  //Создали массив вида q[0]=10, q[1]=11, q[2]=12 и т.д.

shuffle($q);      //"перемешали" содержимое

foreach($q as $k=>$v) {

    echo "$k => $v
";

}


Массив может быть как с числовыми индексами, так и ассоциативный. Индексы остаются по-прежнему в порядке возрастания - перетасовывается только содержимое.


Лирическое отступление - функции для Oracle.
Прошу прощения за непоследовательность изложения, но пропустить такую тему в данном случае я бы очень не хотел. Касаться темы "PHP и Oracle" я не планировал (по крайней мере в обозримом будущем). Но на днях пришлось-таки сделать выборку с базы на Oracle. Т.к. тема эта, вообще говоря, популярна, то я посчитал нужным сделать отступление от "генерального плана" и вкратце описать структуру скрипта, осуществляющего работу с базой на Oracle-сервере.
Сразу оговорюсь. В PHP есть две группы функций для работы с БД на Oracle: "Oracle function" и "Oracle 8 function". Последняя, как ясно из названия, предназначена для работы с ораклом 8-й версии. Я же делал выборку из базы на 7-м оракле. Поэтому продемонстрирую работу с первой группой.
Общая схема такова. Есть сервер oracle и есть клиент (в моем случае Windows NT). На клиентской машине установлен клиент Oracle (нужен SQL-NET). Пусть вTNSNAMES.ora прописан коннект к oracle-базе с именем TEST. Допустим, есть таблица такой структуры:
TEST_TAB: field1, field2, field3, field4. Выберем поля field1, field2 и field4.
Теперь сам скрипт:

    $user=\'user\';

    $tns=\'test\';    //имя из TNSNAMES.ora

    $pass=\'password\';   //крутой пароль Wink

    //выбираемые из таблицы поля

    $fields=split(\',\',"field1,field2,field4");

    //формируем строку запроса

    $sql="select ".implode(\',\',$fields)." from test_tab where field1=\'значение\'";

    //коннект

    $conn=ora_logon("$user@$tns","$pass") or die(\'Error ORA_LOGON\');

    //создали курсор

    $cur=ora_open($conn)  or die(ora_errorcode($conn).\': \'.ora_error($conn));

    $defer=0;   //а что это такое - я пока, увы, не знаю :-(

    //парсинг строки sql-запроса и связывание ее с курсором

    ora_parse($cur,$sql,$defer) or die(ora_errorcode($cur).\': \'.ora_error($cur));

    //выполнить запрос к базе

    ora_exec($cur) or die(ora_errorcode($cur).\': \'.ora_error($cur));

    //формируем вывод результатов выборки

    echo \'\';

    for($col=0;$col < count($fields);$col++) {    //заголовок

        $col_nam=Ora_ColumnName($cur,$col);     //имена колонок (или алиасы)

        $col_typ=Ora_ColumnType($cur,$col);     //типы полей в выборки - для иллюстрации

        echo "";

    }

    while(ora_fetch($cur)) {    //выбираем значения по строкам

        echo \'\';

        for($col=0;$col < count($fields);$col++) {

            $result=ora_getcolumn($cur,$col);

            echo "";

        }

        echo \'\';

    }

    echo \'
$col_nam
($col_typ)
$result
\';

    ora_close($cur);        //удалить курсор

    ora_logoff($conn);      //разорвать соединение


Вы, наверное, заметили, что в целом логика работы с oracle-базой похожа на работу с MySQL. Разве, что парсинг запроса вынесен в отдельную функцию.
P.S. Вот и вышел PHP 4.0.4 ! Говорят, там gd-функции работают и в режиме "PHP как модуль Apache". (Это я в PHP-конференсии прочел Wink


Лирическое отступление-2 - Работа с графикой.
Что-то меня на лирику потянуло...Wink Поставил себе PHP версии 4.0.4 и понял, что прийдется еще раз отойти от "генеральной линии". Дело в том, что версия 4.0.4 теперь ставится как модуль к Apache и при этом image-функции прекрасно работают!
Но сначала несколько замечаний. Во-первых, при установке PHP как модуля к Apache следует в точности руководствоваться инструкциями по установке PHP, приведенным на сайте How IT work за 18.10.2000, включая требование переноса файла php.ini в windows-каталог (для установки как cgi это было не обязательно - можно хранить ini-файл вместе с php.exe). Во-вторых, после внесения изменений в php.ini надо перезапустить Apache, иначе изменения видны не будут (ну правильно, ставим ведь как модуль!).
Для работы с графическими функциями нужно подключить GD-библиотеку. Для этого в php.ini надо раскомментировать строку "extension=php_gd.dll" (и перезапустить Apache!).
Проверьте также правильность пути расположения dll-файлов библиотек для PHP (строка "extension_dir =" в php.ini).
Графические функции в PHP работают с тремя форматами: GIF, JPEG и PNG. На самом деле поддерживаются (по крайней мере официально) только два формата. GIF из-за проблем с лицензированием в версии 1.6 библиотеки GD в PHP не поддерживается. Т.е. при выполнении скрипта PHP, встретив функцию GIF-группы, не выругается, но и ничего делать не будет.
Теперь о функциях работы с графикой.
Чрезвычайно полезная для организации структуры html-страницы функция GETIMAGESIZE() получает на вход имя файла-картинки (кстати, в порядке исключения, эта функция может работать еще и с форматом SWF ), а возвращает массив из четырех элементов: ширина и высота картинки в пикселях, тип формата (1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF) и четвертый элемент массива (индекс = 3) содержит самую полезную строку для html-кодировщика - атрибут тега IMGheight=xxx width=xxx, где \'xxx\' - значения размеров. Полезнейший атрибут для тех, кто хочет избежать неприятного эффекта "прыгающего" текста, когда по мере подгружения браузером вставленных в текст картинок читающий пользователь видит сдвиги текста вниз по экрану (это браузер наконец вычислил размер области под изображение). Второй параметр (необязательный) для функции GETIMAGESIZE() - адрес массива для получения дополнительной информации из заголовка JPG-файлов (к сожалению, я не знаю подробностей на эту тему). Кстати, для этой функции подключать GD-библиотеку в PHP не нужно.
В image-разделе есть группа фукнций, работающих с текстом (формирование изображений из текста) на основе шрифтов в GD-формате. Сформировать такой шрифт можно с помощью утилиты bdf2gdfont, исходный код которой входит, например, в поставку Linux-а. Эта утилита делает GD-фонт из т.н. BDF-шрифта. Насколько я понял, это шрифт предназначен для X-windows (я неправ?).
В любом случае мне с этими шрифтами иметь дело не приходилось, поэтому я опущу рассмотрение функций работы с такими шрифтами (речь идет о таких функциях как ImageLoadFont(), ImageString(), ImageChar(), ImageFontHeight(), ImageFontWidth() и др. Отличить их можно по наличию параметра - идентификатора ресурса шрифта (в мануале "int font"), который возвращает функция ImageLoadFont().
Кстати, есть еще группа функций для работы с postscript-шрифтами: IMAGEPSxxxxx, где \'xxxxx\' - функциональность в названии функции. С PS-шрифтами я тоже не работал (пока) и посему рассматривать не буду.
А еще есть функции для работы с truetype-шрифтами. Вот их-то мы и будем использовать!



Работа с графикой-2.
Логика работы с графикой проста. Есть html-страница, в которой надо вывести картинку. Пусть саму картинку генерирует скрипт, находящийся в файлеimage.php. В основном html-файле тогда будет написано что-то типа этого:




Здесь мы передаем в скрипт, генерирующий картинку (в примере будет серый прямоугольник), RGB-палитру цвета формируемого прямоугольника (напомню, что эти переменные, передаваемые в скрипт как параметры, будут в нем видны так, как если бы они были в нем объявлены и проинициализированы передаваемыми в вызывающем скрипте параметрами, т.е. для их использования ничего делать не надо!).
В image.php будет такой код:


Header ("Content-type: image/jpeg");    //HTTP-заголовок для картинки

$im = ImageCreate (500, 30);            //создаем image

$background = ImageColorAllocate ($im, $r, $g, $b); //создаем цвет фона

ImageJpeg ($im);                        //выводим image

ImageDestroy ($im);     //освободим память, выделенную под image

?>


Комментарии здесь следующие. Первое - в файле image.php перед тегом, открывающим php-секцию, не должно быть ни одного символа (даже пробелов!). До функции HEADER() также не должно быть ни одного оператора ECHO или PRINT. Файл не должен начинаться с декларации html ().
Это важно потому, что при появлении символов на вывод web-сервер прекращает формирование HTTP-заголовка и переходит к формированию секции данных (например, собственно html-страницы). А функция HEADER() как раз и добавляет/заменяет секцию заголовка (в данном случае, отвечающую за тип данных).
Кстати, "обойти" это ограничение можно буферизацией вывода.  Т.е. это не обход, а организация выполнения скрипта - до окончания формирования HTTP-заголовка выводимая информация помещается в буфер, а потом буфер сбрасывается в выходной поток. В PHP есть для этого соответствующие функции.

Функция IMAGECREATE() создает image размера, указанного в параметрах функции: ширина и высота. Возвращаемое значение - целое, являющееся идентификатором ресурса image.
IMAGECOLORALLOCATE() возвращает идентификатор цвета, формируемого на основе RGB-значений (2..4 параметры; первый параметр - идентификатор image-ресурса).
IMAGEJPEG() формирует картинку (в данном случае, jpeg-формата) для передачи сервером клиентскому браузеру. Всего такого рода функций три. Кроме указанной для jpeg-формата есть еще IMAGEPNG() и IMAGEGIF() для png- и gif-форматов соответственно (формально, а на самом деле gif-ы, как я уже говорил, не поддерживаются, так что всего функций, формирующих картинки, две).
IMAGEDESTROY() освобождает память, выделенную функцией IMAGECREATE() под image. Единственный параметр - идентификатор image-ресурса.
Фоном картинки становится первый созданный после создания image цвет. А как сделать фон картинки прозрачным? Очень просто. Для этого есть функцияIMAGECOLORTRANSPARENT(), ставящая для указанного цвета в указанной картинке атрибут transparent. Первый параметр этой функции - идентификатор image-ресурса, а второй (необязательный) -  идентификатор созданного цвета, например:

imagecolortransparent ($im, $color);


Вообще говоря, идентификаторы создаваемых цветов представляют из себя, как я понял, целые числа, начинающиеся с нуля (первый вызовIMAGECOLORALLOCATE()) и увеличивающиеся на единицу при каждом последующем вызове функции создания цвета. Явного указания на этот факт в мануале я, правда, не нашел (не туда смотрел?).
P.S. Кстати, если у Вас картинка все же не формируется, проверьте синтаксис. В случае ошибок PHP выводит в выходной поток (сервер отдаст этот вывод браузеру) сообщение об ошибке (если в php.ini параметр "error_reporting" выставлен в "on"). Причем выводит до выполнения скрипта, т.е. на этапе компиляции, а не выполнения, а значит, до выполнения функции HEADER() - см. выше.
Если же в php.ini параметр "display_errors" вместо умолчательного значения "E_ALL & ~E_NOTICE" будет равен, скажем, "E_ALL" (т.е. выводить все сообщения, включая предупреждения), то остаться без картинки можно, например, использовав необъявленную переменую.



Подробности к шагу 12.
Для экспериментов с операторами и функциями mysql удобно создать таблицу-пустышку по аналогии с oracle-иным решением (я думаю, Вы уже создали какую-нибудь базу для экспериментов, ну, например, mysqladmin create test):

connect test;

create table dual (id char(1));

insert into dual values(\'X\');


Итак, сокращенный список операторов и функций MySQL. (Здесь описаны лишь некоторые функции, отобранные в основном по критерию отличности от SQL-стандарта.)
Условия WHERE:



[NOT] BETWEEN .. AND

диапазон (как в стандарте - просто напоминаю).

[NOT] IN (...)

список значений (то же замечание).

Стандартный оператор [NOT] LIKE строка_с_подстановками,

где подстановки могут быть символом \'%\' (любое число символов) и/или \'_\' (одиночный символ), например,
поле field в таблице test некоторой записи содержит такой текст: "PHP - рулез форева!";

тогда добраться до него можно так:



select * from test where field like \'%рул_з%\'



(предполагается, что мы забыли, что именно является рулезом и как вообще пишется рулез: "рулЕз" или "рУлиз" Wink


[NOT] REGEXP/RLIKE (а вот это интересно!)

использование регулярных выражений (!), например, если таблица из предыдущего примера хранит записи с утверждениями для всех версий PHP, а мы согласны с рулезностью только 3-й и 4-й версий, то условие WHERE можно записать так:


field regexp \'^PHP[3|4]\'






LIMIT [начало,] конец_выборки

ограничение диапазона выборки.

По моему скромному разумению, без этой фразы mysql в интернете не прижился бы.

LIMIT позволяет ограничить объем выборки указанным диапазоном. На этой штуке базируется логика выборки данных для всяких форумов, конференций, новостных страниц и пр. Почему? Ну представьте, что посетитель Вашей страницы хочет просмотреть список новостей, начиная с текущей даты. Вы можете вывалить ему в ответ список сообщений (допустим, их накопилось штук 300 или 1000), превратив бегунок вертикального скроллбара броузера в узкую полоску или выдать сообщения порциями по нескольку штук. Но где хранить всю выборку между выдачами очередных порций? Ведь после ответа на запрос клиентского броузера web-сервер разорвет соединение, освободив выделенные ранее ресурсы. Решение может быть таким:



$result=mysql_query("SELECT * FROM ".$table." LIMIT ".$start.", ".$rows)


где $start=$rows * $page_number, а $page_number - параметр, на 1 больший номера текущей страницы для перехода к следующей "пачке", и на 1 меньший - для предыдущей порции Ваших сообщений. Этот прием будет продемонстрирован в следующих шагах, когда мы разработаем полноценный отчет по книжным спискам.

PROCEDURE имя_процедуры

с версии 3.22 можно задать процедуру обработки запроса.
Эту возможность я сам еще не использовал. Привожу ее для "кучи". Позднее разберусь - опишу.



Некоторые функции, которые могут быть использованы в WHERE и в SELECT (скажем, в конструкции SELECT функция(...) FROM dual, где dual - созданная нами таблица с одной (все равно какой) записью - см. замечание в начале "Подробностей").



DATABASE()

вернет имя текуще базы (скажем,


SELECT DATASET() FROM какая_нибудь_таблица_из_открытой_базы LIMIT 1



(LIMIT - чтобы на выводе иметь только одну строку.).


Обращаю внимание на изобилие форматов вывода для дат в функции DATE_FORMAT().

ENCRYPT и PASSWORD

предназначены для шифрования строк (по-моему, по методу DES от UNIX-операционок).

http://igorb962007.ya.ru/

Вернуться к началу  Сообщение [Страница 1 из 1]

Права доступа к этому форуму:
Вы не можете отвечать на сообщения