|
Программирование >> Программный интерфейс приложений
Выполнение вычислений на основе данных, полученных в результирующем наборе До этого момента все наши усилия были сфокусированы на метаданных результируюшего набора, прежде всего на распечатке данных. Но определенно могут наступить времена, когда с данными потребуется произвести операции другого рода. Например, на основании этих данных можно подсчитать статистическую информацию, воспользовавшись метаданными для того, чтобы проверить, соответствуют ли данные нужным вам условиям. Какой тип условий? Для начала можно проверить, что столбец, который планируется использовать в цифровых вычислениях, действительно содержит числа! Ниже приведен листинг, представляющий простую функцию suiranary stats {), которая на основании данных из результирующего набора и индекса столбцов вычисляет итоговую статистику значений, содержащихся в столбце. Функция также сообщает количество пустых значений, которые он определяет проверкой на значения NULL . При этих вычислениях к данным выдвигается два требования, которые должны быть соблюдены. Функция suinmary stats () проверяет их с помощью метаданных. Указанный столбец должен существовать (т.е. индекс столбца должен лежать в пределах диапазона номеров столбцов результирующего набора). Столбец должен содержать цифровые данные. Если эти условия не соблюдаются, summary stats () распечатывает сообщение об ошибке. В этом случае программный код примет вид: void summary stats (MYSQL RES *res set, unsigned int col num) { MYSQL FIELD * field; MYSQL ROW row; unsigned int n, missing; double val, sum, sum squares, var; /* проверка соответствия условиям */ If (mysql num fields (res set) < col num) print error (NULL, Ошибочный номер столбца ); return; mysql field seek (res set, 0); field = mysql fetch field (res set); if (!IS NUM (field->type)) { print error (NULL, столбец не является числовым ); return; /* вычисление итоговой статистики */ п = 0; missing = 0; sum = 0; sum squares = 0; mysql data seek (res set, 0); while ((row = mysql fetch row (res set)) != NULL) { if (row[col num] == NULL) missing++; else ( n++; val = atof (row[col num)); /* преобразование строки в число */ sum += val; sum squares += val * val; if (n == 0) printf ( Наблюдения отсутствуют\n ) ; else { printf ( Количество наблюдений: %lu\n , n); printf ( Наблюдения отсутствуют: %lu\n , missing); printf ( Сумма: %g\n , sum); printf ( Среднее: %g\n , sum / n); printf ( Сумма квадратов: %g\n , sum squares) ; var = ((n * sum squares) (sum * sum)) / (n * (n - 1)) printf ( Дисперсия: %g\n , var); printf ( Квадратичное отклонение: %g\n , sqrt (var)); Обратите внимание на вызов функции mysql data seek (), который предшествует циклу mysql fetch row (). Он здесь для того, чтобы дать возможность вызвать summarystats () несколько раз для обработки одного и того же результирующего набора (в случае, если требуется вычислить статистику для нескольких столбцов). Перед каждым вызовом summary stats () он делает перемотку на начало результирующего набора. (Это предполагает создание результирующего набора с помощью mysql store result (). В случае создания результирующего набора с помощью функции mysql use result О, строки можно обработать по порядку и только один раз.) Функция summarystats () является относительно простой функцией, но она может подсказать, как создать программу для более сложных вычислений, таких как средняя квадратичная рефессия двух столбцов или такой стандартной статистики, как t-test. Кодирование проблемных данных в запросах Вставленные в запрос значения данных, содержащие кавычки, значения -NULL или обратная косая черта могут вызвать неоднозначность при выполнении запроса. Ниже излагается материал, в котором описывается природа этого явления и способы разрешения проблем. Предположим, что нам требуется создать запрос SELECT, обрабатывающий содержимое строки, завершающейся значением NULL . Обращение к этой строке производится по имени: char query [1024 ] ; sprintf (query, SELECT * FROM my tbl WHERE name=%s , name); Значение имени может быть чем-то вроде OMalley, Brian . Из-за того, что апостроф находится внутри такой строки, будет получен ошибочный запрос; SELECT * FROM my tbl WHERE name= OMalley, Brian Одинарную кавычку необходимо обрабатывать каким-то специальным способом для того, чтобы сервер не интерпретировал ее как конец имени. Одним из рещений может быть дублирование кавычек в строке. Это соглашение ANSI SQL. СУБД MySQL распознает данные в соответствии с этим соглашением. Кроме того, стандарт допускает использование обратной косой черты до кавычек; SELECT * FROM my tbl WHERE name=ОMalley, Brian SELECT * FROM my tbl WHERE name=0\Malley, Brian Еше одна проблемная ситуация связана с использованием в запросе произвольных двоичных данных. Это происходит в приложениях, которые хранят изображения в базах данных. Ведь двоичные данные могут содержать любой символ, и поэтому их нельзя обрабатывать запросами в том виде, в каком они есть. Для рещения этой проблемы воспользуйтесь функцией mysql escape string (), которая кодирует специальные символы с помощью кавычек. Функция mysql escape string О рассматривает как специальные следующие символы; символ NULL , одинарную и двойную кавычки, обратную косую черту, символ новой строки, символ возврата каретки <Cntl-Z> . (Последний символ присущ ОС Windows.) В каком случае может использоваться mysql escape string () ? Самым безопасным ответом будет всегда . Однако, если есть уверенность в данных и все нормально (возможно, потому, что вы выполнили предварительную проверку), необходимость в кодировке данных отпадает. Например, нет необходимости в вызове mysql escape string О при работе со строками, которые, как известно, должны представлять телефонные номера, состоящие только из цифр и тире. В противном случае, вероятно, в этом существует определенная необходимость.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |