Александр Качанов

Вадим Ткаченко

Андрей Головин

Надежда Орлова

Работа с базами данных (на примере PHP и MariaDB)

Работа с MariaDB (вывод данных из базы данных). Часть I

Работа с MariaDB (вывод данных из базы данных). Часть II

Работа с MariaDB (вывод данных из базы данных). Часть III

Создаем ссылки на лету

Работа с MariaDB (сохранение данных в базе данных)

Пример создания законченного приложения

Работа с MariaDB (вывод данных из базы данных). Часть I

Для понимания этой главы от вас требуются крепкие знания языка SQL и принципов работы баз данных. Для начала создаем таблицу. Скопируйте на D:\Students\ папку HeidiSQL_10.1_64_Portable из \\Fileserver.rseu.ru\users$\Orlova\Пособия. Запускаем файл heidisql. На запрос системы об открытии сессии создаем новую или используем ранее созданную.

Параметры сессии:

Имя хоста / IP: 172.16.0.4, Порт: 3306.

Пользователь: student, Пароль: 12345678, База данных: Student

Нажимаем Открыть.

В базе данных student создаем таблицу employeesN (N - обеспечивает уникальность таблицы для каждого студента и включает код группы, подгруппы, номер студента по списку преподавателя) и/или выполняем команды:

CREATE TABLE employeesN (id tinyint(4) NOT NULL auto_increment,
first varchar(20) default '0',
last varchar(20) default NULL,
address varchar(255) default NULL,
position varchar(50) default NULL,
PRIMARY KEY (id),
UNIQUE KEY id (id));

INSERT INTO employees VALUES("1", "Bob", "Smith", "127 Here St, Cityname", "Marketing Manager");
INSERT INTO employees VALUES("2", "John", "Roberts", "45 There St, Townville", "Телефонист");
INSERT INTO employees VALUES("3", "Brad", "Johnson", "1/34 Nowhere Blvd, Snowston", "Doorman");

В результате у нас будет создана таблица employees (сотрудники). И в эту таблицу будут вставлены три записи с данными о сотрудниках. Для экспериментов с PHP и MariaDB этого вполне достаточно.

Давайте выведем эти данные из базы данных в HTML-страницу. Для общения с MariaDB из PHP понадобятся следующие функции.

int mysql_connect(string hostname, string username, string password);

Создать соединение с MariaDB.

Параметры:

Hostname – имя хоста, на котором находится база данных.

Username – имя пользователя.

Password – пароль пользователя.

Функция возвращает параметр типа int, который больше 0, если соединение прошло успешно, и равен 0 в противном случае.

int mysql_select_db(string database_name, int link_identifier);

Выбрать базу данных для работы.

Параметры:

Database_name – имя базы данных.

link_identifier – ID соединения, которое получено в функции mysql_connect. (параметр необязательный, если он не указывается, то используется ID от последнего вызова mysql_connect)

Функция возвращает значение true или false

int mysql_query(string query, int link_identifier);

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

Параметры:

query – строка, содержащая запрос link_identifier – см. предыдущую функцию.

Функция возвращает ID результата или 0, если произошла ошибка.

int mysql_result(int result, int i, column);

Функция возвращает значение поля в столбце column и в строке i.

int mysql_close(int link_identifier);

Функция закрывает соединение с MariaDB.

Параметры:

link_identifier – см. выше.

Функция возвращает значение true или false

Создайте файл с именем MariaDB.php и наберите в нем следующий текст и сохраните домашнем каталоге IIS:

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
$result=mysql_query("select * from employees", $db);
printf("Имя: %s<br>\n", mysql_result($result,0,"first"));
printf("Фамилия: %s<br>\n", mysql_result($result,0,"last"));
printf("Адрес: %s<br>\n", mysql_result($result,0,"address"));
printf("Должность: %s<br>\n", mysql_result($result,0,"position"));
mysql_close($db);
?>
</body>
</html>

Проверьте работу, введя в адресной строке браузера http://localhost/MariaDB.php.

Теперь рассмотрим построчно, что происходит в этой программе. Функция mysql_connect() открывает связь с сервером баз данных MariaDB. В качестве параметров мы указываем ей имя узла (university), на котором находится база данных, имя пользователя (student), под которым мы будем с ней работать, и пароль (12345678).

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

В результате выполнения этой функции получаем некое значение, которое присваиваем переменной $db. Эта переменная называется идентификатором соединения (см. выше описание синтаксиса).

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

В результате выполнения функции mysql_select_db() мы получаем значение true или false. Если соединение с базой данных произошло успешно – true, если нет – false. Для того, чтобы наша программа-страница работала более интеллектуально, мы можем при желании проанализировать возвращаемое значение и если оно будет false, вывести хорошее информативное сообщение об ошибке. Как это делается, мы рассмотрим в других, более сложных примерах.

И наконец мы обращаемся к базе данных с запросом, написанным на языке SQL. Для этого служит функция mysql_query(). В качестве первого параметра мы передаем текст запроса, а в качестве второго – "скармливаем" идентификатор, полученный от выполнения функции mysql_connect().

Результаты выполнения функции mysql_query() – записи, удовлетворяющие нашему запросу -помещаем в переменную $result.

И наконец, с помощью функции mysql_result() извлекаем из результатов выполнения нашего запроса (т.е. переменной $result), первый ряд-запись (который имеет порядковый номер 0), и значение определенного поля (по его имени). Перебирая друг за другом записи от 0 до 2, мы выберем все записи, что хранятся в нашей маленькой базе данных.

В данном коде в полной мере используется функция printf(). Если говорить коротко, то в каждой приведенной выше строке комбинация символов "%s" обозначает, что вместо нее должна быть поставлена переменная, идущая во второй части выражения printf. Причем эта переменная должна быть переведена в тип "строковая переменная".

Вот так легко можно работать с базой данных в PHP.

Далее мы познакомимся с более интеллектуальными, чем mysql_result(), функциями выборки данных из БД mysql_fetch_row() и mysql_fetch_array(), В дальнейшем мы рекомендуем пользоваться именно ими, как более быстрыми и удобными, чем mysql_result().

Работа с MariaDB (вывод данных из базы данных). Часть II

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

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
$result=mysql_query("select * from employees", $db);
echo "<table border=1>\n";
echo "<tr><td>Name</td><td>Position</tr>\n";
while ($myrow= mysql_fetch_array($result))
{
printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], $myrow[2], $myrow[4]);
}
echo "</table>\n";
?>
</body>
</html>

Вы вероятно заметили, что в данном коде вы ввели несколько новых функций и конструкций. Наиболее очевидной из них является цикл while(). Цикл говорит, что до тех пор, пока в переменной $result остается запись для выборки, ее необходимо извлечь с помощью функции mysql_fetch_row и присвоить переменной $myrow. А после этого выполнить код, что расположен внутри фигурных скобок "{}". Приглядитесь к коду внимательнее и разберитесь в этой конструкции.

Для понимания этого кода разберем понятие "массив". Выполнение функции mysql_query дает в результате массив, который хранится в переменной $result. Если представить этот массив схематически, то он будет выглядеть так:

 

0

id

1

first

2

last

3

address

4

position

Порядковый № элемента массива
$result= 1 Bob Smith 127 Here St, Cityname Marketing Manager 0
  2 John Roberts 45 There St, Townville Телефонист 1
  3 Brad Johnson 1/34 Nowhere Blvd, Snowston Doorman 2

Переменная $result является массивом. Причем не простым массивом, а двумерным. В нем содержатся три строки с номерами от 0 до 2. каждая из которых содержит 5 столбцов от 0 до 4. Для того, чтобы вывести на странице все записи, нам надо пройти от 0-й строчки массива до 2-й. Лучше всего это делать в цикле с помощью функции mysql_fetch_row (которая в переводе буквально означает – "выбрать ряд").

Функции mysql_fetch_row в качестве параметра подается массив $result. Функция выбирает из него строку, которую мы можем записать в переменную $myrow и автоматически переходит на следующую строку. Вызвав снова mysql_fetch_row, мы выберем следующую строку из массива, и так далее до тех пор, пока не достигнем конца массива. В этом случае mysql_fetch_row вернет значение false, которое послужит нам сигналом, что все записи выбраны и можно завершить цикл.

Теперь наша задача как-то вывести в теле цикла полученную запись. Выбранный ряд у нас хранится в переменной $myrow. Она также, как и $result, является массивом, только одномерным. Схематически это выглядит так:

 

0

id

1

first

2

last

3

address

4

position

Порядковый № элемента массива
$myrow= 1 Bob Smith 127 Here St, Cityname Marketing Manager 0

А вот как будет выглядеть содержимое переменной $myrow при втором прохождении цикла:

 

0

id

1

first

2

last

3

address

4

position

Порядковый № элемента массива
$myrow= 2 John Roberts 45 There St, Townville Телефонист 1

И наконец, при третьем:

 

0

id

1

first

2

last

3

address

4

position

Порядковый № элемента массива
$myrow= 3 Brad Johnson 1/34 Nowhere Blvd, Snowston Doorman 2

К каждому столбцу в массиве $myrow мы можем обратиться по его порядковому номеру, который заключается в квадратные скобки. Например, в первом цикле, $myrow[1] равно "Bob", во втором $myrow[4] равно " Телефонист".

На первый взгляд процедура извлечения данных весьма сложна, но она вполне логически понятна и объяснима. Главное не забывайте, что элементы массивов нумеруются от 0, а не от 1, так как здесь мы имеем дело с компьютерной, а не человеческой логикой.

Далее, вывод переменных в HTML с помощью функции printf() – дело техники, уже знакомой нам по предыдущему примеру.

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

Работа с MariaDB (вывод данных из базы данных). Часть III

Взгляните на следующий код:

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
$result=mysql_query("select * from employees", $db);
if ($myrow= mysql_fetch_array($result))
{
echo "<table border=1>\n";
echo "<tr><td>Name</td><td>Position</tr>\n";
do
{
printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow["first"], $myrow["last"], $myrow["address"]);
}
while ($myrow=mysql_fetch_array($result));
echo "</table>\n";
}
else
{
echo "Записи не найдены!";
}

?>
</body>
</html>

В данном коде мы опять ввели некоторые новые понятия, но они достаточно просты. Во-первых, вместо функции mysql_fetch_row() мы использовали функцию mysql_fetch_array(). Она работает точно так же, как и mysql_fetch_row() за одним замечательным исключением: с помощью этой функции мы можем обращаться к каждому полю массива не по номеру, а по имени. Например, если раньше для получения имени нам приходилось писать $myrow[1] (1 – второй столбец массива), то теперь мы можем писать $myrow["first"] ("first" – название столбца в базе данных и в массиве). Второй вариант естественно гораздо информативнее и удобнее.

Кроме этого, в коде использован цикл do/while и условная конструкция if-else.

Выражение if-else говорит, что если мы можем присвоить значение $myrow, то надо начать выборку, в противном случае мы понимаем, что записей нет, переходим к блоку else и выводим соответствующее сообщение. Чтобы проверить, как работает эта часть кода, замените SQL-выражение на "SELECT * FROM employees WHERE id=6" или на какое-нибудь другое, которое не даст результата.

Цикл do/while – это всего лишь вариант цикла while(), который мы использовали в предыдущем примере. Мы обратились за помощью к циклу do/while по одной простой причине. В конструкции if мы уже сделали выборку первого ряда и присвоили его переменной $myrow. Если бы мы сейчас воспользовались прежней конструкцией (т.е. while ($myrow = mysql_fetch_row($result)), мы бы затерли значения первой выбранной записи, заменив ее значениями второй записи. В случае же с циклом do/while мы проверяем условие после того, как код цикла выполнится по крайней мере один раз. Таким образом, ни одна запись не ускользнет из наших рук.

А сейчас давайте сделаем код в цикле и if-else конструкцию еще более красивым.

Создаем ссылки на лету

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

<a href="http://localhost/mypage.php?id=1">

Сейчас мы научимся создавать такие ссылки на лету.

Для начала, давайте обратимся к базе данных и выведем список персонала. Взгляните на следующий код. Многое в нем вам будет знакомо. Создайте файл с именем mysql2.php и наберите в нем следующий текст и сохраните домашнем каталоге IIS:

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
$result=mysql_query("select * from employees", $db);
if ($myrow= mysql_fetch_array($result))
{

do
{
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", "http://localhost/mysql2.php", $myrow["id"], $myrow["first"], $myrow["last"]);
}
while ($myrow=mysql_fetch_array($result));
}
else
{
echo "Записи не найдены!";
}

?>
</body>
</html>

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

Далее, в коде используется ссылка вызвающая страницу из нее самой. То есть вместо того, чтобы делать две страницы, содержащие разные коды для разных действий, мы все действия запихнули в одну страницу. С помощью условий if-else мы будем переводить стрелки с одного кода на другой, гоняя одну и ту же страницу по кругу. Это конечно увеличит размер страницы и время, необходимое на ее обработку, но в некоторых случая, такой трюк очень удобен.

Как мы уже сказали, ссылки, сгенерированные в цикле ссылаются на ту же самую страницу, только к имени самой страницы на лету добавлена некоторая информация: переменные и их значения. Переменные, которые передаются в строке-ссылке, автоматически создаются PHP-движком, и к ним можно обращаться так, как если бы вы их создавали в коде сами. При втором проходе страницы наша программа отреагирует на эти пары name=value и направит ход исполнения на другие рельсы. В данном случае мы проверим, есть ли переменная $id, и в зависимости от результата выполним тот или иной код. Вот как это будет выглядеть. Создайте файл с именем mypage.php и наберите в нем следующий текст и сохраните домашнем каталоге IIS

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");

if ($_GET["id"]) {

$a=$_GET["id"];
$sql="SELECT * FROM employees WHERE id='$a'";
$result=mysql_query($sql);
$myrow=mysql_fetch_array($result);
printf("First name: %s<br>\n", $myrow["first"]);
printf("Last name: %s<br>\n", $myrow["last"]);
printf("Address: %s<br>\n", $myrow["address"]);
printf("Position: %s<br>\n", $myrow["position"]);
} else {
$result=mysql_query("SELECT * FROM employees",$db);
if ($myrow=mysql_fetch_array($result))
{
do
{
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", "http://localhost/mypage.php", $myrow["id"], $myrow["first"], $myrow["last"]);
}
while ($myrow=mysql_fetch_array($result));
}
else
{
echo "Записей нет!";
}
}
?>
</body>
</html>

Код усложнился, поэтому мы добавили в него некоторые комментарии, чтобы он стал яснее. Для однострочных комментариев можно использовать символы //. Если комментарий нужно уместить на нескольких строчках, используйте скобки /* … */.

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

Работа с MariaDB (сохранение данных в базе данных)

Мы научились извлекать данные из базы и выводить их на странице. Теперь давай попробуем осуществить обратное действие. С PHP это не составит большого труда. Создадим простую форму. Создайте файл с именем formenter.php и наберите в нем следующий текст и сохраните домашнем каталоге IIS

<html>
<body>
<form action="formenter.php" method="POST">
Имя: <input type="text" name="first"><br>
Фамилия: <input type="text" name="last"><br>
Адрес: <input type="text" name="address"><br>
Должность: <input type="text" name="position"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
</body>
</html>

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

Помимо этого мы присвоили имя кнопке Submit. Это сделано для того, чтобы в коде затем проверить, есть ли переменная $submit. Таким образом, когда страница будет вызываться, мы будем узнавать, вызывается ли она в первый или во второй раз.

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

Итак, давайте добавим код, который будет проверять, введены ли в форму данные. Пока это будет лишь простая проверка, при которой все переменные, передаваемые странице, будут выводиться на экран с помощью переменной $_POST. Эта переменная удобна в случае отладки. Если вы хотите вывести на экран вообще все переменные, используемые в странице, вызовите переменную $GLOBALS. Отредактируйте файл formenter.php следующим образом:

<html>
<body>
<?
if ($_POST["submit"]) {
while (list($name, $value)=each($_POST)) {
echo "$name=$value<br>\n";
}
} else {
?>
<form action="formenter.php" method="POST">
Имя: <input type="text" name="first"><br>
Фамилия: <input type="text" name="last"><br>
Адрес: <input type="text" name="address"><br>
Должность: <input type="text" name="position"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
<?
}
?>
</body>
</html>

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

<html>
<body>
<?
if ($_POST["submit"]) {
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
$a=$_POST['first'];
$b=$_POST['last'];
$c=$_POST['address'];
$d=$_POST['position'];
$sql="INSERT INTO employees (first,last,address,position) VALUES ('$a','$b','$c','$d')";
$result=mysql_query($sql);
echo "Спасибо! Информация занесена!\n";
} else {
?>
<form action="formenter.php" method="POST">
Имя: <input type="text" name="first"><br>
Фамилия: <input type="text" name="last"><br>
Адрес: <input type="text" name="address"><br>
Должность: <input type="text" name="position"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
<?
}
?>
</body>
</html>

Мы внесли данные в базу. Тем не менее наш код далек от идеального. Что случится, если при заполнении формы кто-то оставит пустые поля или введет текст в поле, в которое надо ввести число? Что произойдет, если в поданных данных будет ошибка? Не беспокойтесь. Сейчас мы все исправим.

Мы записывали SQL-выражение в переменную ($sql), прежде чем передать запрос в базу данных через функцию mysql_query(). Это делается на случай отладки. Если что-то пойдет не так, мы всегда сможем вывести интересующее нас SQL-выражение на экран и проверить, нет ли в нем ошибок.

Мы уже знаем, как вставлять данные в базу. Теперь давайте научимся менять записи, которые уже находятся в таблице. Редактирование данных сочетает в себе два кода. Которые мы уже проходили: извлечение данных из базы с выводом их на экран, и внесение данных через форму обратно в базу. Тем не менее программа правки данных немного отличается тем, что мы в форме должны вывести некую конкретную запись. Для начала давайте воспользуемся кодом из предыдущих примеров, для вывода списка служащих на экран. Однако теперь информацию о служащих мы будет отображать в форме. Код страницы будет выглядеть так:

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");
if ($_GET["id"]) {
$a=$_GET["id"];
$sql="SELECT * FROM employees WHERE id=$a";
$result=mysql_query($sql);
$myrow= mysql_fetch_array($result);
?>
<form action="formenter.php" method="POST">
<input type=hidden name="id" value="<?echo $myrow["id"] ?>">
Имя: <input type="text" name="first" value="<?echo $myrow["first"]?>"><br>
Фамилия: <input type="text" name="last" value="<?echo $myrow["last"]?>"><br>
Адрес: <input type="text" name="address" value="<?echo $myrow["address"]?>"><br>
Должность: <input type="text" name="position" value="<?echo $myrow["position"]?>"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
<?}
else
{
$result=mysql_query("select * from employees", $db);
while ($myrow= mysql_fetch_array($result))
{
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", "http://localhost/formenter.php", $myrow["id"], $myrow["first"], $myrow["last"]);
}
}

?>
</body>
</html>

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

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");

if ($_GET["id"]) {
if ($_GET["submit"]) {
$a=$_GET['first'];
$b=$_GET['last'];
$c=$_GET['address'];
$d=$_GET['position'];
$e=$_GET['id'];
$sql="UPDATE employees SET first='$a',last='$b',address='$c',position='$d' WHERE id='$e'";
$result=mysql_query($sql);
echo "Спасибо! Информация изменена.\n";
}
else
{
$e=$_GET['id'];
$sql="SELECT * FROM employees WHERE id='$e'";
$result=mysql_query($sql);
$myrow=mysql_fetch_array($result);
?>
<form action="formenter.php" method="GET">
<input type=hidden name="id" value="<?echo $myrow["id"] ?>">
Имя: <input type="text" name="first" value="<?echo $myrow["first"]?>"><br>
Фамилия: <input type="text" name="last" value="<?echo $myrow["last"]?>"><br>
Адрес: <input type="text" name="address" value="<?echo $myrow["address"]?>"><br>
Должность: <input type="text" name="position" value="<?echo $myrow["position"]?>"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
<?
}
} else {
$result=mysql_query("select * from employees", $db);
while ($myrow= mysql_fetch_array($result))
{
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", "http://localhost/formenter.php", $myrow["id"], $myrow["first"], $myrow["last"]);
}
}
?>
</body>
</html>

Вот так. Нам удалось вместить все, что мы знаем и умеем в один код. Здесь вы можете увидеть, как мы используем выражение if() внутри другого выражения if() для последовательно проверки нескольких условий.

Теперь пришло время свести все вместе и создать одну супер-крутую PHP-страницу.

<html>
<body>
<?
$db=mysql_connect("university", "student", "12345678");
mysql_select_db("student",$db);

mysql_query("SET NAMES cp1251");

if ($_GET["submit"]) {

if ($_GET["id"]) {
$a=$_GET['first'];
$b=$_GET['last'];
$c=$_GET['address'];
$d=$_GET['position'];
$e=$_GET['id'];
$sql="UPDATE employees SET first='$a',last='$b',address='$c',position='$d' WHERE id='$e'";
echo "Спасибо! Информация изменена.\n";
echo $_FILES['userfile']['error'];
}
else
{
$a=$_GET['first'];
$b=$_GET['last'];
$c=$_GET['address'];
$d=$_GET['position'];
$sql="INSERT INTO employees (first,last,address,position) VALUES ('$a','$b','$c','$d')";
}
$result=mysql_query($sql);
echo "Запись изменена\отредактирована!";
} elseif ($_GET['delete']) {
$e=$_GET['id'];
$sql="DELETE FROM employees WHERE id='$e'";
$result=mysql_query($sql);
echo "$sql Запись удалена!";
} else {
if (!$_GET["id"]) {
$result=mysql_query("SELECT * FROM employees",$db);
while ($myrow=mysql_fetch_array($result)) {
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", "http://localhost/formenter.php", $myrow["id"], $myrow["first"], $myrow["last"]);
printf("<a href=\"%s?id=%s&delete=yes\">(DELETE)</a><br>", "http://localhost/formenter.php", $myrow["id"]);
}
}
?>
<P>
<a href="<?echo "http://localhost/formenter.php"?>">Добавление записи</a>
<P>
<form action="<?echo "formenter.php"?>" method="GET">
<?
if ($_GET["id"])
{
$e=$_GET['id'];
$sql="SELECT * FROM employees WHERE id='$e'";
$result=mysql_query($sql);
$myrow=mysql_fetch_array($result);

$id=$myrow["id"];
$first=$myrow["first"];
$last=$myrow["last"];
$address=$myrow["address"];
$position=$myrow["position"];

?>

<input type=hidden name="id" value="<? echo $e ?>">
<?
}
?>

Имя: <input type="text" name="first" value="<? echo $first ?>"><br>
Фамилия: <input type="text" name="last" value="<? echo $last ?>"><br>
Адрес: <input type="text" name="address" value="<? echo $address ?>"><br>
Должность: <input type="text" name="position" value="<? echo $position ?>"><br>
<input type="Submit" name="submit" value="Ввод информации">
</form>
<?
}
?>

</body>
</html>

На первый взгляд код выглядит сложным, однако это не так. Программа делится на три части. Первое if() выражение проверяет, была ли нажата кнопка Submit, и если была, проводится проверка, есть ли в поданных данных переменная $id. Если ее нет, значит происходит добавление новой записи. В противном случае мы редактируем уже существующую запись.

Далее мы проверяем, определена ли переменная $delete. Если да, мы удаляем запись.

Наконец, мы переходим к действию, которое будет выполняться по умолчанию: то есть выводим просто список служащих и форму. Здесь мы опять проверяем существование переменной $id. Если она существует, мы просим базу данных выдать сведения о выбранном служащем. В противном случае выводим пустую форму.

Все, чему мы научились, мы поместили в один большой код. Мы использовали циклы while() и выражения if(), а также целую гамму основных команд языка SQL - SELECT, INSERT, UPDATE, и DELETE

Наконец, мы рассмотрели, как можно передавать информацию от одной страницы к другой через URL с помощью ссылок и через формы.

Маленькие советы

Hачинающий: echo "$var"; Пpофи: echo $var;

Начинающий: print("Test"); Пpофи: print "Test";

Hачинающий: echo"<a href=\"http://www.php.net\">PHP</a>"; Пpофи: ?><a href="http://www.php.net">PHP</a><?

Hачинающий: $a[0]=1; $a[1]=2; $a[2]=3; Пpофи: $a = array(1,2,3);

Hачинающий: if($a>1) { $b=2; } else { $b=3; } Пpофи: $b = ($a>1) ? 2:3;

Hачинающий: $result=mysql_query(...);
Пpофи: $result=mysql_query(...) or die (mysql_error());


Пример создания законченного приложения

Создадим простой HTML файл-форму. Назовем этот файл request.html.

<html>
<head>
<title>Запрос информации</title>
<body>
<center>
<h3>
Хотите больше знать о наших товарах?
</h3>
<P>
<table width=400><tr><td align=right>
<form action="email.php" method="POST">
Ваше имя: <br>
<input type="text" name="name" size="30" maxlength="30">
<P>
Ваш e-mail: <br>
<input type="text" name="email" size="20" maxlength="30">
<P>
Меня интересуют:
<select name="preference">
<option value="Ноутбуки">Ноутбуки
<option value="Видеокамеры">Видеокамеры
</select>
<P>
<input type="submit" value="Отправить запрос!">
</form>
</td></tr></table></center>
</body>
</html>

В тексте мы указали, что данные формы будут обрабатываться файлом email.php. Приведем его содержание:

<?
/* Этот скрипт получает переменные из request.html */
PRINT "<CENTER>";
echo "Здравствуйте, ", $_POST['name'],".";
PRINT "<BR><BR>";
PRINT "Спасибо за ваш интерес.<BR><BR>";
echo "Вас интересуют ", $_POST['preference'],". Информацию о них мы пошлем вам на e-mail: ", $_POST['email'],".";
PRINT "</CENTER>";
?>

Теперь, если пользователь вызовет request.html и наберет в форме имя “Вася”, email: basic@rsue.ru и скажет, что его интересуют “Видеокамеры”, а после этого нажмет "Отправить запрос!", то на экране появится следующий текст:

Здравствуйте, Вася
Спасибо за ваш интерес.
Вас интересуют Видеокамеры. Информацию о них мы пошлем вам на email: basic@rsue.ru

Давайте усложним пример. Мы должны сдержать обещание и выслать email. Для этого в PHP есть функция MAIL.

void mail(string to, string subject, string message, string add_headers);

to – email адрес получателя.
subject – тема письма.
message – собственно текст сообщения.
add_headers – другие параметры заголовка письма (необязательный параметр).

Допишем в конец файла email.php следующий код:

<?

$e=$_POST['email'];
$d=$_POST['name'];
$f=$_POST['preference'];

mail ($e, "Запрос на информацию", "$d\n
Спасибо за Ваш интерес!\n
Вас интересуют $f\n
Мы их распространяем бесплатно. Обратитесь в ближайший филиал нашей компании и получите ящик этого продукта.\n
", "from:orlova@rsue.ru");
mail ("basic@rsue.ru", "Был запрос на информацию.",
"$d интересовали $f\n
e-mail-адрес: $e.\n", "from:orlova@rsue.ru");

?>

Вот теперь пользователь будет получать письмо с более подробной информацией о наших товарах. Также письмо получит и администратор сайта.

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

Теперь наш файл email.php будет иметь следующий вид:

<?
$hostname="university";
$username="student";
$password="12345678";
$dbName="student";
$userstable="clients3";
$adminaddress="basic@rsue.ru";
$db=mysql_connect($hostname, $username, $password) or die("Не могу создать соединение ");
mysql_select_db("$dbName",$db) or die("Не могу выбрать базу данных");

mysql_query("SET NAMES cp1251");

print "<center>";
echo "Здравствуйте, ", $_POST['name'],".";
print "<br><br>";
print "Спасибо за Ваш интерес.<br><br>";
echo "Вас интересуют ", $_POST['preference'],". Информацию о них мы пошлем Вам на e-mail: ", $_POST['email'],".";
print "</center>";
$e=$_POST['email'];
$d=$_POST['name'];
$f=$_POST['preference'];
mail ($e, "Запрос на информацию", "$d\n
Спасибо за Ваш интерес!\n
Вас интересуют $f\n
Мы их распространяем бесплатно. Обратитесь в ближайший филиал нашей компании и получите ящик этого продукта.\n
", "from:orlova@rsue.ru");
mail ($adminaddress, "Был запрос на информацию.",
"$d интересовали $f\n
e-mail-адрес: $e.\n", "from:orlova@rsue.ru");

$query="INSERT INTO $userstable VALUES('$d','$e','$f')";
$result=mysql_query($query);

print "Информация о Вас занесена в базу данных.";

mysql_close();
?>

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

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

Напишем скрипт query.php

<?

$hostname="university";
$username="student";
$password="12345678";
$dbName="student";

$userstable="clients";

mysql_connect($hostname, $username, $password) or die("Не могу создать соединение ");
mysql_select_db("$dbName") or die("Не могу выбрать базу данных");

mysql_query("SET NAMES cp1251");

$query="SELECT * FROM $userstable WHERE preference='Ноутбуки'";
$result=mysql_query($query);

$number=mysql_numrows($result);

$i=0;

if ($number==0)
{
print "<center><P>Любителей ноутбуков нет</center>";
}
elseif ($number > 0)
{
print "<center><P>Количество любителей ноутбуков: $number<br><br>";
while ($i < $number)
{
$name=mysql_result($result,$i,"name");
$email=mysql_result($result,$i,"email");
print "Клиент $name любит ноутбуки.";
print "Его e-mail: $email.<br>";
$i++;
}

print "</center>";
}
?>

Здесь мы использовали новую функцию:

int mysql_num_rows(int result);

Параметры:

result – содержит ID результата запроса.

Функция возвращает количество строк в результате запроса.

Вот и все, коммерческий продукт практически готов.