Очистите структуру, хранящую результат, и защитите ее от специальных символов в строке запроса:
memset(dest, -1, sizeof(*dest));
mysql_escape_string(ss, search_str, strlen(search_str));
Далее вы формируете строку запроса. Обратите внимание на необходимость применения большого количества символов %
, т.к. знак %
— это и символ, который необходимо включить в SQL-оператор для указания соответствия любой строке и специальный символ в функции 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
Сейчас можно выполнить запрос:
res = mysql_query(&my_connection, qs);
if (res) {
fprintf(stderr, "SELECT error: %s\n", 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) {
sscanf(mysqlrow[1], "%d", &dest->cd_id[i]);
i++;
}
}
mysql_free_result(res_ptr);
}
}
return num_rows;
} /* find_cds */
Последнее, но не по значимости, — ваша реализация способа удаления компакт-дисков. В соответствии с политикой скрытого управления элементами таблицы исполнителей вы будете удалять исполнителя заданного компакт-диска, если нет других дисков с той же самой строкой исполнителя. Удивительно, но в языке SQL нет средств описания удаления из нескольких таблиц, поэтому вы должны удалять данные из каждой таблицы по очереди:
int delete_cd(int cd_id) {
int res;
char qs[250];
int artist_id, num_rows;
MYSQL_RES *res_ptr;
MYSQL_ROW mysqlrow;
if (!dbconnected) return 0;
artist_id = -1;
sprintf(qs, "SELECT artist_id FROM cd WHERE artist_id = \
(SELECT artist_id FROM cd WHERE id = '%d')", cd_id);
res = mysql_query(&my_connection, qs);
if (res) {
fprintf(stderr, "SELECT error: %s\n", 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 == 1) {
/* Исполнитель не упоминается в других CD */
mysqlrow = mysql_fetch_row(res_ptr);
sscanf(mysqlrow[0], "%d", &artist_id);
}
mysql_free_result(res_ptr);
}
}
sprintf(qs, "DELETE FROM track WHERE cd_id = '%d'", cd_id);
res = mysql_query(&my_connection, qs);
if (res) {
fprintf(stderr, "Delete error (track) %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
return 0;
}
sprintf(qs, "DELETE FROM cd WHERE id = '%d'", cd_id);
res = mysql_query(&my_connection, qs);
if (res) {
fprintf(stderr, "Delete error (cd) %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
return 0;
}
if (artist_id != -1) {
/* Теперь элемент artist не связан ни с одним CD, удалите его */
sprintf(qs, "DELETE FROM artist WHERE id = '%d'", artist_id);
res = mysqlquery(&my_connection, qs);
if (res) {
fprintf(stderr, "Delete error (artist) %d: %s\n",
mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
return 1;