PDA

View Full Version : [C] Come usare Prepared Statement con "mysql.h"


lorien3
05-01-2012, 11:26
salve a tutti,
vorrei riuscire a capire come poter utilizzare i prepared statement... ho letto la documentazione (http://dev.mysql.com/doc/refman/5.6/en/mysql-stmt-execute.html) ma sinceramente anche seguendo il loro codice ci ho capito ben poco... cmq vi metto un codice di esempio per riuscire a capire dove sbaglio
//mi connetto al database
conn = mysql_init(NULL);

//preparo la query
sprintf(myquery,"SELECT password FROM accesso WHERE id_doc=?");

//inizializzo lo statement
stmt = mysql_stmt_init(conn);
mysql_stmt_prepare(stmt, myquery, strlen(myquery))

//conto i parametri, in questo caso 1 solo, passaggio fatto solo per la verifica
param_count= mysql_stmt_param_count(stmt);

//preparo l'unico parametro che è una stringa
memset(bind, 0, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].buffer= (char *)str_data;
bind[0].buffer_length= 10;
bind[0].is_null= 0;
bind[0].length= &str_length;
mysql_stmt_bind_param(stmt, bind)

//setto il parametro (anche se questo passaggio a senso dovrebbe essere fatto prima, ma così dice la documentazione)
strncpy(str_data, "123", 10); /* string */
str_length= strlen(str_data);

//eseguo la query
mysql_stmt_execute(stmt)

//prendo i risultati
res = mysql_use_result(conn);

//li stampo
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s \n", row[1]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);



il grosso problema è che quando vado a stampare mi da segmentation fault proprio perchè non ci sono risultati... :(

se riuscite a darmi una mano ve ne sarei molto molto grato!!!

lorien3
05-01-2012, 12:11
Risolto!!! :)
Questo (http://lgallardo.com/en/2011/06/23/sentencias-preparadas-de-mysql-en-c-ejemplo-completo/) è il link dove ho trovato un esempio che mi ha illuminato... praticamente sbagliavo a prendere i risultati... devono anch'essi essere trattati come parametri bind...
dato che ho fatto la prova solo con degli int spero che nn sorgano problemi con le stringhe :)

lorien3
05-01-2012, 15:25
Sembrava Risolto...
sono riuscito a scrivere e a far andare il codice ma non capisco per quale motivo mi da 0 risultati quando invece nel mio database ce ne sono 2...

here is my code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>

#define STRING_SIZE 50

#define SELECT_SAMPLE "select p.id_paz from pazienti p where p.id_doc = ?"

int main(void)
{
MYSQL *conn;
MYSQL_STMT *stmt;
MYSQL_BIND pbind[1],result[1]; /* results */
unsigned long length;
int row_count;
char login[STRING_SIZE];
my_bool is_null;

//MYSQL_BIND pbind[2]; /* parameters */
unsigned long plength;
char *pdata;
my_bool p_is_null;


// Open Database
const char *server = "localhost";
char *user = "root";
char *password = "password"; /* set me first */
char *database = "ProgettoSi";
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

// Allocate statement handler
stmt = mysql_stmt_init(conn);
if (!stmt)
{
fprintf(stderr, " mysql_stmt_init(), out of memory\n");
exit(0);
}
if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE)))
{
fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
fprintf(stdout, " prepare, SELECT successful\n");

plength = STRING_SIZE * sizeof(char);
p_is_null = 0;
pdata = (char*)malloc( STRING_SIZE * sizeof(char) );

/* STRING PARAMETER */
pbind[0].buffer_type= MYSQL_TYPE_STRING;
pbind[0].buffer= (char *)pdata;
pbind[0].buffer_length=STRING_SIZE * sizeof(char);
pbind[0].is_null= &p_is_null;
pbind[0].length= &plength;


if( mysql_stmt_bind_param( stmt, pbind ) ) {
fprintf( stderr, " mysql_stmt_bind_param() failed\n" );
fprintf( stderr, " %s\n", mysql_stmt_error( stmt ) );
exit(0);
}
mysql_real_escape_string( conn, pdata, "123", strlen("123")*sizeof(char) );
plength = strlen( pdata ) + 1;

printf( "Executing query with parameters %s. \n", pdata);
/* Execute the SELECT query */
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, " mysql_stmt_execute(), failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}

/* Bind the result buffers for all 4 columns before fetching them */

result[0].buffer_type= MYSQL_TYPE_STRING;
result[0].buffer= (char *)login;
result[0].buffer_length= STRING_SIZE;
result[0].is_null= &is_null;
result[0].length= &length;

if (mysql_stmt_bind_result(stmt, result))
{
fprintf(stderr, " mysql_stmt_bind_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}

if (mysql_stmt_store_result(stmt))
{
fprintf(stderr, " mysql_stmt_store_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}

row_count= 0;
fprintf(stdout, "Fetching results ...\n");
while (!mysql_stmt_fetch(stmt))
{
row_count++;
fprintf(stdout, " row %d\n", row_count);

/* column 2 */
fprintf(stdout, " column2 (string) : ");
if (is_null)
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %s(%ld)\n", login, length);

}

/* Validate rows fetched */
fprintf(stdout, " total rows fetched: %d\n", row_count);
/* Close the statement */
if (mysql_stmt_close(stmt))
{
fprintf(stderr, " failed while closing the statement\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
return 0;
}