По какой-то причине мой код 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);
На основе ссылочной страницы 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()
, чтобы увидеть фактическое количество строк в наборе результатов. Я подозреваю, что ваш запрос приводит к двум строкам.
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)))
...
}