Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
17
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

Отображениеспискаполейв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.