10509

Основы работы с базой данных. Продолжение изучения теоретических основ PHP и MySQL

Лекция

Информатика, кибернетика и программирование

Основы работы с базой данных. Продолжение изучения теоретических основ PHP и MySQL. Раздел Введение Цель: Что такое База Данных БД. Как устроены базы данных и как они хранятся на сервере. Пример использования баз данных на реальном сайте. Какую...

Русский

2013-03-27

2.12 MB

15 чел.

Основы работы с базой данных.

Продолжение изучения теоретических основ PHP и MySQL.

Раздел

Введение

Цель:

  •  Что такое База Данных (БД).
  •  Как устроены базы данных, и как они хранятся на сервере.
  •  Пример, использования баз данных на реальном сайте.
  •  Какую структуру имеет БД и как в ней хранится информация.
  •  Сколько баз данных нужно для сайта.
  •  Cхема извлечения данных из базы на страницу сайта.
  •  Где взять программное обеспечение для создания Баз Данных на локальном компьютере.

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

 

В лекции рассматриваются следующие темы.

Тема 13 – Схема взаимодействия с базой.

Тема 14 - Создание БД и таблиц.

Тема 15 - Соединение с БД из PHP.

Тема 16 - Выборка данных из БД.

Тема 17 - Использование функции PRINTF.

Тема 18 – Выборка и сортировка.

Тема 19 – INSERT.- Вставка информации в базу.

Тема 20 - Оператор обновления – UPDATE.

Тема 21 - Оператор удаления – DELETE.

Примечание. Если на рисунках или тексте используется овал , то на эту информацию следует обратить особое внимание.

У Вас на машине должна быть создана  папка в которой

(<папка тестов> :\WebServers\home\localhost\www\php\*.php) находятся  предоставленные Вам исходные коды программ.


Тема 13 – Схема взамодействия с базой.

Когда Вы приобретаете хостинг для размещения своего сайта, то Вы прежде всего интересуетесь какая СУБД  размещена на сервере провайдера (обычно это связка Apache, PHP и MySQL) и сколько Вам придется платить за услуги.

Примечание.

Прова́йдер (англ. Internet Service Provider, ISP) — организация, предоставляющая услуги доступа к Интернету и иные связанные с Интернетом услуги.

В число предоставляемых интернет-провайдером услуг могут входить:

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

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

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

Рис. 1. Фрагмент сайта.

Процесс создания полноценного сайта рассмотрен в вспомогательной лекции “Cоздание PHP сайта”. Настоятельно рекомендуется, если эта тема Вас интересует, то вначале все таки изучите теоретический курс, а затем переходите к практике.

Учитывая, что данный курс называется “Базы данных”, вопросы связанные с деталями создания сайтов, будут рассмотрены в других дисциплинах и уровень глубины изложения  материала определяются выбранной Вами специализации.

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

Например для хранения информации о лекциях может быть использована таблица с структурой показанной на рис. 2.

Информация их этих таблиц с помощью оператора цикла (например, языка PHP) извлекается из таблицы базы данных, и с помощью специальных команд отображается на экране.

Рис. 2. Возможная  структура таблицы для хранения информации о лекциях.

Более подробно схема процесса может быть представлена следующим рисунком (рис. 3). После соединения с базой и выбора в ней хранимой таблицы (команда 1), в цикле (команда 2) подготавливается страница HTML (из хранимых данных в полях таблицы базы данных) и передается клиенту, на машине которого присутствует браузер (оболочка).

Именно средствами оболочки содержимое полученной страницы выводится на экране клиента. На машине клиента присутствие системы управления базами данных (СУБД) MySQL не обязательно, но в нашем случае система MySQL установлена для целей ее изучения и возможности создания сайта непосредственно на локальной машине, с целью последующего его использования на удаленном MySQL сервере.

Рис. 3. Схема взаимодействия с базой.


Тема 14 - Создание БД и таблиц.

Цель:

  •  Как попасть в  СУБД MySQL.
  •  Как создать БД.
  •  Как создать таблицу в БД и определить необходимые поля.
  •  Какое поле должно обязательно присутствовать в таблице.
  •  Какие типы полей существуют и как проще всего разобраться в их многообразии.
  •  Какой тип нужно выбирать при хранении небольших чисел.
  •  Как создать автозаполняемое поле в БД.
  •  Что такое первичный ключ, и для чего он нужен.
  •  Какой тип данных нужно выбирать для хранения в базе небольших текстовых значений.
  •  Какой тип лучше выбрать для хранения больших текстовых блоков.
  •  Где можно подробнее узнать о всех типах данных, которые могут храниться в БД.

Для входа в MySQL необходимо его запустить. Учитывая, что мы используем Денвер этот запуск производится нажатием ярлыка на рабочем столе  . Запуск Денвера приводит к загрузке Web-сервера Apache и загрузке MySQL, которые с момента запуска будут работать в фоновом режиме на Вашей машине.

Перейдя в браузер и набрав адрес http:/localhost/tools/phpmyadmin

на экране у Вас появится окно оболочки работы с MySQL (рис. 4). Программа, обеспечивающая работу в полученном окне - называется PhpMyadmin.

Рис. 4. Окно оболочки  phpMyAdmin  для работы с MySQL.

Примечание. В зависимости от версии Денвера, адрес, указываемый в браузере может отличаться от использованного нами. Окно, показанное на рис. 4 также зависит от версии phpMyAdmin. Учитывая, что данное окно будет достаточно часто использоваться в примерах – левую часть окна и не нужные в данный момент для пояснения  составляющие окна показываться не будут

Прежде чем создавать любую базу данных необходимо понимать теорию реляционных баз данных (см. лекции и учебные пособия), но на данном этапе необходимо получить простейшие навыки в использовании СУБД.

В MySQL (и в подобных ей СУБД) база данных воспринимается как совокупность нормализованных таблиц.

Если Вы создаете первую свою базу, то если нажать ,

Рис. 5. Состав баз данных на момент создания первой пользовательской базы.

будет показан состав баз данных в MySQL (в скобках указывается число таблиц в базе).

Здесь для примера создадим  базу данных (рис. 4) с названием My_Base, 

содержащую одну таблицу c именем  Lessons и полями Id (Идентификатор Int (5)), Name (Имя Varchar (25)), Lastname (Фамилия Varchar(35)) и Dol (Должность Varchar (20)), которая будет хранить информацию о лекторах (именах и фамилиях) и занимаемых ими должностях.

Также необходимо поле, значение которого должно позволять отличить одного лектора от другого. Такое поле у нас получило название Id.

Нажатие (рис. 4) приведет к окну, показанному на рис. 6. В этом же окне будет показана команда языка SQL, использованная для создания базы данных (CREATE DATABASE … ) с именем ‘My_Base’.

Примечание. На некоторых рисунках пункты меню типа (рис. 6) будут не показываться, до тех пор, пока в этом не появиться необходимость.

Рис. 6. Окно для создания таблицы в базе данных с именем My_Base.

Далее необходимо указать имя таблицы и количество полей (столбцов) в таблице

и нажав получить окно (рис. 7), в котором необходимо описать состав полей в созданной таблице .

Тема 15 - Соединение с БД из PHP.

Цель:

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

Продолжение описания характеристик полей создаваемой таблицы.

Рис. 7. Окно для описания характеристик таблицы в базе My_base.

Примечание. На рис. 7 часть окна, обведенная овалом не видна на экране и находится правее вкладки изображения показанного на рисунке .

Учитывая, что какое то поле (группа полей) в любой таблице обязательно должно быть объявлено в виде первичного реляционного ключа, для поля Id указана характеристика в столбце равная (рис. 8), которая заставит СУБД MySQL отслеживать уникальность значений в этом поле таблицы, и значения в этом поле будут целыми числами в диапазоне от 1 до 99999 (определено значением указанной длины равной 5).

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

Кроме того, в столбце с пиктограммой (первичный ключ ) необходимо подтвердить, что поле с именем Id является первичным ключом.

Состав заполненного окна характеристик таблицы (с именем  Lessons) показан на рис. 8.

Для полей Name, Lastname, Dol выбран тип символьный и указана максимальная длина значений, которые могут быть введены в эти поля.

Значение , указывает что эти поля должны быть ‘означены’.

Рис. 8. Характеристики новой таблицы в базе My_base СУБД MySQL.

Сохранив введенную информацию на рис. 8, получим результат действия программы phpMyAdmin (рис. 9).

Рис. 9. Новая таблица Lessons в базе My_base.

Результатом сохранения будет не только создана хранимая таблица, но и  показана команда SQL (CREATE TABLElessons’ (…);) с указанием характеристик полей для таблицы.

Также будет выведена информация об зарезервированной памяти на диске для  сформированной таблицы (рис. 10)

Рис. 10. Новая таблица Lessons в базе My_base.

Далее заполним таблицу данными, используя вкладку “Вставить” и для удобства после ввода информации по первой записи, чтобы лишний раз не нажимать “Вставить”, вскинем радиокнопку (рис. 11) и нажнем кнопку “Пошел”.

Рис.11. Добавление новой записи.

Активизация радиокнопки заставит оболочку вывести новое окно для ввода информации о следующем сотруднике (рис. 13) аналогичное окну на рис. 11 и оповестит о проделанной работе сообщением вида (рис. 12).

Рис. 12. Использованная команда SQL

Для ввода информации о следующих сотрудниках заполним предложенное окно следующей информацией (рис. 13).

Рис. 13. Вводимая информация о следующих сотрудниках.

Нажатие приводит к сообщению о том какую команду SQL использовала оболочка phpMyAdmin для вставки новых записей в таблицу Lessons (рис. 14).

Рис. 14. Вставка двух записей командой SQL    INSERT.

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

Если Вы нажмете , то система вернет Вас в начало процесса.

Если будет нажат , то PhpMyAdmin покажет вам состав таблицы Lessons на данный момент времени (рис. 16).

Рис. 15. Ввод следующих записей.

Рис.16. Состав таблицы Lessons.

В окне будет выведено содержимое сформированной таблицы, отредактировать записи которых можно, если Вы нажмете (палец на рис. 16). Если Вы хотите удалить запись, то следует воспользоваться  пиктограммой  (в некоторых версиях phpMyAdmin это - ). Если возникает необходимость выполнить групповую операцию удаления, то следует воспользоваться инструментом, показанным на рис. 17 и воспользоваться .

Использование позволяет экспортировать выбранные записи.

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

Рис. 17. Метка группы записей для удаления.

Рис. 18.Схема процесса установления связи с MySQL.

Остановимся на вопросе, как создается пользователь с помощью PhpMyAdmin. Для этого необходимо перейти к строчке “К началу” (рис. 15) и нажав, ее получим возможность создать привилегии для нового пользователя.

Рис. 19. Создания пользователя и его привилегий.

Если воспользоваться вкладкой “Привилегии”, то откроется таблица (рис. 20) содержащая информацию обо всех пользователях и их привилегиях (ограничениях к работе с базой данных).

Рис. 20.Таблица пользователей и их привилегии.

Добавим нового пользователя и получим следующее окно (рис. 21).

Рис. 21.Добавление нового пользователя.

Окно представленное на рис. 21 заполняем следующим образом:

В указывается значение, которое Вам что то напоминает. Пусть это будет Mig.

В   обязательно указываем  localhost.

В набираем 12345

Все остальные поля заполняем, как указано на рис. 22 (т.е. даем ему все привилегии, т. к. мы работаем на локальном компьютере).

Рис. 22.Результат заполнения таблицы привилегий.

Нажатие приводит к фиксации нового пользователя и выводу следующего сообщения (рис. 23).

Рис. 22.Результат подтверждения таблицы привилегий.

Таким образом, пользователю с именем Mig и паролем 12345 разрешили обращаться к базе данных с именем Lessons.

Далее необходимо перейти в редактор для создания сценария общения с базой данных, указав в столбце Создать (Create New) на вкладку PHP (рис. 23) .

Рис. 23. Окно редактора для разработки PHP файлов.

И создать файл с именем mySQL.php следующего содержания (рис. 24) для тестирования общения с базой данных используя язык Php.

Рис. 24 Исходный текст mySQL.php.

Текст, представленный на рис. 24 позволяет связаться с MySQL и открыть базу данных с именем my_base.

Для проверки правильного исполнения связи и открытия базы данных приведите программу из рис. 24 к следующему виду (рис. 25).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Соединяемся с БД</title>

</head>

<body>

<?php

$db = mysql_connect("localhost","Mig","12345");

 if (!$db)

  {

    echo "<p>К сожалению, не доступен сервер mySQL</p>";

    exit(); //выход из программы

  }

if (!@mysql_select_db("my_base",$db) )

  {

    echo "<p>К сожалению, не доступна база данных</p>";

    exit();

  }

$ver = mysql_query("SELECT VERSION()");

 if(!$ver)

  {

    echo "<p>Ошибка в запросе</p>";

    exit();

  }

 echo mysql_result($ver, 0);

$result = mysql_query("SELECT * FROM lessons",$db);

$myrow = mysql_fetch_array($result);

do

{

printf("<br>Сотрудник N - %s<br>%s<br>%s<br>%s<br><br>",

$myrow['id'],$myrow['Name'],$myrow['Lastname'],$myrow['Dol']);

}

while ($myrow = mysql_fetch_array($result));

?>

</body>

</html>

Рис. 25. Модификация  MySQL.php для проверки работоспособности MySQL.

После сохранения mySQL.php файла по пути:  C:\WebServers\home\localhost\www\mySQL.php и запуска ,  посмотрите  содержание экрана:

Тема 16. Выборка данных из БД.

Цель:

  •  Какие действия можно совершать с БД.
  •  Что такое выборка данных из базы, и почему она будет очень часто использоваться на практике.
  •  С помощью какой функции производится запрос к базе данных.
  •  Как формируется строка запроса.
  •  Как вытаскивать из базы определенные поля.
  •  Почему нельзя напрямую работать с результатом запроса.
  •  Как превратить результат в удобный для работы массив.
  •  Как очень легко понять выборку с помощью специально разработанной схемы.
  •  Как создавать запрос для выборки строго определенных данных.
  •  Что такое внутренний счетчик функции вывода, и как он устроен (будет показана простая схема).

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

Рис. 26. Что можно делать с базой данных из кода PHP.

Рассмотрим каждый оператор на примерах.

Пусть необходимо вывести всю информацию из таблицы lessons базы данных My_base созданную ранее.

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

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

Рис. 27. Начальное состояние указателя в массиве $myrow.

Функция mysql_query возвращает ассоциативный массив. Функция mysql_fetch_array устанавливает в этом массиве указатель на первую строку массива (напомним, что символ * после SELECT указывает, что из таблицы lessons в переменную $result необходимо передать все поля из таблицы lessons).

Чтобы проверить, где же находится указатель в массиве $myarray, преобразуем исходный код программы MySQL.php к виду (рис. 28)

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Наша текстовая страница</title>

<meta http-equiv="Content-Type" content="text/html" charset="Windows-1251">

<title>Соединяемся с БД</title>

</head>

<body>

<?php

$db = mysql_connect("localhost","Mig","12345"); //связь

mysql_select_db("my_base",$db); //выбор

$result = mysql_query("SELECT * FROM lessons", $db); //запрос

$myrow=mysql_fetch_array($result); //установка ссылки на массив

echo $myrow["Name"]; // вывод первой строки на экран

?>

</body>

</html>

Рис. 28. Получение элемента массива (таблицы базы данных).

После сохранения mySQL.php и указания адреса в адресной строке браузера  http://localhost/php/mysql.php   получаем следующее окно (рис. 29).

Рис. 29.  Результат из первой строки массива $myrow (скрипт из рис. 28).

Если в тексте программы указать, например, echo $myrow["Dol"];, то результат показан на рис. 30.

Рис. 30.  Результат из первой строки таблицы.

Если в коде программы (рис.28) оператор:

$result = mysql_query("SELECT *  FROM LesSons",$db);

заменить на:

$result = mysql_query("SELECT Lastname FROM LesSons",$db);

$myrow = mysql_fetch_array($result);

echo $myrow["Lastname"];     

и попытаемся получить результат (т. е. получить все фамилии, хранящиеся в таблице), то получим только одну фамилию, т.к. переменная $myrow связана с полем ["Name"] на первой записи, а мы приказываем показать ВСЕ фамилии.

Если строку программы 

$result = mysql_query("SELECT Lastname FROM LesSons ", $db); преобразовать к виду:

$result = mysql_query("SELECT Lastname FROM Lessons  WHERE id=2", $db);

т. е. определить какая фамилия хранится c id=2 (рис. 31), то получим результат (рис. 32).

Рис. 31. Хранимая таблица lessons.

Рис. 32. Поиск с условием WHERE.

Если сценарий скрипта (рис. 28) привести к виду:

$result = mysql_query("SELECT * FROM Lessons WHERE id=2", $db);

$myrow = mysql_fetch_array($result);

echo $myrow["Lastname"];

echo "<br>".$myrow["Dol"];     

Результатом будет:

Рис. 33. Результат вывода.

Если скрипт (рис. 28) привести к виду (рис. 34), то его результат показан на рис. 35.

$result = mysql_query("SELECT * FROM Lessons ", $db);

$myrow = mysql_fetch_array($result);// установка на 1-ю строку

echo $myrow["Lastname"];

echo "<br>";     

$myrow = mysql_fetch_array($result); // установка на следующую строку

echo $myrow["Lastname"];

Рис. 34. Код для вывода двух строк из массива $myrow 

Результат

Рис. 35. Результат вывода двух строк из массива $myrow.

Функция mysql_fetch_array($result) имеет свой внутренний счетчик, и при первом вызове он был равен единице, а при следующем обращению он будет равен значению указателя, на котором в данный момент находится таблица (как говорят, происходит скипование (Skip) по временному массиву, хранящемуся в переменной $result).

Нетрудно заметить, что для вывода всех элементов массива можно воспользоваться оператором цикла типа While или For (Не забывайте сохранять модифицированный файл MySQL.php и проверьте запущена ли сама СУБД MySQL - ).

Приведем код программы MySQL.php к виду (рис. 36).

$result = mysql_query("SELECT * FROM Lessons ", $db);

$myrow = mysql_fetch_array($result);

do

{

printf ("<br>Лектор - ".$myrow['id']." ".$myrow['Name'].

       " ".$myrow['Name']." ".$myrow['Dol']);

}

while ($myrow = mysql_fetch_array($result));

Рис. 36. Цикл вывода строк из массива $myrow.

Сохраним результат модификации и укажем адрес в браузере  http://localhost/php/mysql.php.

Результат программы (рис. 36) показан на рис. 37.

Рис. 37. Цикл вывода строк из массива $myrow.

Функция mysql_fetch_array($result) в теле цикла:

while ($myrow = mysql_fetch_array($result));

возвратит ложь, если ее внутренний счетчик выйдет за границу массива, представленной переменной $result. Если представить $result файл, то указатель файла, проверяемый функцией eof() даст значение False.

Тема  17. Использование функции PRINTF.

Цель:

  •  Как связать запрос к базе с циклом;
  •  Использование цикла
  •  Чем отличается данный способ вывода информации из базы в цикле от обычного способа;
  •  Какие особенности есть у функции printf;
  •  Как работать с первой частью функции и как со второй.

Приведем код программы MySQL.php к виду (рис. 38).

$result = mysql_query("SELECT * FROM Lessons ", $db);

$myrow = mysql_fetch_array($result);

do // 2-ой вариант вывода 

{

printf ("<br>Лектор - %s<br>%s<br>%s<br>%s<br><br>",$myrow['id'],

 $myrow['Name'],$myrow['Lastname'],$myrow['Dol']);

}

while ($myrow = mysql_fetch_array($result));

Рис. 38. Использование %s маркера в printf.

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

В первом параметре используется маркер %S (их число определяется количеством переменных указанных во втором параметре), после которого используется тег переноса <br>.

На рис. 39 показан результат работы кода из рис. 38.

Рис. 39. Использование маркера в printf.

Физически использование цикла на рис. 36 и на рис. 38 эквивалентно.

Если возникает необходимость вывести в браузере информацию в виде (рис. 40), то исходный код должен быть приведен к виду (рис. 41).

Рис. 40. Форматированный вывод данных.

$result = mysql_query("SELECT * FROM Lessons ", $db);

$myrow = mysql_fetch_array($result);

echo  "<pre>"; //этот тег дает возможность форматирования вывода данных

do // третий вариант вывода

{//<br>  - тег перевода строки

printf ("<br>Лектор - %' -2s%' -6s%' -12s%s",   $myrow['id'],

        $myrow['Name'],$myrow['Lastname'],$myrow['Dol']);

}

while ($myrow = mysql_fetch_array($result));

echo("</pre>");

Рис. 41. Код форматирования вывода данных.

Запомните, что каждому маркеру s% соответствует переменная указанная после запятой в теле функции printf (" маркеры ", переменные). На рис. 41 для переменной $myrow['Dol'] маркер отсутствует. Чтобы понять, как работают маркеры, посмотрите на следующий формат описания маркеров (рис. 42. Потестировать можно в файле C:\WebServers\home\localhost\www\mySQL.php .).

Рис. 42. Примеры использования маркеров.

На экране форматирование будет выглядеть следующим образом (рис. 43)

Рис. 43. Примеры результата использования маркеров.

Следующий скрипт (рис. 44) использует оператор цикла для вывода содержимого SQL запроса к таблице Lessons базы данных My_base. В этом же тексте показано использование часто встречающихся на практике функций PHP mysql_num_rows($result) и mysql_num_fields($result), позволяющих определить сколько строк и столбцов получено в результате выполнения запроса по функции  mysql_query("SELECT * FROM Lessons ", $db).

$result = mysql_query("SELECT * FROM Lessons ", $db);

echo "В таблице Lessons записей         = ".mysql_num_rows($result)." <br>";

echo "В таблице Lessons полей (колонок) = ".mysql_num_fields($result)." <br>";

$rows = mysql_num_rows($result);  //записей

$fields = mysql_num_fields($result);// полей

//echo "<pre>"; // закройте этот комментарий, если хотите видеть //вертикальный вывод

  echo "<p>Использование цикла и mysql_result для вывода запроса</p>";

for ($c=0; $c<$rows; $c++)

 {

for ($cc=0; $cc<$fields; $cc++)

  {  echo mysql_result($result, $c, $cc)."\t";  echo "\n";    }

 }

Рис. 44. Код  вывода данных  с помощью цикла.

Результатом работы кода из рис. 44 будет содержимое, показанное на рис. 45.

Рис. 45. Результат вывода данных  с помощью цикла.

Если в коде на рис. 44 раскомментарить строку  “//echo "<pre>"; // закройте этот комментарий, если хотите видеть вертикальный вывод”, то Вы получите вывод аналогичный рис. 39.

Ниже приводится набор функций часто используемых при работе с MySQL.

Функции получения информации о результатах SQL-запросов

Функции соединения с сервером MySQL

Примечание. Все приведенные ниже функции и их работу можно посмотреть в файле Function-2.php.

 

Основной функцией для соединения с сервером MySQL является mysql_connect(), которая подключает скрипт к серверу баз данных MySQL и выполняет авторизацию пользователя базой данных. Синтаксис у данной функции такой:

mysql_connect ([string $hostname] [, string $user] [, sting $password]);

Как Вы наверно заметили, все параметры данной функции являются необязательными, поскольку значения по умолчанию можно прописать в конфигурационном файле php.ini. Если Вы хотите указать другие имя MySQL-хоста, пользователя и пароль, Вы всегда можете это сделать. Параметр $hostname может быть указан в виде: хост:порт.

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

Для закрытия соединения предназначена функция

 mysql_close(int $connection_id).

Вообще, соединение можно и не закрывать - оно будет закрыто автоматически при завершении работы PHP скрипта. Если вы используете более одного соединения, при вызове mysql_close() нужно указать идентификатор соединения, которое вы хотите закрыть. Вообще не закрывать соединения - плохой стиль, лучше закрывать соединения с MySQL самостоятельно, а не надеясь на автоматизм PHP, хотя это ваше право.

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

Функция mysql_connect() устанавливает обыкновенное соединение с MySQL. Однако, PHP поддерживает постоянные соединения - для этого используйте функцию mysql_pconnect(). Аргументы этой функции такие же, как и у  mysql_connect().

В чем разница между постоянным соединением и обыкновенным соединением с MySQL? Постоянное соединение не закрывается после завершения работы скрипта, даже если скрипт вызвал функцию mysql_close(). Соединение привязывается к PID потомка веб сервера Apache (от имени которого он и работает) и закрывается лишь тогда, когда удаляется процесс-владелец (например, при завершении работы или перезагрузке веб-сервера Apache).

PHP работает с постоянными соединениями примерно так: при вызове функции mysql_pconnect() PHP проверяет, было ли ранее установлено соединение. Если да, то возвращается его идентификатор, а если нет, то открывается новое соединение и возвращается идентификатор.

Постоянные соединения позволяют значительно снизить нагрузку на сервер, а также повысить скорость работы PHP скриптов, использующих базы данных.

При работе с постоянными соединениями нужно следить, чтобы максимальное число клиентов Apache не преывшало максимального числа клиентов MySQL, то есть параметр MaxClient (в конфигурационном файле Apache - httpd.conf) должен быть меньше или равен параметру max_user_connection (параметр MySQL).

Функция выбора базы данных

Функция mysql_select_db (string $db [, int $id]) выбирает базу данных, с которой будет работать PHP скрипт. Если открыто не более одного соединения, можно не указывать параметр $id.

// Попытка установить соединение с MySQL:

if (!$db=mysql_connect($server, $user, $ password))

{echo "Ошибка подключения к серверу MySQL"; exit;}

// Соединились, теперь выбираем базу данных:

mysql_select_db($db);

Функции обработки ошибок

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

mysql_errno(int $id); и  mysql_error(int $id);

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

echo "ERROR ".mysql_errno()." ".mysql_error()."\n";

Теперь вы будете знать, из-за чего произошла ошибка - вы увидите соответствующим образом оформленное сообщение.

Ниже приводится фрагмент их тестового скрипта Function-2.php использования функций и результатов вывода на экран.

Рис. 46. Фрагмент исходного кода файла Function-2.php.

Ниже на рис. 47 представлен результат работы для кода из рис. 46.

Рис. 47. Результат работы для кода из рис. 46. Файл Function-2.php.

Функции выполнения запросов к серверу баз данных

Все запросы к текущей базе данных отправляются функцией mysql_query(). Этой функции нужно передать один параметр - текст запроса. Текст запроса модет содержать пробельные символы и символы новой строки (\n). Текст должен быть составлен по правилам синтаксиса SQL. Пример запроса:

$q = mysql_query("SELECT * FROM mytable");

Приведенный запрос должен вернуть содержимое таблицы mytable. Результат запроса присваивается переменной $q. Результат - это набор данных, который после выполнения запроса нужно обработать определенным образом.

Функции обработки результатов запроса

Если запрос, выполненный с помощью функции mysql_query() успешно выполнился, то в результате клиент получит набор записей, который может быть обработан следующими функциями PHP:

mysql_result() - получить необходимый элемент из набора записей;

mysql_fetch_array() - занести запись в массив;

mysql_fetch_row() - занести запись в массив;

mysql_fetch_assoc() - занести запись в ассоциативный массив;

mysql_fetch_object() - занести запись в объект.

Также можно определить количество содержащихся записей и полей в результате запроса. Функция mysql_num_rows() позволяет узнать, сколько записей содержит результат запроса:

$q = mysql_query("SELECT * FROM mytable");

echo "В таблице mytable ".mysql_num_rows($q)." записей";

Запись состоит из полей (колонок). С помощью функции mysql_num_fields() можно узнать, сколько полей содержит каждая запись результата:

$q = mysql_query("SELECT * FROM mytable");

echo "В таблице mytable ".mysql_num_fields($q)." полей ";

У нас также есть возможность узнать значение каждого поля. Это можно сделать с помощью следующей функции:

mysql_result (int $result, int $row, mixed $field);

Параметр функции $row задает номер записи, а параметр $field - имя или порядковый номер поля.

Предположим, SQL-запрос вернул следующий набор данных:

Email                  Name    Last_Name

------------------------------------

ivanov@mail.ru     Ivan     Ivanov

petrov@mail.ru     Petr      Petrov

Вывести это в браузер можно следующим образом:

$rows = mysql_num_rows($q);

$fields = mysql_num_fields($q);

echo "<pre>";

 for ($c=0; $c<$rows; $c++) {

    for ($cc=0; $cc<$fields; $cc++) {

    echo mysql_result($q, $c, $cc)."\t";

    echo "\n";

    }  }

echo "</pre>";

Следует отметить, что функция mysql_result() универсальна: зная количество записей и количество полей, можно "обойти" весь результат, но в тоже время, скорость работы данной функции достаточно низка. Поэтому, для обработки больших наборов записей рекомендуется использовать функции mysql_fecth_row(), mysql_fecth_array(), и.т.д.

Функция mysql_fecth_row(int $res) получает сразу всю строку, соответствующую текущей записи результата $res. Каждый следующий вызов функции перемещает указатель запроса на следующую позицию (как при работе с файлами) и получает следующую запись. Если более нет записей, то функция возвращает FALSE. Пример использования данной функции:

$q = mysql_query("SELECT * FROM mytable WHERE month=\"$db_m\" AND day=\"$db_d\");

for ($c=0; $c<mysql_num_rows($q); $c++)

{

$f = mysql_fetch_row($q);

echo $f;

}

Использовать функцию mysql_fecth_row() не всегда удобно, так как значения всех полей одной записи находятся все в одной строке. Удобнее использовать функцию mysql_fetch_array(), которая возвращает ассоциативный массив, ключами которого будут имена полей.

Функция mysql_fecth_array(int $res [, int $result_type]) возвращает не ассоциативный массив, а массив, заданный необязательным параметром $result_type, который может принимать следующие значения:

MYSQL_ASSOC - возвращает ассоциативный массив;

MYSQL_NUM - возвращает массив с числовыми индексами, как в функции mysql_fecth_row();

MYSQL_BOTH - возвращает массив с двойными индексами, то есть вы можете работать с ним, как с ассоциативным массивом и как со списком (MYSQL_BOTH - это значение по умолчанию для параметра $result_type.

В PHP есть функция, возвращающая ассоциативный массив с одним индексом:

mysql_fetch_assoc(int $res);

Фактически, данная функция является синонимом для mysql_fetch_array($res, MYSQL_ASSOC);

Пример использования функции mysql_fecth_array():

$q = mysql_query("SELECT * FROM mytable WHERE month=\"$db_m\" AND day=\"$db_d\");

for ($c=0; $c<mysql_num_rows($q); $c++)

{

$f = mysql_fetch_array($q);

echo "$f[email] $f[name] $f[month] $f[day] <br>";

}

Как видно, использовать функцию mysql_fetch_array() намного удобнее, чем mysql_fetch_row().

Функции получения информации о результатах SQL-запросов.

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

Функция mysql_field_name(int $result, int $offset) возвращает имя поля, находящегося в результате $result с номером $offset (нумерация начинается с 0). Другими словами, функция возвращает имя поля с номером $offset.

Функция mysql_field_type(int $result, int $offset) возвращает тип поля с номером $offset в результате $result (номер задается относительно результата, а не таблицы);

Функция mysql_field_flags(int $result, int $offset) возвращает пречисленные через пробел флаги (модификаторы), которые имеются у поля с номером $offset.

Перечислим все поддерживаемые MySQL флаги:

Флаг Описание

not_Null Поле не может содержать неопределенного значения (NULL), то есть поле должно быть явно инициализировано

Primary_Key Поле будет первичным ключом - идентификатором записи, по которому можно однозначно идентифицировать запись;

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

Unique_Key Поле должно содержать уникальное значение;

Multiple_Key Индекс

Blob Поле может содержать бинарный блок данных

Unsigned Поле содержит беззнаковые числа

Zerofill Вместо пробелов используются символы с кодом \0

Binary Поле содержит двоичные данные

enum Поле может содержать один элемент из нескольких возможных (элемент перечисления)

timestamp В поле автоматически заносится текущая дата и время при его модификации

Функция mysql_field_flags() возвращает флаги в виде строки, в которой флаги разделяются пробелами.

Следующий фрагмент кода Function-2.php показывает практическое использование некоторых функций.

Рис. 48. Фрагмент исходного кода файла Function-2.php.

Ниже на рис. 49 представлен результат работы для кода из рис. 48.

Рис. 49. Результат работы исходного кода файла Function-2.php.

Обратите внимание на строку на рис. 48

и ее результат на рис. 49. Посмотрите код программы Function-2.php и ответьте откуда PHP знает об этой таблице.

Почему не сменился  ???

Как среагирует программа, если на рис. 48 закомментарить строку:

Может ли изменится результат вывода ? показанный на рис. 49.

В конце текста лекций приведен полный текст файла Function-2.php. Найдите в нем строку:

exit(); //Контрольная точка теста

Закомментарьте ее и проанализируйте результат

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

Для этого создадим файл (<папка тестов> :\WebServers\home\localhost\www\php\*.php) MySQL-1.php следующего содержания (рис. 50):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Пример соединения с БД</title>

</head>

<body>

<?php

$host = "localhost";

$user = "Mig"; //имя пользователя должно написано также, как //Вы его написали при создании привилегий этого пользователя

//Имя должно содержать только латинские буквы  

$password = "12345"; //пароль пользователя

// Производим попытку подключения к серверу MySQL:

if (!$db=mysql_connect($host, $user, $password))

   {echo "<h2>MySQL Error!</h2>";  exit; }//неудача

// Выбираем базу данных:-mysql_select_db($db);

if (!@mysql_select_db("my_base",$db) )

 {echo "<p>К сожалению, не доступна база данных</p>";

   exit();}

echo "<h2>MySQL Сведения о сотрудниках</h2>";

// Выводим заголовок таблицы:

echo"<table border=\"1\" width=\"50%\" bgcolor=\"#FFFFE1\">";

echo "<tr><td>Номер_id</td><td>Имя</td><td>Фамилия</td>";

echo "<td>Должность</td>"; //td

//$q = mysql_query ("SELECT * FROM Lessons");// SQL-запрос:

$q = mysql_query('SELECT * FROM `lessons` LIMIT 0, 2');

// Выводим таблицу:

for ($c=0; $c<mysql_num_rows($q); $c++)

{echo "<tr>";

$f = mysql_fetch_array($q);

echo "<td>$f[id]</td><td>$f[Name]</td><td>$f[Lastname]</td>";

echo "<td>$f[Dol]</td>";

echo "</tr>";}//конец цикла вывода таблицы

echo "</table>";

echo "<h2> Сведения о полях</h2>";

echo"<table border=\"1\" width=\"50%\" bgcolor=#33FFFF\">";

for ($i = 0; $i < mysql_num_fields($q); $i++)

{echo "<tr>";

$c =mysql_field_name($q, $i);

$fl=mysql_field_flags($q,$i);

$t=mysql_field_type($q,$i);

echo "<td>$i</td><td>$c<td>$t</td><td>$fl</td>";

echo "</tr>";}

echo "</table>";

?>

</body>

</html>

Рис. 50. Исходный код файла MySQL-1.php.

Запуск на исполнение данного кода (рис. 50) приведет к результату показанному на рис. 51.

Рис. 51. Результат работы кода файла MySQL-1.php.

Тема 18 – Выборка и сортировка.

Цель:

  •  Как делать выборку из базы с двойным условием "И" (например найти информацию по сотруднику у которого фамилия  "Петров" и  должность "Доцент" );
  •  Как делать выборку из базы с двойным условием "ИЛИ" (например найти информацию по сотруднику у которого фамилия  "Петров" или "Иванов");
  •  Как отсортировать данные выбранные из базы по определенному критерию;
  •  Как сортировать данные по критерию в обратном порядке;
  •  Как ограничить количество выводимых записей из базы (пример).

В данной теме использован тренировочный файл C:\WebServers\home\localhost\www\php\mySQL-2.php.

На следующем рисунке показано использование логической связки AND (И).

Рис. 52. Использование логической связки AND в запросе.

Результат будет пустым (см. организацию вывода на экран в файле C:\WebServers\home\localhost\www\php\mySQL-2.php).

Рис. 53. Результат использования логической связки AND в запросе.

Если использовать связку OR (ИЛИ), то получим результат, показанный на рис. 55.

Рис. 54. Использование логической связки OR в запросе.

Рис. 55. Результат использования логической связки OR в запросе.

Следующий аргумент, используемый в команде SELECT -- ORDER BY предназначен для сортировки результата запроса. Например, чтобы отсортировать результат запроса по полю  id  SQL запрос должен быть представлен в виде (рис. 56), тогда результат будет на рис. 57.

Рис. 56. Сортировка результата с помощью ORDER BY.

Рис. 57. Результат сортировки с помощью ORDER BY.

Обратите внимание на добавленную проверку (рис. 56) после . Использование проверки правильности исполнения запроса позволяет избежать нелепых ошибок.

Например, следующий запрос (рис. 58) даст результат (рис. 59).

Рис. 58. Неправильный синтаксис запроса.

Рис. 59. Перехват неправильного синтаксиса запроса.

DESC – предназначен для сортировки в обратном порядке.

Рис. 60. Предложение для формирования запроса в обратном порядке.

Рис. 61. Результат запроса с DESC.

Обратите внимание, что сортировка прошла по имени.

Использование аргумента LIMIT (рис. 62) позволяет ограничить число строк в результате запроса (рис. 63).

Рис. 62. Запрос с ограничением вывода только двух строк.

Рис. 63. Результат запроса с LIMIT


Тема 19 – INSERT.- Вставка информации в базу.

Цель:

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

Рис. 64. Синтаксис команды INSERT.

Для тестов инструкции по добавлению новой информации в таблицу базы банных создадим отдельный файл с именем mySQL_insert.

Путь C:\WebServers\home\localhost\www\php\mySQL_insert.php.

Рис. 65. Добавление нового тестового файла mySQL_insert.php.

Пусть исходное состояние файла Вы привели к  следующему виду (рис. 66).

На данном рисунке приведен только PHP код.

<?php

if (isset($_POST['dol']))

{$dol = $_POST['dol'];}

*/

$host = "localhost";

$user = "Mig"; //имя пользователя

$password = "12345"; //пароль пользователя

// Производим попытку подключения к серверу MySQL:

if (!$db=mysql_connect($host, $user, $password))

   {echo "<h2>MySQL Error!</h2>";  exit; }//неудача

// Выбираем базу данных:-mysql_select_db($db);

if (!$tb=@mysql_select_db("my_base",$db) )

 {echo "<p>К сожалению, не доступна база данных</p>";

   exit();}

echo "<h2>MySQL Сведения о сотрудниках</h2>";

// Выводим заголовок таблицы:

echo"<table border=\"1\" width=\"50%\" bgcolor=\"#FFFFE1\">";

echo "<tr><td>Номер_id</td><td>Имя</td><td>Фамилия</td>";

echo "<td>Должность</td>"; //td

//поле $id формируется автоматически и его можно не указывать

$result = mysql_query ("INSERT INTO lessons (Name,Lastname,Dol) VALUES ('Антон','Антонов','Ассистент')");

if ($result == 'true')

{echo "Информация в базу добавлена успешно!";}

else

{echo "Информация в базу не добавлена!";}

$sql = "SELECT * FROM lessons";

$q= mysql_query($sql,$db) or die("Запрос не выполнен: ". mysql_error());

for ($c=0; $c<mysql_num_rows($q); $c++)

{echo "<tr>";

$f = mysql_fetch_array($q);

echo "<td>$f[id]</td><td>$f[Name]</td><td>$f[Lastname]</td>";

echo "<td>$f[Dol]</td>";

echo "</tr>";}//конец цикла вывода таблицы

echo "</table>";

?>

Рис. 66. Исходный текст файла mySQL_insert.php.

Результат работы данного кода показан на рис. 67.

Внимание ! В дальнейшем нам потребуется код mySQL_insert.php, поэтому создайте его копию с именем mySQL_insert1.php

Рис. 67. Результат добавления новой записи в таблицу lessons.

Если все приведенные команды на рис. 66 были изучены ранее, то строки вида:

раскрывают суть команды INSERT INTO.

На практике информация  добавляется чаще всего с помощью форм.

Создадим файл с именем mysql_form.php следующего содержания (рис. 68 содержит только HTML код) для создания формы.

Рис. 68. Исходный текст файла mysql_form.php.

Сохраним файл C:\WebServers\home\localhost\www\php\ mysql_form.php и воспользуемся вкладкой  редактора для указания создания формы (рис. 69)

Рис. 69. Использование кнопки для вставки формы в текст файла mysql_form.php.

Нажатие на кнопке формы (рис. 69) приводит к следующему окну (рис. 70), содержимое полей которого надо привести к виду (рис. 71).

Рис. 70. Окно для описания характеристик формы ввода.

Рис. 71. Заполненное окно для описания характеристик формы ввода.

В результате нажатия в тело файла mysql_form.php будет вставлена следующая информация (рис. 72). Обратите внимание, что результаты ввода информации в форму будет файл mysql_insert1.php, а не mysql_insert.php 

Рис. 72. Вставка описания тела формы в код файла mysql_form.php.

Далее в теле формы необходимо описать все поля для таблицы Lessons, куда пользователь будет вводить информацию. Для описания этих полей – Name, Lastname, Dol (учитывая, что они у нас имеют текстовый формат) воспользуемся  кнопкой текстовых полей (рис. 73)

Рис. 73. Вставка описания поля в теле формы в код файла mysql_form.php.

Использование кнопки приводит к появлению окна (рис. 74),

Рис. 74. Вставка описания поля в теле формы в код файла mysql_form.php.

которое надо привести к виду (рис. 75)

Рис. 75. Вставка описания поля в теле формы в код файла mysql_form.php.

На рисунке 75 должна соответствовать фактической длине поля с именем Name, которая была указана при создании таблицы Lessons.

Подтверждая, что фактически на экране для поля Name будет отведено  только 17 символов, в теле программы mysql_form.php появятся следующие строки (рис. 76). Напомним, что указанное нами имя файла в , становится обработчиком создаваемой формы (предназначено для проверки корректности вводимой информации), если информация из файла mysql_form.php будет передано методом в файл .

Рис. 76. Вставка описания поля в теле формы в код файла mysql_form.php.

Далее в обведенной овалом информации (рис. 76) необходимо провести следующую модификацию (рис. 77).

Рис. 77. Вставка описания поля в теле формы в код файла mysql_form.php.

Далее в форму вставляется информация по полям Lastname и Dol (просто копируя или используя механизм, показанный на рис. 73) и приводится к виду, представленному на рис. 78.

Рис. 78. Вставка описания полей в теле формы в код файла mysql_form.php.

Если посмотреть созданную форму через закладку (рис. 79), то эскиз формы показан на рис. 80.

Рис. 79. Панель инструментов редактора.

Рис. 80. Эскиз формы.

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

Рис. 81. Эскиз формы.

Если посмотреть программы mysql_form.php (рис. 82), то проведенная автоматически редактором модификация (см. исходное состояние кода на рис. 78) просматривается достаточно легко.

Естественно, что информация в этом коде будет отсутствовать.

Рис. 82. Модифицированный код файла mysql_form.php.

Вставка Кнопки производится также просто (рис. 83), как и поля формы.

Рис. 83. Пиктограмма вставки кнопки.

Пусть нам необходимо в форму добавить кнопку вида (см. рис.88).

Нажатие на пиктограмме (маркер должен находиться в месте показанном на рис. 82) приводит к следующему окну (рис. 84)

Рис. 84. Состояние окна для выбора типа кнопки.

Если открыть список  на рис. 84 , то из него следует выбрать значение (рис. 85), что обозначает – Отправить.

Рис. 85. Типы кнопок.

В результате заполнения окна показанного на рис. 84 Вы должны получить окно следующего вида (рис.86) и сохранить его .

Рис. 86. Характеристики кнопки.

В результате в тело программы произойдет вставка информации, показанная на рис. 87.

Рис. 87. Измененный код mysql_form.php после вставки кнопки.

Если сохранить и запустить mysql_form.php, то результатом будет окно браузера показанное на рис. 88.

Рис. 88. Форма на экране.

Если в форму, показанную на рис. 88, пользователь ввел, например, следующую информацию (рис. 89):

Рис. 89. Форма с информацией.

Нажатие на приведет к следующему результату (рис. 90).

Результат получается следующим образом. В теле программы (рис.87) в форме указан обработчик на кнопку и имя этого обработчика определено на имени файла . Наличие указания для формы означает, что все объявленные в ней переменные должны быть сохранены в глобальном массиве POST ( -это тоже переменная и ее можно увидеть в массиве POST). Все это указано в строке: 

.

Рис. 90. Результат обработки события в программе mysql_insert1.php.

Далее приводится текст программы mysql_insert1.php (рис. 91) для обработки данных вводимых пользователем.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Соединяемся с БД</title>

</head>

<body>

<?php

//Защита от хостингов не поддерживающих прямую передачу

//переменных

if (isset($_POST['Name']))//если в глобальном есть Name

{$Name = $_POST['Name'];}//формируем локальную переменную

if (empty($Name)) { //  проверка на пустое значение переменной

   echo '$Name Пусто. Введите Имя ';

 exit; //выйти из программы

}

if (isset($_POST['Lastname']))

{$Lastname = $_POST['Lastname'];}

if (empty($Lastname)) { //  проверка на пустое значение переменной

   echo '$Lastname Пусто. Введите Фамилию ';

 exit; //выйти из программы

}

if (isset($_POST['Dol']))

{$Dol = $_POST['Dol'];}

if (empty($Dol)) { //  проверка на пустое значение переменной

   echo '$Dol Пусто. Введите должность ';

 exit; //выйти из программы

}

$host = "localhost";

$user = "Mig"; //имя пользователя

$password = "12345"; //пароль пользователя

// Производим попытку подключения к серверу MySQL:

if (!$db=mysql_connect($host, $user, $password))

   {echo "<h2>MySQL Error!</h2>";  exit; }//неудача

// Выбираем базу данных:-mysql_select_db($db);

if (!$tb=@mysql_select_db("my_base",$db) )

 {echo "<p>К сожалению, не доступна база данных</p>";

   exit();}

echo "<h2>MySQL Сведения о сотрудниках</h2>";

// Выводим заголовок таблицы:

echo"<table border=\"1\" width=\"50%\" bgcolor=\"#FFFFE1\">";

echo "<tr><td>Номер_id</td><td>Имя</td><td>Фамилия</td>";

echo "<td>Должность</td>"; //td

//$result = mysql_query ("INSERT INTO lessons //(Name,Lastname,Dol) VALUES //('Антон','Антонов','Ассистент')");

//теперь можно вводить информацию о любых, а не только об

//одном

$result = mysql_query ("INSERT INTO lessons (Name,Lastname,Dol) VALUES ('$Name','$Lastname','$Dol')");

if ($result == 'true')

{echo "Информация в базу добавлена успешно!";}

else 

{echo "Информация в базу не добавлена!";}

$sql = "SELECT * FROM lessons";

$q= mysql_query($sql,$db) or die("Запрос не выполнен: ". mysql_error());

for ($c=0; $c<mysql_num_rows($q); $c++)

{echo "<tr>";

$f = mysql_fetch_array($q);

echo "<td>$f[id]</td><td>$f[Name]</td><td>$f[Lastname]</td>";

echo "<td>$f[Dol]</td>";

echo "</tr>";}//конец цикла вывода таблицы

echo "</table>";

?>

</body>

</html>

Рис. 91. Исходный текст обработчика mysql_insert1.php.

Обработчик из глобального массива $_POST передает значения в локальные переменные

, , и .

Далее все идет как в обычной программе. Обратите внимание как записывается оператор INSERT:

Результат, показанный на рис. 90, также можно и через phpMyAdmin (рис. 92).

Рис. 92. Результат через phpMyAdmin.


Тема 20 - Оператор обновления – UPDATE.

Цель:

  •  Как изменять информацию, находящуюся в БД.
  •  Какой синтаксис имеет оператор UPDATE.
  •  Как формируется запрос к БД на изменение данных.

Рис. 93. Синтаксис команды UPDATE

Для изучения этой команды создадим тестовый файл с именем  mysql_update.php. Адрес нахождения файла как и у всех тестовых файлов

C:\WebServers\home\localhost\www\php\ mysql_update.php,

следующего содержания (показан только PHP код) рис. 94.

Рис. 94. Начальный текст программы mysql_update.php.

Показанный код должен изменить содержимое записи c id=5 (см. рис. 90) на результат, представленный на рис. 95.

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

 Поэтому листинг программы представленной программы на рис 94 необходимо привести, например, к виду показанному на рис. 96.

Рис. 95. Результат операции UPDATE.

Простейший вариант проверки правильности исполнения оператора UPDATE показан ниже. Достаточно подробный вариант использования этой операции представлен в файле C:\WebServers\home\localhost\www\php\ mysql_update.php.

Рис. 96. Модифицированный код файла mysql_update.php.


Тема 21 - Оператор удаления – DELETE.

Цель:

  •  Как удалять информацию, находящуюся в БД.
  •  Какой синтаксис имеет оператор DELETE.
  •  Как формируется запрос к БД на удаление данных.
  •  Перейти к форме заказа.

Рис. 97. Синтаксис команды DELETE.

Для изучения этой команды создадим тестовый файл с именем  mysql_update.php. Адрес нахождения файла как и у всех тестовых файлов

C:\WebServers\home\localhost\www\php\ mysql_delete.php.

Рис. 98. Текст PHP кода на удаление

Рис. 99. Результат работы программы показанной на рис. 98.

Физически в таблице будет удалена запись. Результат можно посмотреть либо через оболочку PhpMyAamin (рис. 100) или организовать вывод непосредственно в программе показанной на рис. 98.

Рис. 100. Состав таблицы после удаления записи.

По ссылке передается параметр, например  ?id=3

Рис. X54. Передача в ссылке параметра

Рис. X55. Пример

Рис. X56.

Рис. X57.

Рис. X58.

Рис. X59.

Рис. X60.


Приложение по использованным функциям.

do..while 

Циклы do..while очень похожи на циклы while, но условное выражение проверяется в конце каждой итерации, а не в начале. Главное отличие от регулярных циклов while состоит в том, что первая итерация цикла do..while всегда выполняется (условие проверяется только в конце итерации), а в цикле while этого может и не быть (условие проверяется в начале каждой итерации и, если вычисляется в FALSE сразу в начале, выполнение цикла немедленно прерывается).

Для циклов do..while существует один вариант синтаксиса: 

$i = 0;

do {

  print $i;

} while ($i>0);

Вышеприведённый цикл будет пройден точно один раз, поскольку после первого прохода проверка условного выражения даёт FALSE ($i не больше 0), и выполнение цикла завершается.

Продвинутые пользователи C могут быть знакомы с другим вариантом использования цикла do..while, когда разрешается остановка выполнения в середине блоков кода путём инкапсуляции их в do..while(0) и использования оператора break. Следующий фрагмент демонстрирует это:

do {

   if ($i < 5) {

       print "i is not big enough";

       break;

   }

   $i *= $factor;

   if ($i < $minimum_limit) {

       break;

   }

   print "i is ok";

    ...обработка i...

} while(0);

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

mysql_fetch_array

mysql_fetch_array - извлекает результирующий ряд как ассоциативный массив, числовой массив или и тот, и другой.

Описание

array mysql_fetch_array (resource result [, int result_type])

Возвращает массив, соответствующий извлечённому ряду, или FALSE, если рядов больше нет.

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

Если два или более столбцов результата имеют одинаковые имена полей, последний столбец имеет приоритет. Для доступа к другим столбцам с тем же именем вы обязаны использовать числовой индекс столбца или создать для столбца псевдоним. Для столбцов с псевдонимами вы не можете получить доступ к их содержимому через оригинальное имя столбца (в нашем примере, используя 'field').

Пример 1. Запрос с дублирующими именами полей

select table1.field as foo table2.field as bar from table1, table2

Важно подчеркнуть, что mysql_fetch_array() работает ненамного медленнее, чем mysql_fetch_row(), но предоставляет важное дополнительное значение.

Необязательный второй аргумент result_type в mysql_fetch_array() является константой и может иметь следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH. Это было добавлено в PHP 3.0.7. MYSQL_BOTH это значение по умолчанию данного аргумента.

Используя MYSQL_BOTH, вы получите массив с ассоциативными и числовыми индексами. Используя MYSQL_ASSOC, вы получите только ассоциативные индексы (как при работе mysql_fetch_assoc()). Используя MYSQL_NUM, вы получите только числовые индексы (как при работе mysql_fetch_row()).

Пример 2. mysql_fetch_array с MYSQL_NUM

<?php

   mysql_connect("localhost", "mysql_user", "mysql_password") or

       die("could not connect");

   mysql_select_db("mydb");

   $result = mysql_query("SELECT id, name FROM mytable");

   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

       printf ("ID: %s  Name: %s", $row[0], $row[1]);  

   }

   mysql_free_result($result);

?>

Пример 3. mysql_fetch_array с MYSQL_ASSOC

<?php

   mysql_connect("localhost", "mysql_user", "mysql_password") or

       die("could not connect");

   mysql_select_db("mydb");

   $result = mysql_query("SELECT id, name FROM mytable");

   while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

       printf ("ID: %s  Name: %s", $row["id"], $row["name"]);

   }

   mysql_free_result($result);

?>

Пример 4. mysql_fetch_array с MYSQL_BOTH

<?php

   mysql_connect("localhost", "mysql_user", "mysql_password") or

       die("could not connect");

   mysql_select_db("mydb");

   $result = mysql_query("SELECT id, name FROM mytable");

   while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {

       printf ("ID: %s  Name: %s", $row[0], $row["name"]);

   }

   mysql_free_result($result);

?>

Детали см. в mysql_fetch_row() и mysql_fetch_assoc().

mysql_fetch_row

(PHP 3, PHP 4)

mysql_fetch_row - получает результирующий ряд как перечислимый массив.

Описание

array mysql_fetch_row (resource result)

Возвращает массив, соответствующий извлечённому ряду, или FALSE, если рядов больше нет.

mysql_fetch_row() извлекает один ряд данных из результата, ассоциированного со специфицированным идентификатором результат. Ряд возвращается как массив. Каждый результирующий столбец хранится как смещение массива, начиная со смещения 0.

Последующий вызов mysql_fetch_row() возвратит следующий ряд результирующего набора или FALSE, если рядов больше нет.

См. также mysql_fetch_array(), mysql_fetch_object(), mysql_data_seek(), mysql_fetch_lengths() и mysql_result().

mysql_fetch_assoc

(PHP 4 >= 4.0.3)

mysql_fetch_assoc - извлекает ряд результата как ассоциативный массив.

Описание

array mysql_fetch_assoc (resource result)

Возвращает ассоциативный массив, соответствующий извлечённому ряду, или FALSE, если рядов больше нет.

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

Если два или более столбца результата имеют одинаковые имена полей, последний столбец имеет преимущество. Для доступа к другим столбцам с тем же именем вам нужно получать доступ к результату через числовые индексы с помощью mysql_fetch_row(), либо добавить псевдонимы имён. См. пример в описании mysql_fetch_array().

Важно отметить, что mysql_fetch_assoc() работает ненамного медленнее, чем mysql_fetch_row(), но предоставляет важное дополнительное значение.

Пример 1. mysql_fetch_assoc()

<?php

   mysql_connect("localhost", "mysql_user", "mysql_password");

   mysql_select_db("mydb");

   $query = "select * from table";

   $result = mysql_query($query);

   while ($row = mysql_fetch_assoc($result)) {

       echo $row["user_id"];

       echo $row["fullname"];

   }

   mysql_free_result($result);

?>

echo

(unknown)

echo - выводит одну или более строк.

Описание

echo (string arg1 [, string argn...])

Выводит все параметры.

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

Пример 1. echo()

<?php

echo "Hello World";

echo "Этот текст занимает

несколько строчек. Символы новой строки

также выводятся.";

echo "Этот текст занимает\nнесколько строчек. Символы новой строки\nтакже выводятся.";

echo "Escap-ирование символов проведено \"Вроде этого\".";

//Вы можете использовать внутри операции echo переменные.

$foo = "foobar";

$bar = "barbaz";

echo "foo is $foo"; // foo это foobar

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

echo 'foo is $foo'; // foo это $foo

// Если вы не используете никакие иные символы, вы можете просто echo переменные

echo $foo;          // foobar

echo $foo,$bar;     // foobarbarbaz

echo <<<END

Здесь использован синтаксис "here document" для вывода

нескольких строк с интерполяцией $variable. Заметьте, что

терминатор here document обязан появляться в строке

с символом "точка с запятой" без пробела!

END;

// Поскольку echo это не функция, следующий код - неправильный.

($some_var) ? echo('true'): echo('false');

// Однако следующий пример будет работать:

($some_var) ? print('true'): print('false'); // print это функция

echo $some_var ? 'true': 'false'; // изменение оператора

?>

echo() также имеет сокращённый синтаксис, где сразу после открывающего тэга идёт знак "равно". 

I have <?=$foo?> foo.

Примечание: этот сокращённый синтаксис работает только при включённой установке конфигурации short_open_tag.

См. также print(), printf() и flush().

print

(unknown)

print - выводит строку.

Описание

print (string arg)

Выводит arg. Возвращает TRUE при успехе, FALSE при неудаче.

print() это в действительности не функция (а конструкция языка), поэтому с ней не обязательно использовать скобки. Но print(), в отличие от echo(), может вызываться с использованием функции переменной.

Пример 1. print()

<?php

print("Hello World");

print "print() работает также без скобок.";

print "Это захватывает

несколько строчек. Символы newline также

будут выведены";

print "Это захватывает\nнесколько строчек. Символы newline будут также\nвыведены.";

print "мнемонизация символов выполняется \"Как здесь\".";

// Вы можете использовать переменные внутри оператора print

$foo = "foobar";

$bar = "barbaz";

print "foo is $foo"; // foo это foobar

// Использование одинарных кавычек напечатает имя переменной, а не её значение

print 'foo is $foo'; // foo это $foo

// Если вы не используете другие символы, вы можете просто печатать переменные

print $foo;          // foobar

print <<<END

Это используется синтаксис "here document" для вывода нескольких строчек

с интерполяцией $variable. Обратите внимание на то, что

терминатор here document обязан появиться в строчке

с последующей точкой с запятой без разделения пробелом!

END;

?>

См. также echo(), printf() и flush().

printf

printf - выводит форматированную строку.

Описание

void printf (string format [, mixed args])

Создаёт вывод в соответствии с format, который описан в документации к sprintf().

См. также print(), sprintf(), sscanf(), fscanf() и flush().

flush

flush - очищает буфер вывода.

Описание

void flush (void)

Очищает буфер вывода PHP и всё используемое PHP (CGI, web-сервер и т.д.). Она активно пытается выдать весь вывод в браузер пользователя.

Примечание: flush() не действует на схему буферизации вашего web-сервера или браузера - на стороне клиента.

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

Серверные модули для Apache, вроде mod_gzip, могут сами выполнять буферизацию, что не даст немедленной пересылки данных из функции flush() клиенту.

Даже браузер может буферизовать свой ввод до отображения. Netscape, например, буферизует текст, пока не получит end-of-line или начало тэга, и не будет отображать таблицы, пока не увидит тэга </table> самой внешней таблицы.

Некоторые версии Microsoft Internet Explorer начинают отображать страницу только после получения 256 байт вывода, поэтому вам может понадобиться отправить дополнительные пробелы перед очисткой, чтобы такие браузеры вывели страницу.


Приложение к лекции.

Текст файла Function.php.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Стандартные функции</title>

</head>

<body>

<table border=\"1\" width=\"70%\">

 <tr>

<th>Тест сооединения с MySQL и с базой</th><th>My_base </th>

</tr>

<?php

   $db = mysql_connect("localhost","Mig","12345");

 if (!$db)

 { echo "<p>К сожалению, не доступен сервер mySQL</p>";

   exit(); //выход из программы

 }

 echo "<table border=\"1\" width=\"70%\" >";

 echo ("Доступен! Сервер mySQL Ресурс ".$db);

 echo "<br>mysql_errno ".mysql_errno().",mysql_error ".mysql_error()."\n";

 

 if (! $tb=@mysql_select_db("my_base",$db) )

 {

   echo "<p>К сожалению, не доступна база данных</p>";

   exit();

 }

  echo ("<BR>Доступна база.Ее handler= $tb имя=my_base");

 $result = mysql_query ("SELECT id, Name, Lastname,Dol  FROM lessons",$db);

  echo ("<BR>Доступна таблица.Ее handler= $result имя=Lessons");

print (" <tr>\n".

"<td>Идентификатор</td>\n"."<td>Имя</td>\n".

 "<td>Фамилия</td>\n"."<td>Должность</td>\n"." </tr>\n");

while(list($id,$Name,$Lastname,$Dol)=mysql_fetch_row($result))

{     print (" <tr>\n".

          "  <td>$id</td>\n".

    "  <td>$Name</td>\n".

          "  <td>$Lastname</td>\n".

    "  <td>$Dol</td>\n"." </tr>\n");

}// конец тела цикла

 echo "</table>";

 //exit();

echo "<br>";

$q = mysql_query("SELECT * FROM lessons");

$db = mysql_connect("localhost","Mig","12345");

echo("Еще раз mysql_connect Доступен! Сервер mySQL $db ");

echo("<BR>Доступна таблица.Ее handler= $result ");

$res = mysql_list_fields("my_base","lessons");

echo "<TABLE BORDER=1>";

echo "<TR>";//Вывод шапки

for ($i = 0; $i < mysql_num_fields($res); $i++)

{ echo "<TH>";

     echo mysql_field_name($res,$i);

  echo "</TH>"; }//конец for

$fields=mysql_num_fields($res);//вывод содержимого таблицы

$sql = "SELECT * FROM lessons";

$q = mysql_query($sql);

while ($row = mysql_fetch_row($q))

{  echo "<TR>";

 for ($i = 0; $i < $fields; $i++)

  {    echo "<TD>".$row[$i]."</TD>";   }

 echo "</TR>";}//Цикл вывода закончился

echo "</TR></TABLE>";

exit(); //Контрольная точка теста

mysql_close($db);

 $dbb = mysql_connect("localhost","Mig","12345");

echo ("<BR>Закрыли и вновь открыли Сервер mySQL $dbb ");

$q = mysql_query($sql);

echo ("<BR>Доступна таблица.Ее handler= $result           имя=Lessons");

 echo "<br>ERROR ".mysql_errno().",mysql_error ".mysql_error()."\n";

echo "<br>В таблице Lessons ".mysql_num_rows($q)." записей";

 

while ($row = mysql_fetch_row($q))

{ echo "<TR>";

 for ($i = 0; $i < $fields; $i++)

  {

   echo "<TD>".$row[$i]."</TD>";

  }

 echo "</TR>";

}//Цикл вывода закончился

echo "</TR></TABLE>";

echo "<pre>";

$tb=@mysql_select_db("my_base",$dbb);

$q = mysql_query($sql);

$rows = mysql_num_rows($q);

$fields = mysql_num_fields($q);

echo ("<BR>Запрос выполнен.Его handler= $q ")."\n";

 for ($c=0; $c<$rows; $c++) {

    for ($cc=0; $cc<$fields; $cc++) {

    echo mysql_result($q, $c, $cc)."\t";

 //echo mysql_result($q, $c, $cc);

    echo "\n";

    }

 }

echo "</pre>";

$q = mysql_query($sql);

for ($c=0; $c<mysql_num_rows($q); $c++)

{

$f = mysql_fetch_array($q);

echo "$f[id] $f[Lastname] $f[Dol] <br>";

}

?>

</table>

</body>

</html>

PAGE  1


 

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

7377. Разработка бизнес-плана СТО 269 KB
  Разработка бизнес-плана СТО Резюме. Основным назначением первого и второго технических обслуживании является снижение интенсивности изнашивания деталей, выявление и предупреждение отказов и неисправностей путем своевременного выполнения контрольно-...
7378. Бурение нефтяных и газовых скважин 171 KB
  Бурение нефтяных и газовых скважин I. Техническая часть Характеристика и краткое описание устройств Буровые установки и сооружения Процесс бурения сопровождается спуском и подъемом бурильной колонны в скважину, а также поддержанием ее на весу. Масса...
7379. Розробка економічного обґрунтування доцільності відкриття нового ТОВ «Господарочка» в м. Черкаси 267.5 KB
  Кожна фірма, починаючи своєю діяльність, зобов\'язана чітко усвідомити потребу у перспективі, матеріальних, трудових і інтелектуальних ресурсах, джерелах їх отримання, і, навіть, вміти точно розраховувати ефективність використання наявних ресурсів своєї фірми. У ринковій економіці підприємці неспроможні домогтися стабільного успіху, якщо нечітко й неефективно планували свою діяльність.
7380. Изучение модуля процессора событий TIM08, и модуля таймера базового времени TMB08 251.5 KB
  Изучение модуля процессора событий TIM08, и модуля таймера базового времени TMB08 Цель работы: Изучить подсистему реального времени микропроцессора. Освоить методику выбора тактирующей последовательности и порядок программирования синт...
7381. Ведение бухгалтерского учета на практике в программе 1С: Бухгалтерия 226.5 KB
  Учетная политика предприятия - это совокупность способов ведения бухгалтерского и налогового учета, выбранная предприятием из различных вариантов, допускаемых законодательством. Поскольку существует некоторая свобода выбора, то, очевидно
7382. Выбор диодов СВЧ для конкретного применения. КР 795.5 KB
  Диоды арсенидогаллиевые, планарно-эпитаксиальные, параметрические. Предназначены для применения в параметрических усилителях сантиметрового диапазона длин волн. Выпускаются в металлическом корпусе с жесткими выводами.
7383. Эластичность спроса по ценам, доходам, перекрестная эластичность 204.08 KB
  Введение. Экономическая наука призвана определять, как максимально эффективно использовать ограниченные ресурсы - природные запасы, капиталы, трудовые резервы. Подробно всем другим отраслям знаний, экономика включает набор аксиом и доказательств, пр...
7384. Линейная алгебра и аналитическая геометрия 528 KB
  Линейная алгебра и аналитическая геометрия Задача 1. Дана система трех линейных уравнений. Найти решение ее двумя способами: методом Крамера и методом Гаусса. Решение методом Крамера. Запишем формулы Крамера...
7385. Космические и наземные системы радиосвязи и сети телерадиовещания. Проект цифровой радиорелейной линии 905 KB
  Космические и наземные системы радиосвязи и сети телерадиовещания Проект цифровой радиорелейной линии Введение Технология цифровых радиорелейных линий в настоящее время достигла высокого качественного и количественного развития. Сегодня радиорелейны...