|
Программирование >> Программный интерфейс приложений
my ($cols) = ($rows == 0 ? 0 : scalar (@{$matrix ref->[0]})); for (my $1 = 0; $i < $rows; $!++)# построчная печать { my ($delim) = ; for (my $] = 0; $] < $cols; $]++) { print Sdelim . $matrix ref->[$i][$]]; $delim = , ; print \n ; Метод fetchall arrayref () возвращает ссылку на пустой массив, если результирующий набор пуст. Метод возвращает значение undef в случае ошибки, поэтому тогда, когда параметр RaiseError не включен, необходимо проверять возвращаемое значение перед его использованием. Количество строк и столбцов определяется заполнением матрицы. Для доступа ко всей строке $i матрицы как к массиву можно воспользоваться синтаксической конструкцией (? {$matrix ref-> [$i] }. Конечно, намного проще для выборки результирующего набора пользоваться методом f etchall arrayref (), чем писать специальный цикл выборки строк, хотя доступ к элементам массива будет несколько усложнен. Существует метод, во многом аналогичный функциональным возможностям метода fetchall arrayref () в случайном порядке, однако более функциональный. Это метод selectall arrayref (). Он выполняет полную последовательность операций prepare О, execute (), цикл выборки, finish О . Для того чтобы работать с методом selectall arrayref (), необходимо передать запрос непосредственно этому методу с помощью дескриптора базы данных. ту ($matrix ref ) ; # ссылка на массив ссылок $matrix ref = $dbh->selectall arrayref ( SELECT last name , first name, suffix, email, street, city, state, zip, phone FROM member ORDER BY last name ); # определить размерность матрицы my ($rows) = (defined ($matrix ref ) ? 0 : scalar (@{5matrix ref ))); my (Scols) = (Srows == 0 ? 0 : scalar (@{Smatrix ref ->[0]})); for (my $1 = 0; Si < Srows; Si++)# построчная печать { my (Sdelim) = ; , for (my Sd = 0; S] < Scols; S]++) { print Sdelim . Smatrix ref ->[Sil [SdI; Sdelim = , ; print \n ; проверка пустых значений При выборке данных из базы необходимо различать значения NULL и нулевые значения столбцов или пустые строки Это достаточно просто потому, что интерфейс DBI возвращает пустые значения столбцов как undef. Однако при этом необходимо делать соответствующую проверку. Вот фрагмент профаммного кода, который всегда распечатывает false : $col val = undef; if ($col val) { print falsei\n ; } $col val =0; if (i$col val) { print false\n ; } $col val = ;if (i$col val) { print false!\n ; ) Более того, следующий фрагмент печатает false для двух проверок: $col val = undef; if ($col val eq ) { print falsei\n ; } $col val = ; If ($col val eq ) { print falsei\n ; } Вот фрагмент, который делает то же самое: $col val = ; if ($col val eq ) ( print false\n ; } if {$col val == 0) { print false I\n ; } Для определения различия между столбцами со значением NULL и столбцами, имеющими другие значения, воспользуйтесь методом defined {). После того как вы убедились в том, что значение не является пустым, можно производить анализ других значений. Например: if (defined ($col val)) { print NULL\n ; ) elsif ($col val eq ) { print пустая строка \n ; } elsif ($col val == 0) { print ноль\п ; ) else { print другое\п ; } Здесь очень важно производить проверки в правильной очередности. Это важно потому, что если $colval является пустой сфокой, вторая и фетья операции сравнения дают результат True . Если изменить порядок следования этих операторов, пустые сфоки ошибочно будут идентифицированы как сфоки, имеющие значение ноль Проблема кавычек До сих пор мы консфуировали запросы самым простейщим образом с использованием простых кавычек. Проблемы на лексическом уровне языка написания сценариев Perl возникают в случае, когда строки, заключенные в кавычки, сами содержат величины в кавычках. Зафуднения могут возникнуть и на уровне SQL, когда необходимо добавить или выбрать значения, которые содержат кавычки, обратную косую черту или двоичные данные При определении запроса как строки, заключенной в кавычки, нужно всячески избегать любого появления символа кавычки внутри сфоки запроса: Squery = INSERT absence VALUES(14,\1999-9-16\); $query = INSERT absence VALUES(14,\ 1999-9-16\ ) ; Глава 7. Программный интерфейс Perl API 355 Синтаксис Perl и MySQL позволяет заключать строки как в одинарные, так и в двойные кавычки. Таким образом, можно избегать неоднозначности: $query = INSERT absence VALUES(14, 1999-9-16 ); $query = INSERT absence VALUES(14,1999-9-16) ; Однако эти два типа кавычек в Perl не эквивалентны. Ссылки на переменные интерпретируются только внутри двойных кавычек. Поэтому одинарные кавычки при создании запросов не помогут, когда в строке запроса имеется ссылка на переменные. Например, для $var, равного 14, следующие две строки не будут идентичны: SELECT * FROM member WHERE id = $var SELECT * FROM member WHERE id = $var Строки интерпретируются следующим образом и очевидно, что первая строка серверу MySQL будет более понятна: SELECT * FROM member WHERE id = 14 SELECT * FROM member WHERE id = $var В качестве альтернативы двойным кавычкам можно назвать конструкцию qq{ 1, которая позволяет интерпретатору Perl рассматривать все, что находится между qq{ и } как строку, заключенную в двойные кавычки. В названии этой конструкции qq можно рассматривать как аббревиатуру double-quote (двойная кавычка). Например, эти две строки эквивалентны: $date = 1999-9-16 ; Sdate = qq(1999-9-16}; Конструкция qql} позволяет совсем не беспокоиться о проблеме двойной кавычки и свободно пользоваться в запросах кавычками (одинарными или двойными). Кроме того, безошибочно интерпретируются ссылки на переменные. Эти обе возможности конструкции qq{} проиллюстрированы следующим оператором INSERT $id = 14; $date = 1999-9-16 ; Squery = qq{INSERT absence VALUES($id, $date )}; В качестве офаничителей конструкции qq можно пользоваться как { и } , так и qqO и qq . Автор предпочитает форму qq{}, потому что вероятность того, что символ } появится в тексте SQL-запроса значительно ниже, чем вероятность появления там символов ) или / . Например, символ ) появляется внутри оператора insert, показанного только что. Таким образом, qq() не будет безошибочно интерпретирован при квотировании сфоки запроса. Консфукция qq {} позволяет вьщелить запрос отдельной строкой, если есть необходимость и желание вьщелить SQL-запрос из профаммного кода Perl: $id = 14; $date = 1999-9-16 ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |