Reputation: 43
I am trying to do a prepared statement in a c service everything appears to be fine until calling mysql_stmt_fetch() as it is returning 100 and i cannot find a reason for this in the mysql documentation?
Example Code:
int Check_Unique(char *sumin)
{
//DATABASE INFORMATION
MYSQL db;
MYSQL_STMT *stmt;
MYSQL_BIND param[1],result[1];
char *l_statement;
//CONNECTING TO THE DATABASE...
if(mysql_init (&db)==NULL)
{
if(gDEBUG==1){printf("\nFailed to connect to db\n");}
return(5);
}
if(mysql_real_connect(&db,DB_IP,DB_USERNAME,DB_PASSWORD,DB_DATABASE,0,NULL,0) == NULL)
{
return(5);
}
l_statement = "SELECT used FROM sumplace WHERE sumin = ? LIMIT 1;";
if(gDEBUG==1){printf("\nSQL: %s\n",l_statement);}
int result_data = -1;
unsigned long str_length;
unsigned long data_length;
stmt = mysql_stmt_init(&db);
if(!stmt)
{
if(gDEBUG==1){printf("\ninit Failed\n");}
mysql_close(&db);
return(-10);
}
if(mysql_stmt_prepare(stmt, l_statement, strlen(l_statement)) != 0)
{
if(gDEBUG==1){printf("\nstmt_prepare Failed : %s\n", mysql_stmt_error(stmt));}
mysql_close(&db);
return(-5);
}
memset(param, 0, sizeof(param));
memset(result, 0, sizeof(result));
param[0].buffer_type = MYSQL_TYPE_STRING;
param[0].buffer = (char *)sumin;
param[0].buffer_length = strlen(sumin);
param[0].is_null = 0;
param[0].length = &str_length;
result[0].buffer_type = MYSQL_TYPE_LONG;
result[0].buffer = (char *)&result_data;
result[0].buffer_length = 4;
result[0].is_null = 0;
result[0].length = &data_length;
if(gDEBUG ==1){printf("\n%s\n",(char *)param[0].buffer);}
if(mysql_stmt_bind_param(stmt, param)) //bind parameters
{
if(gDEBUG==1){printf("\nbind_param failed\n");}
mysql_close(&db);
return(-10);
}
if(mysql_stmt_bind_result(stmt, result) != 0) //bind results
{
if(gDEBUG==1){printf("\nbind_result Failed\n");}
mysql_close(&db);
return(-10);
}
if(mysql_stmt_execute(stmt) != 0) //execute statement
{
if(gDEBUG==1){printf("\nstatement execution Failed\n");}
mysql_close(&db);
return(-10);
}
if(gDEBUG==1) printf("result_data[%d]\n", result_data);
int i = mysql_stmt_fetch(stmt);
if(i == 0) //fetch data from return
{
if(gDEBUG==1) printf("Prepared Success result_data[%d]\n", result_data);
if(result_data == 0)
{
if(gDEBUG==1) printf("Sumin Valid!!!\n");
mysql_stmt_close(stmt);
mysql_close(&db);
return(1);
}
else if(result_data == 1)
{
if(gDEBUG==1) printf("Sumin Invalid!!!\n");
mysql_stmt_close(stmt);
mysql_close(&db);
return(3);
}
else
{
if(gDEBUG==1) printf("Sumin Invalid!!!\n");
mysql_stmt_close(stmt);
mysql_close(&db);
return(2);
}
}
else
{
if(gDEBUG==1){printf("\n%d\n", i);}
if(gDEBUG==1){printf("\nmysql_stmt_fetch Failed : %s\n", mysql_stmt_error(stmt));}
if(gDEBUG==1) printf("Prepared Failure/No Results Found\n");
}
mysql_stmt_close(stmt);
mysql_close(&db);
return(2);
}
Example Result:
SQL: SELECT sumin FROM sumwhere WHERE sumin = ? LIMIT 1; #### result_data[-1] 100 mysql_stmt_fetch Failed : Prepared Failure/No Results Found
Upvotes: 2
Views: 995
Reputation: 86651
I have some sympathy because the docs for mysql_stmt_fetch don't tell you the actual values for two of the possible return results. However, see this bug report with tells you that 100 means.
It means your search didn't return any results (MYSQL_NO_DATA).
Upvotes: 3