2017-07-23 1 views
0

J'ai la requête suivante qui est stockée dans le tampon, puis est exécutée en utilisant ma propre conn.executeQuery().MySQL et varargs

char buffer[QUERY_MAX]; 
snprintf(buffer, QUERY_MAX, "SELECT * FROM players WHERE player_id = %d", 1); 
conn.executeQuery(buffer); 

Bien que cela fonctionne très bien, je me demande si elle peut être simplifiée comme quelque chose de similaire à ...

conn.executeQuery("SELECT * FROM players WHERE player_id = "%d", 1); 

Ma fonction:

bool SQLConnection::executeQuery(const char *query) 
{ 
// Validate connection. 
if (!m_connected) 
    return false; 

// Execute the query 
int status = mysql_query(&m_conn, query); 

if (status != 0) { 
    sprintf(m_errorMessage, "Error: %s", mysql_error(&m_conn)); 
    return false; 
} 

// Store the result 
m_result = mysql_store_result(&m_conn); 

return true; 
} 

Je suis au courant de varargs, et j'ai essayé de suivre l'exemple ici (Variable number of arguments in C++?), mais je ne cherche pas simplement à lire les varargs, mais à les inclure dans la requête, ce qui est apparemment gênant pour moi.

Toutes les pensées sont les bienvenues, merci.

Répondre

1

Vous avez besoin d'une déclaration préparée à la place, comme le

suivant
MYSQL_STMT *stmt; 
MYSQL_BIND params[1 /* Here it will be the number of arguments */]; 
MYSQL_BIND result[1 /* Here it will be the number of columns in the result row */]; 
int value; 
const char *query; 
int id; 

memset(params, 0, sizeof params); 
memset(result, 0, sizeof result); 
// Assuming `mysql' is an initialized MYSQL object 
stmt = mysql_stmt_init(mysql); 
if (stmt == NULL) 
    return 
// `SELECT ID' just to illustrate how you can select an integer 
//    value 
query = "SELECT ID FROM players WHERE player_id = ?"; 
if (mysql_stmt_prepare(stmt, query, strlen(query)) != 0) 
    goto error; 
value = 1; 

result[0].buffer_type = MYSQL_TYPE_LONG; 
result[0].buffer = &id; 

params[0].buffer_type = MYSQL_TYPE_LONG; 
params[0].buffer = &value; 
if (mysql_stmt_bind_param(stmt, params) != 0) 
    goto error; 
if (mysql_stmt_bind_result(stmt, result) != 0) 
    goto error; 
if (mysql_stmt_execute(stmt) != 0) 
    goto error; 
if (mysql_stmt_fetch(stmt) != 0) 
    goto error; 
// Now all the columns are in the buffers of `result' 
// or the bound variables (which is why we pass their address) 
fprintf(stdout, "%d\n", id); 

error: 

mysql_stmt_close(stmt);