-1

ANSI C で (ローカルに) 私の mysql データベースに接続する mysql スニペットを使用しています。私は sprintf を使用してこれらの変数を取得し、それらをつなぎ合わせて SQL クエリを形成しています。

問題

変数と SQL の準備ができたら、それを mysql_query に送信します。残念ながら、これは期待どおりに機能せず、プログラムがクラッシュし、バッファ オーバーフローが報告されます。

問題の説明に役立つ可能性がある全体的な関数の一部を次に示します。

#include <mysql.h>
#include <string.h>
#include <stdio.h>

char *table = "test_table"; // table is called test_table
char *column = "value"; // column is called value
char *value = "working"; // what value we are inserting
char *query; // what we are sending to mysql_query

sprintf(query, "INSERT INTO %s (%s) VALUES ('%s')", table, column, value);

if (mysql_query(conn, query)) {
  fprintf(stderr, "%s\n", mysql_error(conn));
  return;
}

目的

関数全体の目的は、プログラム内で SQL の挿入または更新ステートメントを何度も書き直す必要がないようにすることです。1 つの関数を呼び出して、テーブル、列、およびその列の値を識別するいくつかのパラメーターを渡したいと思います。

どんな助けでも大歓迎です。私は最近、Cで少し錆びています。

質問

mysql_query が文字列を送信できないのはなぜですか?

変更点

これはコメントに基づいて機能しました。

const char *query[MAX_STRING_LENGTH];

sprintf((char *)query, "INSERT INTO %s (%s) VALUES ('%s')", table, column, value);

if (mysql_query(conn, (const char *)query)) {
4

1 に答える 1

1

のバッキング ストレージがありませんquery

保存期間に応じて、NULLまたは不確定な値に設定されますが、どちらもうまく終了しません:-)

クイックフィックスは、それをに変更することです

char query[1000];

ただし、給与に見合うコーダーであれば、バッファ オーバーフローが発生していないことを確認することもできます。

于 2013-08-24T22:09:00.267 に答える