Heim  >  Artikel  >  Datenbank  >  Erste Schritte mit MySQL: Die Verwendung vorbereiteter Anweisungen

Erste Schritte mit MySQL: Die Verwendung vorbereiteter Anweisungen

黄舟
黄舟Original
2017-01-19 15:35:091965Durchsuche

Das MySQL-Client/Server-Protokoll stellt vorbereitete Anweisungen bereit. Diese Funktion verwendet die Datenstruktur des Anweisungshandlers MYSQL_STMT, die von der Initialisierungsfunktion mysql_stmt_init() zurückgegeben wird. Für Anweisungen, die mehrmals ausgeführt werden, ist die vorverarbeitete Ausführung eine effektive Möglichkeit. Zunächst wird die Anweisung analysiert, um die Ausführung vorzubereiten. Führen Sie als Nächstes ein oder mehrere Male später die Anweisung mit dem von der Initialisierungsfunktion zurückgegebenen Anweisungshandle aus.

Bei Anweisungen, die mehrmals ausgeführt werden, ist die Vorverarbeitungsausführung schneller als die direkte Ausführung. Der Hauptgrund dafür ist, dass nur ein Analysevorgang für die Abfrage ausgeführt wird. Bei der direkten Ausführung wird die Abfrage bei jeder Ausführung der Anweisung durchgeführt. Darüber hinaus wird der Netzwerkverkehr reduziert, da bei jeder Ausführung der vorbereiteten Anweisung nur die Parameterdaten gesendet werden.
Ein weiterer Vorteil vorbereiteter Anweisungen besteht darin, dass sie ein Binärprotokoll verwenden, wodurch die Datenübertragung zwischen Client und Server effizienter wird.

Ähnlich dem Platzhalterkonzept in Oracle! !
 
Allgemeine Schritte:

Verwenden Sie mysql_stmt_init(), um ein vorbereitetes Anweisungshandle zu erstellen. Um eine vorbereitete Anweisung auf dem Server vorzubereiten, rufen Sie mysql_stmt_prepare() auf und übergeben Sie ihm eine Zeichenfolge mit der SQL-Anweisung. Wenn die Anweisung eine Ergebnismenge generiert hat, rufen Sie mysql_stmt_result_metadata() auf, um die Metadaten der Ergebnismenge abzurufen. Obwohl diese Metadaten nicht mit einem Ergebnissatz identisch sind, der die von der Abfrage zurückgegebenen Spalten enthält, haben sie selbst die Form eines Ergebnissatzes. Der Metadaten-Ergebnissatz gibt an, wie viele Spalten im Ergebnis enthalten sind, und enthält Informationen zu jeder Spalte. Verwenden Sie mysql_stmt_bind_param(), um den Wert eines beliebigen Parameters festzulegen. Alle Parameter müssen eingestellt werden. Andernfalls gibt die Anweisungsausführung einen Fehler zurück oder führt zu unvorhersehbaren Ergebnissen. Rufen Sie mysql_stmt_execute() auf, um die Anweisung auszuführen. Wenn die Anweisung eine Ergebnismenge generiert hat, binden Sie den Datenpuffer und rufen Sie die Zeilenwerte ab, indem Sie mysql_stmt_bind_result() aufrufen. Daten werden Zeile für Zeile in den Puffer geholt, indem mysql_stmt_fetch() wiederholt aufgerufen wird, bis keine Zeilen mehr gefunden werden. Wiederholen Sie die Schritte 3 bis 6, indem Sie die Parameterwerte ändern und die Anweisung erneut ausführen.

Weitere Informationen finden Sie im Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <mysql/mysql.h>
#include <termios.h>
#define STRING_SIZE 50
#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
                                                 col2 VARCHAR(40),\
                                                 col3 SMALLINT,\
                                                 col4 TIMESTAMP)"
#define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)" 
int main(int arg, char *args[])
{
    int             ret = 0, i=0;
    MYSQL           *mysql;
    MYSQL           *connect;
    MYSQL_RES       *result;
    MYSQL_ROW       row;
    MYSQL_FIELD     *fields;
    unsigned int    num_fields;
    //if (arg < 4)
    //{
    //  printf("please enter: %s localhost user password dbname\n", args[0]);
    //  return -1;
    //}
    mysql = mysql_init(NULL);
    //连接到mysql server
    //connect = mysql_real_connect(mysql, args[1], args[2], args[3], args[4],0, 0, 0);
    //connect = mysql_real_connect(mysql, "localhost", "root", a, args[4],0, 0, 0);
    connect = mysql_real_connect(mysql, "localhost", "root", "123456", "mydb2", 0, NULL, 0 );
    if (connect == NULL)
    {
        printf("connect error, %s\n", mysql_error(mysql));
        return -1;
    }
    ret = mysql_query(connect, "SET NAMES utf8");       //设置字符集为UTF8
    if (ret != 0)
    {
        printf("设置字符集错误, %s\n", mysql_error(mysql));
        return ret;
    }
    MYSQL_STMT    *stmt;
    MYSQL_BIND    bind[3];
    my_ulonglong  affected_rows;
    int           param_count;
    short         small_data;
    int           int_data;
    char          str_data[STRING_SIZE];
    unsigned long str_length;
    my_bool       is_null;
    if (mysql_query(mysql, DROP_SAMPLE_TABLE))
    {
      fprintf(stderr, " DROP TABLE failed\n");
      fprintf(stderr, " %s\n", mysql_error(mysql));
      exit(0);
    }
    if (mysql_query(mysql, CREATE_SAMPLE_TABLE))
    {
      fprintf(stderr, " CREATE TABLE failed\n");
      fprintf(stderr, " %s\n", mysql_error(mysql));
      exit(0);
    }
    /* Prepare an INSERT query with 3 parameters */
    /* (the TIMESTAMP column is not named; the server */
    /*  sets it to the current date and time) */
    stmt = mysql_stmt_init(mysql); //初始化 预处理环境 生成一个预处理句柄
    if (!stmt)
    {
      fprintf(stderr, " mysql_stmt_init(), out of memory\n");
      exit(0);
    }
    if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE))) //预处理环境中 准备sql
    {
      fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
    fprintf(stdout, " prepare, INSERT successful\n");
    /* Get the parameter count from the statement */
    param_count= mysql_stmt_param_count(stmt);   //预处理环境中 求绑定变量的个数
    fprintf(stdout, " total parameters in INSERT: %d\n", param_count);
    if (param_count != 3) /* validate parameter count */
    {
      fprintf(stderr, " invalid parameter count returned by MySQL\n");
      exit(0);
    }
    /* Bind the data for all 3 parameters */
    memset(bind, 0, sizeof(bind));
    /* INTEGER PARAM */   
    /* This is a number type, so there is no need to specify buffer_length */
    bind[0].buffer_type= MYSQL_TYPE_LONG;  //为第一个绑定变量设置类型和 输入变量的内存首地址
    bind[0].buffer= (char *)&int_data;
    bind[0].is_null= 0;
    bind[0].length= 0;
    /* STRING PARAM */
    bind[1].buffer_type= MYSQL_TYPE_STRING; //为第2个绑定变量设置类型和 输入变量的内存首地址
    bind[1].buffer= (char *)str_data;
    bind[1].buffer_length= STRING_SIZE;
    bind[1].is_null= 0;
    bind[1].length= &str_length;
    /* SMALLINT PARAM */
    bind[2].buffer_type= MYSQL_TYPE_SHORT; //为第3个绑定变量设置类型和 输入变量的内存首地址
    bind[2].buffer= (char *)&small_data;
    bind[2].is_null= &is_null;
    bind[2].length= 0;
    /* Bind the buffers */
    if (mysql_stmt_bind_param(stmt, bind)) //把绑定变量设置到 预处理环境中
    {
      fprintf(stderr, " mysql_stmt_bind_param() failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
    /* Specify the data values for the first row */ //插入第一条记录
    int_data= 10;             /* integer */
    strncpy(str_data, "MySQL", STRING_SIZE); /* string  */
    str_length= strlen(str_data);
    /* INSERT SMALLINT data as NULL */
    is_null= 1;
    /* Execute the INSERT statement - 1*/
    if (mysql_stmt_execute(stmt))
    {
      fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
    /* Get the total number of affected rows */
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 1): %lu\n",
                    (unsigned long) affected_rows);
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
    /* Specify data values for second row, then re-execute the statement */
    int_data= 1000;   //插入第一条记录
    strncpy(str_data, "The most popular Open Source database", STRING_SIZE);
    str_length= strlen(str_data);
    small_data= 1000;         /* smallint */
    is_null= 0;               /* reset */
    /* Execute the INSERT statement - 2*/
    if (mysql_stmt_execute(stmt))
    {
      fprintf(stderr, " mysql_stmt_execute, 2 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
    /* Get the total rows affected */
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 2): %lu\n",
                    (unsigned long) affected_rows);
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
    /* 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);
    }
     mysql_close(connect);      //断开与SQL server的连接
}

Das Obige ist der Inhalt der Verwendung vorbereiteter Anweisungen für den Einstieg in MySQL. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (). www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn