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_stmt_execute()
执行语句。使用
mysql_stmt_reset()
重置语句,或使用mysql_stmt_prepare()
用另一个查询重新准备它。使用
mysql_stmt_close()
关闭语句。
有关 MYSQL_STMT
和 MYSQL_BIND
结构的成员以及如何设置它们以提供输入值的描述,请参见 第 6.2 节,“C API 预处理语句数据结构”。
-
不支持转换。可能是
buffer_type
值无效或不是支持的类型之一。 -
内存不足。
-
发生未知错误。
以下示例演示了绑定一个未命名参数和一个命名参数。未命名参数在匹配的名称数组插槽中具有 NULL
:。
// 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)。