- •Введение.
- •Лекция1.Введениевклиент-серверныеСубд.
- •InterbaseSqlServer.Общиесведения.
- •Платформы
- •Типыприложений
- •ФайлыбазыданныхInterBase
- •Лекция3.Триггерыихранимыепроцедуры
- •Хранимыепроцедуры(StoredProcedures)
- •Терминаторы
- •Заголовок
- •Телопроцедуры
- •Блоккодапроцедуры
- •Операторприсваивания
- •УсловныйоператорIf…then…else
- •ОператорSelect
- •ЦиклForselecTиSuspend
- •ЦиклWhile…do
- •ОператорыInsert,update,delete
- •ОператорExecuteprocedure
- •Исключения
- •СобытияиоператорPost_event
- •Измененияиудаленияхранимыхпроцедур
- •Примерысозданияивызовахранимыхпроцедур
- •Генераторы
- •Увеличениешагагенератора
- •Триггеры
- •ПеременныеNeWиOld
- •Реализацияавтоинкрементныхключевыхполей
- •Лекция4.Транзакции.Механизмтранзакций
- •Атомарность(Atomicity)
- •Согласованность(Consistency)
- •Изолированность(Isolation)
- •Устойчивость(Durability)
- •Неявныйиявныйстарттранзакций
- •Кактранзакцияработает
- •Уровниизолированноститранзакций
- •Параметрытранзакций
- •Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд
- •ПроблемырусскихбукввInterBase
- •Лекция5. Основы языка php. Функции php для работы с субд ИсторияPhp
- •ВозможностиPhp
- •Основнойсинтаксис
- •Разделениеинструкций
- •Комментарии
- •Переменные,константыиоператоры
- •Переменные
- •Константы
- •Операторы
- •Типыданных
- •Типboolean(булевилилогическийтип)
- •Типinteger(целые)
- •Типfloat(числасплавающейточкой)
- •Типstring(строки)
- •Одинарныекавычки
- •Двойныекавычки
- •Типarray(массив)
- •Определениеприпомощиarray()
- •Определениеспомощьюсинтаксисаквадратныхскобок
- •Типobject(объекты)
- •Типresource(ресурсы)
- •Решениезадачи
- •Построениеинтерфейсадлядобавленияинформации
- •Установкасоединения
- •Выборбазыданных
- •Получениеспискаполейтаблицы
- •Отображениеспискаполейвhtml-форму
- •Записьданныхвбазуданных
- •Отображениеданных,хранящихсявMySql
- •Заключение
Отображениеспискаполейвhtml-форму
Теперьнемножкоподкорректируемпредыдущийпример.Будемнепростовыводитьинформациюополе,аотображатьеговподходящийэлементhtml-формы.Так,элементытипаBLOBпереведемвtextarea(заметим,чтополеdescription,котороемысоздавалистипомTEXT,отображаетсякакимеющеетипBLOB),числаистрокиотобразимвтекстовыестрокиввода<inputtype=text>,аэлемент,имеющийметкуавтоинкремента,вообщенебудемотображать,посколькуегозначениеустанавливаетсяавтоматически.
Всеэторешаетсядовольнопросто,заисключениемвыделенияизспискафлаговфлагаauto_increment.Дляэтогонужновоспользоватьсяфункциейexplode.
Синтаксисexplode:
массивexplode(строкаseparator,
строкаstring[,intlimit])
Этафункцияразбиваетстроку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"<formmethod=postaction=insert.php>";
//создаемформудлявводаданных
echo" <TABLEBORDER=0CELLSPACING=0width=50%><tr>
<TDBGCOLOR='#005533'align=center><fontcolor='#FFFFFF'>
<b>Addnewrowin$table_name</b></font></td></tr><tr><td></td></tr></TABLE>";
echo"<tableborder=0CELLSPACING=1cellpadding=0width=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($flagsas$f){
if($f=='auto_increment')$key=$name_f;
//запоминаемимяавтоинкремента
}
/*длякаждогополя,неявляющегосяавтоинкрементом,в
зависимостиотеготипавыводимподходящийэлементформы*/
if($key<>$name_f){
echo"<tr><tdalign=rightbgcolor='#C2E3B6'><fontsize=2>
<b> ".$name_f."</b></font></td>";
switch($type){
case"string":
$w=$len/5;
echo"<td><inputtype=textname=\"$name_f\"
size=$w></td>";
break;
case"int":
$w=$len/4;
echo"<td><inputtype=textname=\"$name_f\"
size=$w></td>";
break;
case"blob":
echo"<td><textarearows=6cols=60name=\"$name_f\"></textarea></td>";
break;
}
}
echo"</tr>";
}
echo"</table>";
echo"<inputtype=submitname='add'value='Add'>";
echo"</form>";
?>
Листинг11.0.1.ФормадлявводаданныхвтаблицуArtifacts
Записьданныхвбазуданных
Итак,формасоздана.Теперьнужносделатьсамоеглавное-отправитьданныеизэтойформывнашубазуданных.Каквыужезнаете,длятогочтобызаписатьданныевтаблицу,используетсякомандаINSERTязыкаSQL.Например:
mysql>INSERTINTOArtifacts
SETtitle='Петров';
Возникаетвопрос,какможновоспользоватьсятакойкомандой(илилюбойдругойкомандой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="INSERTINTO$table_nameSET";//начинаемсоздавать
//запрос,перебираемвсеполятаблицы
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'tadd($table_name)";
elseecho"Success!<br>";
?>
Листинг11.0.2.insert.php
Итак,задачудобавленияданныхспомощьюweb-интерфейсамырешили.Однакотутестьоднатонкость.Прирешениимынеучитывалитотфакт,чтозначениянекоторыхполей(author,photo)должныбратьсяиздругихтаблиц(Persons,Images).ПосколькуMySQLсвнешнимиключаминеработает(ужеработает-прим.эксперта),этотмоментостаетсянасовестиразработчиковсистемы,т.е.нанашейсовести.Нужнодописатьпрограммутакимобразом,чтобыбылавозможностьвводитьвтакиеполяправильныезначения.Номыделатьэтогонебудем,посколькузадачалекциисостоитвтом,чтобыпознакомитьчитателясэлементамитехнологии,аневтом,чтобысоздатьработающуюсистему.Крометого,имеющихсяучитателязнанийвполнедостаточно,чтобырешитьэтупроблемусамостоятельно.Мыжеобратимсякдругойзадаче-отображениеданных,хранящихсявбазеданныхСУБДMySQL.