Проблема с обработкой результата запроса SELECT в MYSQL C API - PullRequest
0 голосов
/ 14 октября 2018

Я получаю внутреннюю ошибку сервера с одним из моих сценариев.Я использую MYSQL C API.https://dev.mysql.com/doc/refman/5.6/en/c-api.html

Вот соответствующая часть моего скрипта:

MYSQL *con;
MYSQL_RES *result;
MYSQL_ROW robe;

con = mysql_init(NULL);
if (!mysql_real_connect(valid values)) {
printf("Content-type: text/html\n\n");
printf("Could not connect\n");
exit(0); }

char somequery[512];
//userinput is sanitized beforehand
int sog = sprintf(somequery, "SELECT password from testtab WHERE username='%s'", userinput);

if (sog < 0) {
printf("Content-type: text/html\n\n");
printf("Something went wrong with Sprintf\n");
exit(0); }

int bos = mysql_real_query(con, somequery, strlen(somequery));
if (bos != 0) {
printf("Content-type: text/html\n\n");
printf("The query produced no result\n");
exit(0); }

result = mysql_store_result(con);
if (result == NULL) {
printf("Content-type: text/html\n\n");
printf("No Result Set Produced\n");
exit(0); }

robe = mysql_fetch_row(result);
char *passdb = robe[0];
printf("Content-type: text/html\n\n");
printf("And it is: %s", passdb);

HTML-форма отправляется через POST в этот скрипт (часть которого показана выше).Когда я отправляю имя пользователя, которое существует в базе данных заранее, я не получаю сообщение об ошибке.Все отлично работает

Проблема возникает, когда я отправляю имя пользователя, которого нет в указанной таблице (testtab).Ну, я получаю 500 Внутренняя ошибка сервера.Я также посмотрел журнал ошибок Apache: «Конец вывода скрипта перед заголовками».

Я пробовал несколько вещей, но ни одна из них не сработала.Любая помощь приветствуется.

Примечание: выполнение mysql_num_fields (результат);в обоих случаях дает 1.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я нашел решение в другом месте, благодаря помощи некоторых хороших людей.Кажется, что я сделал глупую ошибку, а также нуждался в глубоком понимании разницы между двумя функциями MYSQL C API.

Я пишу ответ здесь, в надежде, что он принесет пользу другим.

Здесь есть ошибки:

 robe = mysql_fetch_row(result);

Хотя это само по себе правильно.Я не могу проверить его результат.Что происходит, когда SQL-запрос выполняется с использованием имени пользователя, которого раньше не было в БД, результатом является пустой набор (а не ошибка).

mysql_store_result и mysql_fetch_row имеют небольшую разницу здесь.Хотя первый не вернет NULL, если набор пуст, последний будет.

Все, что мне нужно сделать, это добавить проверку после строки выше с логикой:

if (robe == NULL) { 
//error occured 
} else { //go on 
}
0 голосов
/ 14 октября 2018

Во-первых, вы НИКОГДА не должны хранить пароли в базе данных, особенно тот, который доступен через онлайн-сервис.exit(0) указывает на успех.Это также закорачивает ваш вывод до его завершения.Вы не можете просто вызвать exit (0) в середине процесса вывода.Вместо этого используйте какую-то строку «данные недоступны».

...