Программирование >>  Программный интерфейс приложений 

1 ... 109 110 111 [ 112 ] 113 114 115 ... 264


$query = qq{

INSERT absence VALUES ($ici, $date )

Это также будет полезно и с точки зрения придания большей читабельности запросу. Например, оператор SELECT, представленный в сценарии dump members, выглядит следуюшим образом:

$sth = $dbh->prepare ( SELECT last name, first nanie, suffix, email, street, city, state, zip, phone FROM member ORDER BY last name );

Применив конструкцию qq{}, придадим оператору более читабельный вид:

$sth = $dbh->prepare (qq{ SELECT

last name, first name, suffix, email,

street, city, state, zip, phone FROM member ORDER BY last name

Довольно часты случаи, когда строки, заключенные в двойные кавычки, тоже могут занимать несколько строк. Но все равно автор при создании многострочных строк отдает предпочтение конструкции qq {}. Я поймал себя на мысли, что когда я вижу непарную кавычку в строке, то думаю, не ошибка ли это? После чего я машинально трачу время зря на поиски парной кавычки

Конструкция qq{} берет на себя все проблемы заключения в кавычки на лексическом уровне интерпретатора Perl. Это позволяет совершенно не заботиться об этой проблеме Однако необходимо принимать во внимание синтаксис уровня SQL. Рассмотрим такую попытку добавления записи в таблицу member:

$last = OMalley ; $first = Brian ; $expiration = 2002-9-1 ; $rows = $dbh->do (qq(

INSERT member (last name,first name,expiration)

VALUES($last,$first,$expiration)

Строка, которую метод do () здесь посылает серверу MySQL, будет выглядеть следуюшим образом:

INSERT member (last name, first name, expiration) VALUES(OMalley,Brian,2002-9-1)

Этот SQL-запрос содержит ошибку потому, что одинарная кавычка попадает внутрь строчки, заключенной в кавычки. В главе 6, Профаммный интерфейс MySQL С API , мы уже сталкивались с аналогичной проблемой. Тогда она была вызвана использованием функции mysql escape string (). Интерфейс DBI имеет подобный механизм - каждое значение, взятое в кавычки, которое затем будет использоваться явным образом в операторе, вы-



зьшает метод quote О и в дальнейшем используется уже только возврашен-ное значение. Предьщуший пример лучше переписать следующим образом:

$last = $dbh->quote ( OMalley ); $first = $dbh->quote ( Brian ); $expiration = $dbh->quote ( 2002-9-1 ); $rows = $dbh->do (qq{

INSERT member (last name,first name, expiration)

VALUES($last , Sfirst , $expiration)

Теперь строка, которую метод do () посылает серверу MySQL, приобретает следующий вид.

INSERT member (last name, first name, expiration) VALUES(OXMalley, Brian, 2002-9-1)

Обратите внимание, что при ссылке на $last и $first в строке запроса нет окружающих кавычек, их присваивает метод quote () При добавлении кавычек в запросе будет слишком много кавычек:

$value = paul ;

$quoted value = $dbh->quote ($value);

print ... WHERE name = $quoted value\n ; print ... WHERE name = $quoted value \n ;

Это операторы дают следующий результат:

... WHERE name = paul

... WHERE name = paul

Маркеры и привязка параметров

в предьщущих разделах мы создавали запросы, указывая добавляемые значения и критерии выборки прямо в строке запроса, что совсем не обязательно. Интерфейс DB1 позволяет размещать в строке запроса специальные маркеры, а затем во время выполнения запросов подставлять на место этих маркеров реальные значения. Это преследует одну основную цель - увеличение производительности.

Проиллюстрируем, каким образом работают маркеры. Предположим, что в школе начинается новый семестр и необходимо очистить таблицу student, а затем проинициализировать ее, введя туда новых учащихся, воспользовавшись списком имен учашихся, хранящимся в файле. Без маркеров удалить существующие в таблице данные и зафузить новые можно следующим образом:

$dbh->do (qq{ DELETE FROM student }); # удалить существующие строки

while (О) # добавить новые строки

chomp;

$ = $dbh->quote ($ );

$dbh->do (qq{ INSERT student SET name = $ });



Такая процедура работает неэффективно потому, что основной запрос INSERT будет статичным, а метод do () вызывает в цикле методы ргерагеО и execute (). Гораздо более эффективно будет работать процедура, в которой для установки оператора INSERT метод prepare () вызывается всего один раз перед началом цикла, а в цикле вызывается один только метод execute (). Это позволяет избежать всех вызовов метода ргерагеО, кроме одного. Интерфейс DBI осуществляет это следующим образом:

Sdbh->do (qq{ DELETE FROM student ) ); # удалить существующие строки Ssth = Sdbh->prepare (qq{ INSERT student SET name = ? }); whxle {<>) # добавить новые строки

chomp;

Ssth->execute ($ );

Ssth->fxnxsh();

Обратите внимание на знак вопроса в запросе INSERT. Это и есть маркер. При выполнении метода execute {) реальное значение замещает маркер. В таком виде запрос передается на сервер В целом, если метод do () находится внутри цикла, гораздо лучше запустить метод prepare {) до начала цикла, а внутри цикла оставить только execute (). Вот несколько замечаний относительно маркеров.

Не заключайте символ маркера в кавычки внутри строки запроса. Если это сделать, то данный символ не будет распознан как таковой.

При определении значений маркеров не пользуйтесь методом quote О В противном случае во вставляемых значениях появляются дополнительные кавычки.

Можно задавать несколько маркеров в строке запроса, но при этом методу execute!) обязательно нужно передавать столько значений, сколько было задано маркеров.

Каждый маркер должен определять одно, а не список значений. Например, такой оператор будет неверным

Ssth = Sdbh->prepare (qq{{

INSERT member last name, fxrst name VALUES (?)

Ssth->execute ( Adams,Bxll,2003-09-19 );

Чтобы избежать ошибки, необходимо поступить следующим образом

Ssth = Sdbh->prepare (qq{{

INSERT member last name, fxrst name VALUES(?,?,?)

Ssth->execute { Adams , Bill , 2003-09-19 ) ;

Для определения пустого значения в качестве маркера используйте значение undef.



1 ... 109 110 111 [ 112 ] 113 114 115 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика