MYSQL_ROW и строка [0] в строковый тип?

При использовании MYSQL C API для запроса результатов. Результаты возвращаются как тип MYSQL_ROW, который, согласно документации API MYSQL C, я легко могу printf("%s", row[0]). Но что, если я хочу передать содержимое row[0] в виде строки или символа *?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
2 575
3

Ответы 3

Вы можете использовать sprintf (), но вам все равно нужно знать длину строки, содержащейся в row [0], чтобы вы могли выделить достаточно памяти.

Предостережение: BCS правильно указывает, что ваши данные будут усечены, если строка [0] содержит лишние нулевые байты. Если вы знаете, сколько данных хранится в строке [0], использование memcpy (), вероятно, будет лучшим решением.

Однако имейте в виду, что если вы это сделаете, он остановится на первом \ 0

BCS 09.11.2008 02:20

Формат% s должен принимать только char *, поэтому из вашего описания похоже, что MYSQL_ROW действительно char **, а принятие row [0] в любом случае даст char *.

Я не понимаю, как использование sprintf () (или более безопасного, но нестандартного asprintf ()) принесет какую-либо пользу, но вы можете подумать об этом, если вам станет легче.

Кажется, что любая форма манипуляции дает мне ошибку во время выполнения. преобразование его в строку, strcpy, sprintf и т. д. и т. д. Так что кто-нибудь нашел способ? Трудно поверить, что API позволит пользователям только получать результаты и распечатывать их, но не позволяет сохранять их в памяти.

Steve 09.11.2008 02:57

But what if I want to transfer the contents of row[0] into a string or a char*?

Используйте mysql_fetch_lengths, чтобы определить длину массива в MYSQL_ROW. Поскольку в строке 1 или несколько столбцов, длина может быть 1 или более.

Согласно документации 27.8.5 Структуры данных C API:

MYSQL_ROW

This is a type-safe representation of one row of data. It is currently implemented as an array of counted byte strings. (You cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) Rows are obtained by calling mysql_fetch_row().

Затем в документации mysql_fetch_row приводится этот пример:

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i],
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

Вот пример его использования для подсчета строк в таблице. Таблица была заполнена из Нарушения "Не звонить" FTC.

MYSQL_RES* res = NULL;
MYSQL row;

const char SELECT_STMT[] = "SELECT COUNT(*) FROM blacklist_ftc";
if (mysql_query(mysql, SELECT_STMT) != 0)
{
    /* handle error */
    goto finish;
}

if ((res = mysql_store_result(s_mysql)) == NULL)
{
    /* handle error */
    goto finish;
}

if (mysql_num_fields(res) != 1 || mysql_num_rows(res) != 1)
{
    /* handle error */
    goto finish;
}

char buf[32];
unsigned long* length;

row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res);

if (row == NULL || length == NULL)
{
    /* handle error */
    goto finish;
}

size_t size = length[0] < sizeof(buf)-1 ? length[0] : sizeof(buf)-1;
memcpy(buf, row[0], size);
buf[size] = '\0';

unsigned long count = (unsigned long)atoi(buf);

finish:

if (res)
{
    mysql_free_result(res);
    res = NULL;
}

Другие вопросы по теме