在MYSQL C API中处理SELECT查询结果的问题

我的一个脚本出现了内部服务器错误。 我正在使用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。

首先,您绝不应将密码存储在数据库中,尤其是可通过在线服务访问的数据库。 exit(0)表示成功。 它还会在输出完成之前使输出短路。 您不能只在生成输出的过程中调用exit(0)。 请改用某种“数据不可用”字符串。

在一些好人的帮助下,我在其他地方找到了解决方案。 看来,我犯了一个愚蠢的错误,并且需要彻底了解两个MYSQL C API函数之间的区别。

我在这里写答案,希望它能让别人受益。

错误在这里:

  robe = mysql_fetch_row(result); 

虽然它本身是正确的。 我没有检查其结果。 发生的事情是,当使用事先不存在于DB中的用户名执行SQL查询时,结果是空集(而不是错误)。

mysql_store_result和mysql_fetch_row在这里略有不同。 虽然前者在集合为空时不会返回NULL,但后者将为空。

我所要做的就是在逻辑上面的行之后添加一个检查:

 if (robe == NULL) { //error occured } else { //go on }