Возникли проблемы с if и while ((row = mysql_fetch_row (query_results))! = 0)

0

По какой-то причине мой код C не работает. Код SQL верен, когда я запускаю его в phpmyadmin. Я получаю результаты, которые мне нужны, но если я запустил этот код, он кажется пустым. Теперь интересная часть - если я удалю

if((row = mysql_fetch_row(query_results)) !=0)

Затем выполняются циклы while, или если я удаляю

        while((row = mysql_fetch_row(query_results)) !=0)

Тогда я могу получить результаты. Не знаю, почему эти двое не могут работать вместе, но по отдельности они оба отлично работают.

    MYSQL_RES *query_results = mysql_store_result(conn);

    if (query_results) 
    { // make sure there *are* results..
        MYSQL_ROW row;

        if((row = mysql_fetch_row(query_results)) !=0)
        {

            while((row = mysql_fetch_row(query_results)) !=0)
            {

                printf("So far soo good 2\n");

                /* Set a float 'f' to the value in 'row[0]', or
                * 0.0f if it NULL */  
                char *result_miner =  row[0] ? row[0] : "NULL";
                char *result_algorithm =  row[1] ? row[1] : "NULL";
                char *result_url =  row[2] ? row[2] : "NULL";
                int result_port = row[3] ? atof(row[3]) : 1;    
                char *result_username =  row[4] ? row[4] : "NULL";
                char *result_password =  row[5] ? row[5] : "NULL";

                strcpy(miner, result_miner);
                strcpy(algorithm, result_algorithm);
                strcpy(url, result_url);
                strcpy(username, result_username);
                strcpy(password, result_password);
                port=result_port;


                    printf ("Miner Protocol is: %s\n", miner);
                    printf ("Algorithm is: %s\n", algorithm);
                    printf ("Mining URL  is: %s\n", url);
                    printf ("Mining Port is: %d \n", port);
                    printf ("Username is: %s \n", username);
                    printf ("Password is: %s \n", password);


            }


        }else{

            printf("Unable to locate active coin for hostname: %s", hostname);
            exit (-1);

            }

    /* Free results when done */
    mysql_free_result(query_results);
  • 0
    Что значит "это не работает"?
  • 0
    Результаты кажутся пустыми, как вы видите, я использую printf для вывода результатов, а они пустые
Показать ещё 13 комментариев
Теги:

1 ответ

2
Лучший ответ

На основе ссылочной страницы mysql_fetch_row вам нужно будет сделать следующее:

while((row = mysql_fetch_row(query_results)))
{
    printf("So far soo good 2\n");

    char *result_miner =  row[0] ? row[0] : "NULL";
    char *result_algorithm =  row[1] ? row[1] : "NULL";
    char *result_url =  row[2] ? row[2] : "NULL";
    int result_port = row[3] ? atof(row[3]) : 1;    
    char *result_username =  row[4] ? row[4] : "NULL";
    char *result_password =  row[5] ? row[5] : "NULL";
    ....
}

Нет необходимости добавлять, чтобы помещать while внутри if((row = mysql_fetch_row(query_results)) !=0), поскольку он будет потреблять одну строку, и если вы скажете, что ожидаете только одну строку, то это объясняет, почему вы видите нет значений.

В документации говорится, что если больше не может быть mysql_fetch_row, mysql_fetch_row вернет NULL. Вы говорите, что вы ожидаете 1 строку, но может быть, вы получите 2 строки, где у вас есть пустые значения. Перед в while петля вы можете использовать mysql_num_rows(), чтобы увидеть фактическое количество строк в наборе результатов. Я подозреваю, что ваш запрос приводит к двум строкам.

mysql_num_rows()

 my_ulonglong mysql_num_rows(MYSQL_RES *result)

Описание

Возвращает количество строк в результирующем наборе.

Использование mysql_num_rows() зависит от того, используете ли вы mysql_store_result() или mysql_use_result() для возврата набора результатов. Если вы используете mysql_store_result(), mysql_num_rows() может быть вызван немедленно. Если вы используете mysql_use_result(), mysql_num_rows() не возвращает правильное значение, пока не будут восстановлены все строки в наборе результатов.


редактировать

Как использовать mysql_num_rows.

MYSQL_RES *query_results = mysql_store_result(conn);

if(query_results)
{
    printf ("Number of rows: %lu\n",
            (unsigned long) mysql_num_rows(query_results));

    while((row = mysql_fetch_row(query_results)))
        ...
}

См. Также my_ulonglong 27.8.5 C Структуры данных API API.

  • 0
    Спасибо, не могли бы вы привести пример с num_rows, пожалуйста? Никогда не использовал эту функцию, я использую mysql_store_result ().
  • 0
    Я сделал обновление моего ответа. Вы должны прочитать документацию, я никогда не использовал C-интерфейс MySQL, но я нахожу документацию довольно ясной и легкой для понимания.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню