6.4.4 mysql_stmt_bind_named_param()

Press CTRL+C to copy
bool mysql_stmt_bind_named_param(MYSQL_STMT *stmt, MYSQL_BIND *binds, unsigned n_params, const char **names)

描述

mysql_stmt_bind_named_param() 为预处理语句设置未命名和命名(查询属性)绑定参数。

此函数取代了旧的 mysql_stmt_bind_param() 函数,该函数仅支持未命名参数,并且已被移除。

参数

  • stmt: 语句句柄。语句必须使用 mysql_stmt_prepare() 进行预处理。

  • binds: 命名和未命名绑定参数数组。在没有命名参数的情况下,将 NULL 传递为绑定参数名称数组。

  • n_params: 数组中的项目数。

  • names: 绑定参数名称数组。

mysql_stmt_bind_named_param() 需要输入 MYSQL_BIND 结构数组和匹配的名称数组。如果绑定参数计数为零或绑定数组指针为 NULL,则它将在没有任何影响的情况下成功(在极端情况下)。如果任何绑定参数参数使用无效的 MYSQL_BIND 类型,则它将失败。

要存储命名和未命名的绑定用户变量,请在 mysql_stmt_prepare() 之后调用 mysql_stmt_bind_named_param()。在绑定变量之后,您可以重复设置和更改它们。

需要考虑的其他操作是

有关 MYSQL_STMTMYSQL_BIND 结构成员的描述以及如何设置它们以提供输入值的信息,请参见 第 6.2 节,“C API 预处理语句数据结构”

返回值

成功为零。如果发生错误,则为非零。

错误

示例

以下示例演示绑定一个未命名参数和一个命名参数。未命名参数在匹配的名称数组插槽中具有 NULL:.

Press CTRL+C to copy
// Compile example on Linux with a command similar to: // gcc example.c --std=c99 -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -o example #include <mysql.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // variable declarations MYSQL *mysql; MYSQL_STMT *stmt; int int_data = 4; // unnamed input parameter value int int_parentid = 1329494394; // named ('traceparent') input parameter value MYSQL_BIND params[2]; const char *names[2] = {NULL, "traceparent"}; int rc; MYSQL_BIND rbind[1]; int result_val; // connect to the database server mysql = mysql_init(NULL); if (mysql == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql)); return 1; } if (mysql_real_connect(mysql, "127.0.0.1", "root", "password", NULL, 0, NULL, 0) == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql)); mysql_close(mysql); return 1; } // create a prepared statement stmt = mysql_stmt_init(mysql); if (stmt == NULL) { fprintf(stderr, "%s\n", mysql_error(mysql)); mysql_close(mysql); return 1; } const char *query = "SELECT POW(?,2) AS square"; if (mysql_stmt_prepare(stmt, query, strlen(query))) { mysql_stmt_close(stmt); mysql_close(mysql); return 1; } // bind the prepared statement parameters memset(params, 0, sizeof(params)); params[0].buffer_type = MYSQL_TYPE_LONG; params[0].buffer = (char *)&int_data; params[0].length = NULL; params[0].is_null = NULL; params[1].buffer_type = MYSQL_TYPE_LONG; params[1].buffer = (char *)&int_parentid; params[1].length = NULL; params[1].is_null = NULL; rc = mysql_stmt_bind_named_param(stmt, params, sizeof(params) / sizeof(params[0]), names); if (rc != 0) { fprintf(stderr, "%s\n", mysql_error(mysql)); mysql_stmt_close(stmt); mysql_close(mysql); return 1; } // execute the prepared statement rc = mysql_stmt_execute(stmt); if (rc != 0) { fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(mysql); return 1; } // bind and fetch the result parameter memset(rbind, 0, sizeof(rbind)); rbind[0].buffer_type = MYSQL_TYPE_LONG; rbind[0].buffer = (char *)&result_val; rc = mysql_stmt_bind_result(stmt, rbind); if (rc != 0) { fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(mysql); return 1; } rc = mysql_stmt_fetch(stmt); if (rc != 0) { fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(mysql); return 1; } // expect POW(4, 2), i.e. 4 squared being 16 if (result_val != 16) { printf("Unexpected result!\n"); } else { printf("Success!\n"); } mysql_stmt_close(stmt); mysql_close(mysql); return 0; }

在执行、绑定结果和获取数据后,语句在成功时的结果为 16(即 4 的平方)。

另请参见

有关分段发送长文本或 blob 数据的信息,请参见 mysql_stmt_send_long_data()。有关完整示例,请参考文件 tests/mysql_client_test.c。此文件可以从 MySQL 源代码发行版或源代码存储库中获得(请参见 从源代码安装 MySQL)。