Основы программирования в Linux - Мэтью Нейл
int get_cd(int cd_id, struct current_cd_st *dest) { MYSQL_RES *res_ptr; MYSQL_ROW mysqlrow; int res; char qs[250]; if (!dbconnected) return 0; memset(dest, 0, sizeof(*dest)); dest->artist_id = -1; sprintf(qs, "SELECT artist.id, cd.id, artist.name, cd.title, cd.catalogue FROM artist, cd WHERE artist.id = cd.artist_id and cd.id = %d", cd_id); res = mysql_query(&my_cormection, qs); if (res) { fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection)); } else { res_ptr = mysql_store_result(&my_connection); if (res_ptr) { if (mysql_num_rows(res_ptr) > 0) { if (mysqlrow = mysql_fetch_row(res_ptr)) { sscanf(mysqlrow[0], "%d", &dest->artist_id); sscanf(mysqlrow[1], "%d", &dest->cd_id); strcpy(dest->artist_name, mysqlrow[2]); strcpy(dest->title, mysqlrow[3]); strcpy(dest->catalogue, mysqlrow[4]); } } mysql_free_result(res_ptr); } } if (dest->artist_id != -1) return 1; return 0;} /* get_cd */Далее вы реализуете извлечение информации о дорожках. В SQL-операторе вы задаете ключевые слова
ORDER BYint get_cd_tracks(int cd_id, struct current_tracks_st *dest) { MYSQL_RES *res_ptr; MYSQL_ROW mysqlrow; int res; char qs[250]; int i = 0, num_tracks = 0; if (!dbconnected) return 0; memset(dest, 0, sizeof(*dest)); dest->cd_id = -1; sprintf(qs, "SELECT track_id, title FROM track WHERE track.cd_id = %d ORDER BY track_id", cd_id); res = mysql_query(&my_connection, qs); if (res) { fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection)); } else { res_ptr = mysql_store_result(&my_connection); if (res_ptr) { if ((num_tracks = mysql_num_rows(res_ptr)) > 0) { while (mysqlrow = mysql_fetch_row(res_ptr)) { strcpy(dest->track[i], mysqlrow[1]); i++; } dest->cd_id = cd_id; } mysql_free_result(res_ptr); } } return num_tracks;} /* get_cd_tracks */До сих пор вы добавляли и извлекали информацию о компакт-дисках. Вы добились простоты интерфейса, ограничив число результатов, которые могут быть возвращены, но вам все же нужна собственная функция, сообщающая о том, сколько строк в результирующем наборе, даже если их больше, чем вы можете извлечь.
int find_cds(char *search_str, struct cd_search_st *dest) { MYSQL_RES *res_ptr; MYSQL_ROW mysqlrow; int res; char qs[500]; int i = 0; char ss[250]; int num_rows = 0; if (!dbconnected) return 0;Очистите структуру, хранящую результат, и защитите ее от специальных символов в строке запроса:
memset(dest, -1, sizeof(*dest)); mysql_escape_string(ss, search_str, strlen(search_str));Далее вы формируете строку запроса. Обратите внимание на необходимость применения большого количества символов
%%sprintf sprintf(qs, "SELECT DISTINCT artist.id, cd.id FROM artist, cd WHERE artist.id = cd.artist_id and (artist.name LIKE '%%%s%%' OR cd.title LIKE '%%%s%%' OR cd.catalogue LIKE<i> '%%%s%%')",</i> ss, ss, ss);Сейчас можно выполнить запрос:
res = mysql_query(&my_connection, qs); if (res) { fprintf(stderr, "SELECT error: %sn", mysql_error(&my_connection)); } else { res_ptr = mysql_store_result(&my_connection); if (res_ptr) { num_rows = mysql_num_rows(res_ptr); if (num_rows > 0) { while ((mysqlrow = mysql_fetch_row(res_ptr)) && i < MAX_CD_RESULT) {