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 的平方)。
請參閱 mysql_stmt_send_long_data()
,以分段傳送長文字或 BLOB 資料。如需完整的範例,請參閱 tests/mysql_client_test.c
檔案。此檔案可以從 MySQL 原始碼發行版或從原始碼儲存庫取得(請參閱從原始碼安裝 MySQL)。