int mysql_stmt_execute(MYSQL_STMT *stmt)
Description
mysql_stmt_execute()
exécute la requête
préparée, associée avec le pointeur 'stmt'. Les valeurs des
marqueurs de paramètres seront envoyées au serveur durant
cet appel, pour que le serveur remplace les marqueurs avec les
nouvelles valeurs.
Si la commande est UPDATE, DELETE ou INSERT, le nombre total
de lignes changées, modifiées ou insérées est accessible
avec la fonction mysql_stmt_affected_rows
.
Si la requête retourne un résultat, alors vous devez appeler
la fonction mysql_stmt_fetch()
pour lire
les données avant d'appeler tout autre fonction de traitement
du résultat. Pour plus d'informations sur comment lire les
données binaires, voyez aussi
Section 24.2.7.13, « mysql_stmt_fetch()
».
Valeurs retournées
Zéro si l'exécution a réussi. Non-zéro si une erreur est
survenue. Le code d'erreur et le message peuvent être obtenus
en appelant les fonctions
mysql_stmt_errno()
et
mysql_stmt_error()
.
Erreurs
CR_COMMANDS_OUT_OF_SYNC
Commands were executed in an improper order : les commandes ont été exécutées dans un ordre invalide.
CR_OUT_OF_MEMORY
Out of memory : plus de mémoire.
CR_SERVER_GONE_ERROR
The MySQL server has gone away : le serveur MySQL s'est éteint.
CR_SERVER_LOST
The connection to the server was lost during the query : la connexion a été perdue durant la requête.
CR_UNKNOWN_ERROR
An unknown error occurred : une erreur inconnue est survenue.
Exemple
L'exemple suivant explique l'utilisation de
mysql_prepare
,
mysql_param_count
,
mysql_bind_param
,
mysql_stmt_execute
et
mysql_stmt_affected_rows()
.
MYSQL_BIND bind[3]; MYSQL_STMT *stmt; ulonglong affected_rows; long length; unsigned int param_count; int int_data; short small_data; char str_data[50], query[255]; my_bool is_null; /* Passe en mode d'auto commit */ mysql_autocommit(mysql, 1); if (mysql_query(mysql,"DROP TABLE IF EXISTS test_table")) { fprintf(stderr, "\n suppression de table a échoué"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } if (mysql_query(mysql,"CREATE TABLE test_table(col1 int, col2 varchar(50), \ col3 smallint,\ col4 timestamp(14))")) { fprintf(stderr, "\n la création de table a échoué"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } /* Prepare une requête d'insertion de trois paramètres */ strmov(query, "INSERT INTO test_table(col1,col2,col3) values(?,?,?)"); if(!(stmt = mysql_prepare(mysql, query, strlen(query)))) { fprintf(stderr, "\n la prépartion de l\'insertion a échoué"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } fprintf(stdout, "\n la préparation de l\'insertion a réussi"); /* Lit le nombre de paramètres de la requête */ param_count= mysql_param_count(stmt); fprintf(stdout, "\n total parameters in insert: %d", param_count); if (param_count != 3) /* valide le nombre de paramètres */ { fprintf(stderr, "\n le nombre de paramètres retourné par MySQL est invalide"); exit(0); } /* Lie les données aux paramètres */ /* INTEGER PART */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= 0; bind[0].length= 0; /* STRING PART */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= sizeof(str_data); bind[1].is_null= 0; bind[1].length= 0; /* SMALLINT PART */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null; bind[2].length= 0; is_null= 0; /* Lie les buffers */ if (mysql_bind_param(stmt, bind)) { fprintf(stderr, "\n param bind failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Spécifie les données */ int_data= 10; /* integer */ strcpy(str_data,"MySQL"); /* string */ /* INSERT SMALLINT data as NULL */ is_null= 1; /* Exécute la requête */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n l\'exécution 1 a échoué"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre de lignes affectées */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, "\n total affected rows: %lld", affected_rows); if (affected_rows != 1) /* validation du nombre de lignes affectées */ { fprintf(stderr, "\n nombre de lignes affectées par MySQL invalide"); exit(0); } /* Ré-exécute l'insertion, en modifiant les valeurs */ int_data= 1000; strcpy(str_data,"La base de données Open Source la plus populaire"); small_data= 1000; /* smallint */ is_null= 0; /* remet à zéro NULL */ /* Exécute l'insertion : 2eme */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n la deuxième exécution a échoué"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre total de lignes affectées */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, "\n Nombre de lignes affectées : %lld", affected_rows); if (affected_rows != 1) /* valide le nombre de lignes affectées */ { fprintf(stderr, "\n Nombre de lignes affectées invalides"); exit(0); } /* Ferme la requête */ if (mysql_stmt_close(stmt)) { fprintf(stderr, "\n erreur lors de la fermeture de la commande"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Efface la table */ if (mysql_query(mysql,"DROP TABLE test_table")) { fprintf(stderr, "\n suppression de table échouée"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } fprintf(stdout, "Bravo! les commandes préparées MySQL fonctionnent!!");
Note : pour des exemples
complets sur l'utilisation des commandes préparées, voyez le
fichier tests/mysql_client_test.c
. Ce
fichier est disponible dans la distribution source de MySQL,ou
dans le serveur BitKeeper.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.