|
Программирование >> Программный интерфейс приложений
$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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |