После использования функции mysql_query() с запросом SELECT или любым другим запросом, возвращающим данные для обработки результирующего набора, возвращенного запросом, для сохранения результата его работы в какой-либо переменной и дальнейшей обработки, можно воспользоваться функцией mysql_store_result() .
Листинг 19.14.
/* получить результат */
result = mysql_store_result(&mysql);
Вызов функции mysql_store_result() с дескриптором соединения MySQL, дает пол­ный результирующий набор, возвращенный последним запросом, и сохраняет его в структуре MYSQL_RES. Затем эту структуру можно обработать с помощью функций MySQL, предназна­ченных для выборки и обработки отдельных записей и полей, их составляющих.
Когда размер не играет никакой роли
Функция mysql_store_result() производит выборку всего результирующего набора запроса с сервера и сохраняет результат в памяти компьютера клиента. Если такой вариант неприемлем, т.к. в качестве клиентского компьютера используется компьютер с незначительными объемами оперативной памяти, можно воспользоваться функцией mysql_use_result(), которая делает построчную выборку. Таким образом, вполне реально снизить расход памяти на компьютере клиента, т.к. при этом потребуется память для сохранения только одной строки (плюс буфер соединения), а не память под весь результирующий набор.
Так как функции mysql_store_result() и mysql_use_result() обрабатывают только результирующие наборы, не имеет никакого смысла вызывать эти функции для обработки таких операторов SQL, которые не возвращают никаких данных (операторы UPDATE или INSERT). Хотя в этом случае ничего страшного не случится, т.к. обе функции возвращают значение NULL.
Если при чтении результирующего набора, возвращенного функцией mysql_query(), никаких ошибок не возникает, функция mysql_store_result() возвращает значение NULL. Поэтому при работе с запросами SELECT, перед тем как продолжать обработку ре­зультирующего набора, целесообразно проверять возвращаемое этой функцией значение. Об этом свидетельствует следующий фрагмент.
Листинг 19.15.
/* проверка ошибок при чтении результирующего набора */ if (!(result =mysql_store_result(&mysql)))
{
fprintf(stderr, "При чтении результирующего набора произошла ошибка n");
exit();

 } 
После выполнения оператора SELECT и успешного получения результирующего набора, следующим и основным шагом будет обработка полученных данных, которая состоит в определении количества записей и полей в возвращенном результирующем наборе. Для этого служат функции mysql_num_rows() и mysql_num_fields() .
Листинг 19.16.
#include <stdio.h> #include <mysql.h> int main ()
{
/* объявить структуры данных и переменные */ MYSQL mysql; MYSQL_RES *result;
/* инициализировать структуру MYSQL */
mysql_init(&mysql);
/* подключиться к базе данных */
if (!(mysql_real_connect(&mysql, "localhost", "john", "doe",
"db1", 0, NULL, 0)))
{
fprintf(stderr, " Ошибка соединения: %sn", mysql_error(&mysql)) exit();
}
/* выполнить запрос */
if (mysql_query (&mysql, "SELECT title, author FROM books") != 0)
{
fprintf(stderr, " Ошибка в запросе: %sn", mysql_error(&mysql)); exit();
}
/* проверка правильности результирующего набора */
{
if (!(result = mysql_store_result(&mysql))
{
fprintf (stderr, " Ошибка при чтении результирующего набора: %sn", mysql_error (&mysql): exit();
}
else
{
/* если набор правильный */
/* просмотр строки и распечатка содержимого */ int numRecords = mysql_num_rows(result); int numFields = mysql_num_fields(result);
fprintf(stdout, " Запрос дал результат %d rowsn", numRecords); fprintf(stdout, "Каждая запись содержит %d полей n", num-
Fields);
}
mysql_free_result(result);
}
/* очистка */ mysql_close(&mysql);
При успешном выполнении запроса создается структура MYSQL_RES. Это можно проверить с помощью функций mysql_num_rows() и mysql_num_fields() при оп­ределении количества строк и столбцов. 
Определив количество строк и полей, для получения содержимого каждой строки в результирующем наборе, можно использовать функцию mysql_fetch_row() . Функция mysql_fetch_row() возвращает специальную структуру MYSQL_ROW, которая является индексированным массивом, представляющим поля в каждой строке. Поэтому становится возможным доступ к содержимому определенного поля как к соответствующему элементу массива.