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

1 ... 99 100 101 [ 102 ] 103 104 105 ... 264


функция mysql escape string () кодирует проблемные символы в символьные последовательности, состоящие из двух символов, начинающиеся с обратной косой черты. Так, байт null преобразуется в \0 , где символ О является обычным печатаемым символом ноль в кодировке ASCII. А символы обратной косой черты, одинарная и двойная кавычка становятся \\ , \ и \ .

Функция mysql escape string () вызывается следующим образом:

to len = mysql escape string (to str, from str, from len);

Функция mysql escape string() кодирует from str и записывает результат в tostr. Кроме того, она добавляет символ null в конец строки. Это очень удобно, так как полученную строку можно будет обрабатывать функциями strcpy() и strlen ().

Переменная f romstr содержит указатель на буфер типа char, в котором хранятся данные, предназначенные для кодировки. Эта строка может содержать все что угодно, включая двоичные данные. Переменная tostr содержит указатель на существующий буфер типа char, куда и будет записываться закодированная строка. Ни в коем случае не передавайте не проинициализированный указатель или указатель, содержащий значение null . Функция mysql escape string () сама не вьщеляет память. Длина буфера, адрес которого содержит tostr, должна быть по крайней мере (from len*2) +1 байт. (Вполне возможно, что каждый символ в f romstr потребует кодировки двумя символами; плюс еще один байт для символа null в конце строки.)

Переменные fromlen и tolen являются переменными типа unsigned int, from len содержит длину данных в from str. Эту длину необходимо знать потому, что строка fromstr может содержать пустые байты, которые нельзя рассматривать как символ конца строки. Значение to len, возвращаемое функцией mysql escape string (), является реальной длиной полученной закодированной строки, не считая символа null в конце строки.

Функция mysql escape string () возвращает закодированную результирующую строку в tostr, которую можно обрабатывать как строку с символом null в конце, так как любое пустое значение, которое присутствовало в строке fromstr, кодируется в виде последовательности символов \0 .

Для того чтобы переписать профаммный код, консфуирующий оператор select так, чтобы он мог безошибочно преобразовывать даже имена, содержащие кавычки, необходимо сделать что-то вроде:

char query[1024] , *р;

р = strcpy (query, SELECT * FROM my tbl WHERE name= ); p += strlen (p);

p += mysql escape string (p, name, strlen (name)); p = strcpy (p, ) ;



Да, этот код можно немного упростить, применив второй буфер:

char query(1024], buf(1024];

(void) mysql escape string (but, name, strlen (name)); sprintf (query, SELECT * FROM my tbl WHERE name=%s , but);

Обработка изображений

Основное назначение функции mysql escape string () - зафузка изображений в таблицы. Этот раздел полностью посвящен этой теме. (Материал, изложенный здесь, можно также применить и для других типов двоичных данных.)

Предположим, что вы хотите прочесть изображения, хранящиеся в файле, и сохранить их с каким-то уникальным идентификатором в таблице. Для хранения двоичных данных лучще всего подходит тип blob, поэтому для этой цели можно воспользоваться такой спецификацией таблицы:

CREATE TABLE images (

image id INT NOT NULL PRIMARY KEY, image data BLOB )

При заданных идентификационном номере и указателе на открытый файл, содержащем данные изображения, загрузку двоичных данных в таблицу можно выполнить, воспользовавщись функцией load image ():

load image (MYSQL *conn, int id, FILE *f) {

char query[1024*100], but[1024* 10], *p;

unsigned int from len; int status;

sprintf (query, INSERT INTO images VALUES (%d, , id); p = query + strlen (query);

while ({from len = fread (buf, 1, sizeof (but), f)) > 0) {

/* не выходите за границы буфера запроса! */

if (р + (2*from len) + 3 > query + sizeof (query))

print error (NULL, изображение слишком велико ); return (1);

p += mysql escape string (p, buf, from len);

(void) strcpy (p, ) );

status = mysql query (conn, query);

return (status);

Функция loadimage () не располагает очень большим буфером (100 Кбайт) для хранения изображений, поэтому она предназначается,



прежде всего, для небольших изображений. В реальном приложении буфер можно разместить динамическим способом, основываясь на размере файла изображения.

Задача обработки изображений (как и любых других двоичных данных) не настолько трудна как, скажем, задача загрузки их в базу данных, так как значения данных можно получить в переменной mysql row, а длину этих данных можно получить с помощью функции mysql fetch lengths О. Только необходимо убедиться в том, что это строки с известной длиной, а не Офаниченные символом null .

Получение информации из таблицы

с помощью одного из запросов СУБД MySQL позволяет получить информацию о структуре таблиц:

DESCRIBE tbl name

SHOW FIELDS FROM tbl nain, e

Оба оператора подобны оператору select, так как они возвращают результирующий набор. Для того чтобы получить информацию о структуре таблицы, все, что надо сделать - это обработать строки результирующего набора данных. Например, оператор describe images возвратит следующую информацию.

1 Field

Type

1 Null 1 Key

Default

1--+

Extra 1

1 image id 1 image data

intdl) blob

1 1 PRI 1 1 PRI +-+-

¥-+

При выполнении такого же запроса с клиентского места будет получена аналогичная информация (но уже без рамки).

Для получения информации только об одном столбце выполните запрос:

SHOW FIELDS FROM tbl name LIKE coi narae

Этот запрос вернет аналогичные столбцы, но только одну сфоку (или ничего не вернет, если такой столбец отсутствует).

Наиболее часто встречающиеся ошибки при программировании клиентских программ

в этом разделе описаны некоторые наиболее популярные ошибки, происходящие в процессе профаммирования на языке С с использованием интерфейса MySQL С API, и методы, помогающие их избежать. (Эти проблемы часто обсуждаются на Web-узле MySQL, и я не буду их скрывать.)



1 ... 99 100 101 [ 102 ] 103 104 105 ... 264

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