6.4.4 mysql_stmt_bind_named_param()

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:。

// 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)。