Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33896 / 4520 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 11:

Взаимодействие PHP и MySQL

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >

Отображение списка полей в html-форму

Теперь немножко подкорректируем предыдущий пример. Будем не просто выводить информацию о поле, а отображать его в подходящий элемент html-формы. Так, элементы типа BLOB переведем в textarea (заметим, что поле description, которое мы создавали с типом TEXT, отображается как имеющее тип BLOB ), числа и строки отобразим в текстовые строки ввода <input type=text>, а элемент, имеющий метку автоинкремента, вообще не будем отображать, поскольку его значение устанавливается автоматически.

Все это решается довольно просто, за исключением выделения из списка флагов флага auto_increment. Для этого нужно воспользоваться функцией explode.

Синтаксис explode:

массив explode( строка separator, 
    строка string [, int limit])

Эта функция разбивает строку string на части с помощью разделителя separator и возвращает массив полученных строк.

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

Итак, создадим форму для ввода данных в таблицу Artifacts:

<?
$conn=mysql_connect("localhost","nina","123"); 
           // устанавливаем соединение
$database = "book";
$table_name = "Artifacts";
mysql_select_db($database); // выбираем базу данных для 
           // работы
$list_f = mysql_list_fields($database,$table_name); 
           // получаем список полей в таблице
$n = mysql_num_fields($list_f); // число строк в результате 
           // предыдущего запроса (т.е. сколько всего 
           // полей в таблице Artifacts) 
echo "<form method=post action=insert.php>";  
           // создаем форму для ввода данных
echo "&nbsp;<TABLE BORDER=0 CELLSPACING=0 width=50% ><tr>
    <TD  BGCOLOR='#005533' align=center><font color='#FFFFFF'>
    <b> Add new row in $table_name</b></font></td></tr><tr><td></td></tr></TABLE>";
echo "<table border=0 CELLSPACING=1 cellpadding=0 width=50% >";
// для каждого поля получаем его имя, тип, длину и флаги
for($i=0;$i<$n; $i++){
    $type = mysql_field_type($list_f, $i);
    $name_f = mysql_field_name ($list_f,$i);
    $len = mysql_field_len($list_f, $i);
    $flags_str = mysql_field_flags ($list_f, $i);
    // из строки флагов делаем массив, 
    // где каждый элемент массива - флаг поля
    $flags = explode(" ", $flags_str); 
    foreach ($flags as $f){
        if ($f == 'auto_increment') $key = $name_f; 
            // запоминаем имя автоинкремента
    }
/* для каждого поля, не являющегося автоинкрементом, в 
зависимости от его типа выводим подходящий элемент формы */
if ($key <> $name_f){ 
echo "<tr><td align=right bgcolor='#C2E3B6'><font size=2>
        <b>&nbsp;". $name_f ."</b></font></td>";
switch ($type){
        case "string":
            $w = $len/5;
            echo "<td><input type=text name=\"$name_f\" 
                size = $w ></td>";
        break;
        case "int": 
            $w =  $len/4;
            echo "<td><input type=text name=\"$name_f\" 
                size = $w ></td>";
        break;  
        case "blob":
            echo "<td><textarea rows=6 cols=60 name=\"$name_f\"></textarea></td>";
        break;   
        } 
    }
    echo "</tr>";
}
echo "</table>";
echo "<input type=submit name='add' value='Add'>";
echo "</form>";
?>
Листинг 11.0.1. Форма для ввода данных в таблицу Artifacts

Запись данных в базу данных

Итак, форма создана. Теперь нужно сделать самое главное - отправить данные из этой формы в нашу базу данных. Как вы уже знаете, для того чтобы записать данные в таблицу, используется команда INSERT языка SQL. Например:

mysql> INSERT INTO Artifacts 
           SET title='Петров';

Возникает вопрос, как можно воспользоваться такой командой (или любой другой командой SQL) в PHP скрипте. Для этого существует функция mysql_query().

Синтаксис mysql_query

ресурс mysql_query ( строка query 
    [, ресурс link_identifier])

mysql_query() посылает SQL-запрос активной базе данных MySQL сервера, который определяется с помощью указателя link_identifier (это ссылка на какое-то соединение с сервером MySQL ). Если параметр link_identifier опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect() без параметров. Результат запроса буферизируется.

Замечание: строка запроса НЕ должна заканчиваться точкой с запятой.

Только для запросов SELECT, SHOW, EXPLAIN, DESCRIBE, mysql_query() возвращает указатель на результат запроса, или FALSE, если запрос не был выполнен. В остальных случаях mysql_query() возвращает TRUE, если запрос выполнен успешно, и FALSE - в случае ошибки. Значение, не равное FALSE, говорит о том, что запрос был выполнен успешно. Оно не говорит о количестве затронутых или возвращенных рядов. Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда. mysql_query() также считается ошибочным и вернет FALSE, если у пользователя недостаточно прав для работы с указанной в запросе таблицей.

Итак, теперь мы знаем, как отправить запрос на вставку строк в базу данных. Заметим, что в предыдущем примере элементы формы мы назвали именами полей таблицы. Поэтому они будут доступны в скрипте insert.php, обрабатывающем данные формы, как переменные вида $_POST['имя_поля'].

<?
$conn=mysql_connect("localhost","nina","123");// устанавливаем 
              // соединение
$database = "book";
$table_name = "Artifacts";
mysql_select_db($database); // выбираем базу данных
$list_f = mysql_list_fields($database,$table_name); 
              // получаем список полей в таблице
$n = mysql_num_fields($list_f); // число строк в результате 
              // предыдущего запроса 
// составим один запрос сразу для всех полей таблицы
$sql = "INSERT INTO $table_name SET "; // начинаем создавать 
    // запрос, перебираем все поля таблицы
for($i=0;$i<$n; $i++){
    $name_f = mysql_field_name ($list_f,$i); // вычисляем имя поля
    $value = $_POST[$name_f]; // вычисляем значение поля
    $j = $i + 1;
    $sql = $sql . $name_f." = '$value'"; // дописываем в 
              // строку $sql пару имя=значение
    if ($j <> $n) $sql = $sql . ", "; // если поле не 
              // последнее в списке, то ставим запятую
}
// перед тем как записывать что-то в базу, 
// можно посмотреть, какой запрос получился
//echo $sql; 
$result = mysql_query($sql,$conn); // отправляем запрос 
// выводим сообщение успешно ли выполнен запрос
if (!$result) echo " Can't add ($table_name) "; 
    else echo "Success!<br>"; 
?>
Листинг 11.0.2. insert.php

Итак, задачу добавления данных с помощью web-интерфейса мы решили. Однако тут есть одна тонкость. При решении мы не учитывали тот факт, что значения некоторых полей ( author, photo ) должны браться из других таблиц ( Persons, Images ). Поскольку MySQL с внешними ключами не работает (уже работает - прим. эксперта), этот момент остается на совести разработчиков системы, т.е. на нашей совести. Нужно дописать программу таким образом, чтобы была возможность вводить в такие поля правильные значения. Но мы делать этого не будем, поскольку задача лекции состоит в том, чтобы познакомить читателя с элементами технологии, а не в том, чтобы создать работающую систему. Кроме того, имеющихся у читателя знаний вполне достаточно, чтобы решить эту проблему самостоятельно. Мы же обратимся к другой задаче - отображение данных, хранящихся в базе данных СУБД MySQL.

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Михаил Акимов
Михаил Акимов
Россия, Москвп, МИРЭА, МГУПИ, МИТХТ
Алексей Ласкин
Алексей Ласкин
Россия, Москва, НИБ