|
Здравствуйте! Записался на ваш курс, но не понимаю как произвести оплату. Надо ли писать заявление и, если да, то куда отправлять? как я получу диплом о профессиональной переподготовке? |
Взаимодействие PHP и MySQL
Отображение списка полей в html-форму
Теперь немножко подкорректируем предыдущий пример. Будем не просто выводить информацию о поле, а отображать его в подходящий элемент html-формы. Так, элементы типа BLOB переведем в textarea (заметим, что поле description, которое мы создавали с типом TEXT, отображается как имеющее тип BLOB ), числа и строки отобразим в текстовые строки ввода <input type=text>, а элемент, имеющий метку автоинкремента, вообще не будем отображать, поскольку его значение устанавливается автоматически.
Все это решается довольно просто, за исключением выделения из списка флагов флага auto_increment. Для этого нужно воспользоваться функцией 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 " <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> ". $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 ( строка 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.
