2. Извлечение данных.
3. Обработка этих данных.
4. Наведение порядка при необходимости.
Так же, как в случае операторов INSERT
и DELETE
, вы воспользуетесь функцией mysql_query
для отправки SQL-запроса. Далее вы извлечете данные о помощью функций mysql_store_result
или mysql_use_result
в зависимости от того, как хотите получить данные. Затем будет применена последовательность вызовов функции mysql_fetch_row
для обработки данных. И наконец, вы используете функцию mysql_free_result
для очистки памяти, которая применялась для выполнения вашего запроса.
Разница между функциями mysql_use_result
и mysql_store_result
в основном определяется тем, хотите ли вы получать данные построчно или весь набор за один шаг. Последний вариант больше подходит в том случае, когда вы рассчитываете на не слишком большой результирующий набор.
Вы сможете извлечь в единственном вызове все данные из оператора SELECT
(или другого оператора, возвращающего данные), применяя функцию mysql_store_result
:
MYSQL_RES *mysql_store_result(MYSQL* connection);
Ясно, что вам понадобится эта функция после успешного вызова функции mysql_query
. Она немедленно сохранит все возвращенные данные в клиентской части. Функция вернет указатель на новую структуру, называемую структурой результирующего набора, или NULL
, если оператор завершился аварийно.
В случае успеха вы далее вызываете функцию mysql_num_rows
для определения количества возвращенных записей, которое, мы надеемся, будет положительным числом, но может быть и 0, если ни одной строки не возвращено.
my_ulonglong mysql_num_rows(MYSQL_RES* result);
Эта функция принимает в качестве параметра структуру с результатом, возвращенную mysql_store_result
, и возвращает количество строк в данном результирующем наборе. Если функция mysql_store_result
завершилась успешно, функция mysql_num_rows
также завершится успешно.
Данная комбинация функций — легкий способ извлечь нужные вам данные. На этом этапе все данные локальны для программы-клиента и вам не нужно больше поддерживать подключение, связанное с возможностью возникновения ошибок в сети или базе данных. Получив количество возвращенных строк, вы упростите последующий программный код.
Если окажется, что вы должны работать с особенно большим набором данных, лучше извлекать меньшие по объему, более управляемые порции данных. В этом случае приложению быстрее передается управление, и использование сетевых ресурсов будет более щадящим. Мы рассмотрим этот вариант подробнее при обсуждении функции mysql_use_result
.
Теперь, когда у вас есть данные, можно обработать их с помощью функции mysql_fetch_row
и перемещаться по набору, используя функции mysql_data_seek
, mysql_row_seek
и mysql_row_tell
. Давайте рассмотрим их.
Функция mysql_fetch_row
извлекает одну строку из структуры типа result
, которую вы получили с помощью функции mysql_store_result
, и помещает ее структуру row
. Когда данные иссякли или возникла ошибка, возвращается NULL
. В следующем разделе мы вернемся к обработке данных в структуре типа row
.
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
Функция mysql_data_seek
позволяет перемещаться в результирующем наборе, задавая строку, которая будет возвращена при следующем вызове функции mysql_fetch_row
. Значение offset
— номер строки в диапазоне от нуля до общего количества строк в результирующем наборе, уменьшенного на единицу. Передача нулевого значения вызовет возврат первой строки при следующем вызове функции mysql_fetch_row
.
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
Функция mysql_row_tell
возвращает величину смещения, обозначая текущую позицию в результирующем наборе. Это не номер строки и его нельзя использовать в функции mysql_data_seek
.
MSSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
Но ее можно применять с функцией
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
MYSQL_ROW_OFFSET offset);
которая перемещает текущую позицию в результирующем наборе и возвращает предыдущую позицию.