А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/sestra/
Rambler's Top100
Пишем на PHP: Краткость — сестра таланта

Насколько я понял, совсем не лишним оказалось описание базовых возможностей SQL, которым я немного прервал наш курс несколькими уроками назад.

Сегодня я хочу опять чуть-чуть отклониться от "курса партии" и поговорить о конструкциях. Но уже не SQL, а самого PHP. Это поможет вам легче читать листинги программ, а я смогу писать более лаконично последующие функции, не боясь, что вы меня не поймете.

Не пугайтесь, это совсем не значит, что я собираюсь дальше писать все сложно и туманно. Нет, ничего подобного. Просто хочу, чтобы у вас появилось понимание того, что PHP -- не Бейсик, где можно писать только так, как можно писать. И никак иначе. Здорово сказал, сам-то понял, что написал, Курепин?! Понял, понял...

Знакомьтесь -- точка.

Точку "." вы уже знаете, она объединяет строки. Плюс "+" -- складывает цифры, а точка объединяет строки.
$a1="100";
$a2="200"
Что будет, если сложить $a1 и $a2? А это как сложить...
$a1+$a2=300
$a1.$a2="100200"
...и никогда об этом не забывайте.

А вот как еще можно записать сложение.

Предположим, что мы составляем какую-то сложносочиненную строку из различных фрагментов. Мы можем добавлять в конец нашей переменной новые данные вот так:
Несколько длинновато, не так ли? Мешает повторение длинной переменной $this->string_about_letters. Поэтому, запись сделаем иначе:
Удобнее, не так ли?

Тоже самое, касается и математического сложения:
$abc+=1;
Прибавить 1 к содержимому переменной $abc.

А как еще можно прибавить единицу? Обычно, по С-шному:

$abc++; или ++$abc;

Два этих выражение обычно используются в циклических конструкциях. И не сами по себе, а в каком-то более сложном выражении.
Отличие же этих двух выражений состоит в том, что в первом случае значение переменной учитывается в выражении, а затем уже производится прибавление единицы, а во втором все наоборот -- сначала происходит увеличение значения переменной, а затем уже получившееся значение используется в выражении. На примере станет понятно:
$a=1;
echo $a++;
echo ++$a;
Первое echo распечатает нам "1", а второе распечатает?.. а вот не правильно! Не 2 оно распечатает, а "3". Почему? Догадайтесь сами.

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

Речь идет, конечно же, о получении данных посредством select-а.

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

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

Вот, можно было бы оформить процедуру так (во многих учебниках вы и найдете нечто похожее):
Поясняю.

Мы делаем запрос в базу (кстати, обратите внимание на новое для нас условие в запросе: between date and date, такая форма часто используется для указания диапазона дат).

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

Далее выясняем: сколько же строк(записей) из базы мы должны получить. Для этого используем функцию mysql_num_rows().

Затем мы открываем цикл с количеством повторений, равным количеству полученных строк из запроса.

В теле цикла мы вынимаем из нашего запроса очередную строку в переменную-массив $film. Функция mysql_fetch_array раскладывает данные в ассоциативный массив, используя в качестве ключей имена полей из таблицы.

    Ассоциативный массив -- это тоже самое, что и обычный (нумерованный) массив, только в качестве имен для ячеек используются не цифры, а цепочки символов. И обращаться к ячейкам такого массива следует соответствующе: $abc['first'], $abc['mama']...

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

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

Цикл повторяется нужное количество раз, после чего мы замыкаем $str последним html-тэгом. Готово.

Но не слишком ли это все громоздко? По-моему, очень даже. Предлагаю записать это все иначе: все тоже самое, но короче.

Вот так.

Что изменилось?

Во-первых, мы в запросе сразу конкретизировали: какие поля из базы нам нужны, и в каком порядке нам их подать: f_id, f_name.

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

В-третьих, мы в самом условии цикла while получаем в отдельные переменные нужные нам значения: list() изображает из себя массив, где ячейками массива являются переменные, которые мы укажем. То есть мы сразу получаем в переменную $f_id номер видеофильма, а в f_name получаем его название.

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

Посмотрите еще раз на второй вариант записи этой функции. Краткость -- сестра таланта, не забывайте об этом даже тогда, когда пишите большой web-проект. Лучше десять раз подумать, как написать короче, чем плодить километровые листинги. Заказчик, правда, не всегда оказывается доволен маленьким объемом исходных текстов, не понимая, за что же он платит деньги. Но тут уже вы должны ему объяснить, что платит он не за машинопись, а за талант! Чем короче программа, тем она быстрее выполняется и тем меньше занимает оперативную память, что тоже бывает важно... До завтра!

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin