كيف يمكنني تعيين متغير متغير داخل سلسلة في C

كيف يمكنني تعيين متغير متغير داخل سلسلة في C؟

على سبيل المثال ، قم بتعيين ID من متغير int id = 1234 .

sql = "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY)" \
          "VALUES (99, 'John Doe', 25, 'Rich-Mond ', 65000.00 );";

UPDATE

أرغب في الحصول على سلسلة نهائية تحتوي على القيمة المتغيرة فيها.

هذا ، على النحو المقترح لا يعمل:

sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY)" \  
    "VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 );";  

rc = sqlite3_exec(db, printf(sql, 999), callback, 0, &zErrMsg);  

أريد شيئًا كهذا في جافا:

String string = String.format("A string %s", aVariable);
0
<�كود> snprintf </القانون>؟ أو استخدم ربط متغير API الخاص بقاعدة البيانات (الذي يحتوي فقط على كل قاعدة بيانات API
وأضاف المؤلف Some programmer dude, مصدر
ممكن التكرار من هذا السؤال .
وأضاف المؤلف Edouard Thiel, مصدر
ألقِ نظرة على بيانات SQLite الجاهزة . قم بإعداد بيان ثم ربط المعلمات. بناء sql الخاص بك في وقت التشغيل هو فكرة سيئة يمكن أن تؤدي إلى نقاط ضعف حقن SQL.
وأضاف المؤلف interjay, مصدر
ليس بالضبط (حول mysql). لم يكن شخص يستخدم سكليتي قبل إرسال بريد <�ط> جيدة الإجابة هنا من فضلك؟ ؛)
وأضاف المؤلف Felix Palmen, مصدر
ربما تريد التحقق من printf و bretheren.
وأضاف المؤلف Kami Kaze, مصدر
وأضاف المؤلف Matt P, مصدر

2 إجابة

استخدم snprintf ، يبدو pseudocode كما يلي:

int idValue = 1234;
snprintf(buffer, bufferLength, "insert bla bla VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 )", idValue);
sqli_execute(buffer);

في حالتك ستبدو:

//initialize sql variable before sprintfing into it
snprintf(sql, maximumSqlBufferLength "INSERT INTO REV_ENTITY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (%d, 'John Doe', 25, 'Rich-Mond ', 65000.00 );", id);
0
وأضاف
بشكل عام تجنب sprintf ، تفضل snprintf لتجنب تجاوز سعة المخزن المؤقت.
وأضاف المؤلف Edouard Thiel, مصدر
لا أعرف واجهة برمجة التطبيقات sqlite ، لكنني أفترض بشدة أنه يحتوي على بيانات parametrized/المعدة. في هذه الحالة ، إجابتك هي نصيحة سيئة حقا.
وأضاف المؤلف Felix Palmen, مصدر
googled فقط: sqlite.org/c3ref/bind_blob.html --- أبدا استخدم "بناء سلسلة SQL" الخاصة بك إذا كان لديك واجهة برمجة تطبيقات لائقة لمعلمات الربط. حقن SQL هي قاب قوسين أو أدنى!
وأضاف المؤلف Felix Palmen, مصدر
يجب أن تعطي الإجابة الجيدة نصيحة جيدة. هذه نصيحة سيئة ، IMHO. بالطبع شفرة جافا بالطبع هو بنفس السوء.
وأضاف المؤلف Felix Palmen, مصدر
FelixPalmen هو بالضبط ما طلب OP - لم يسأل عن استعلامات parametrized ، أيضا من خلال المثال الذي قدمه له أستطيع أن أفترض أنه يريد طريقة لإدراج قيمة المتغير في موضع معين في السلسلة
وأضاف المؤلف stetoc, مصدر
FelixPalmen هذا صحيح ، ولكن انظر إلى مثال العمليات OPs ، فهو يريد بوضوح وظيفة تشبه sprintf أريد شيئًا مثل هذا في Java: String string = String.format ("A string٪ s"، aVariable)؛
وأضاف المؤلف stetoc, مصدر

بالإضافة إلى snprintf المذكورة في الإجابة الأخرى ، يمكنك استخدام char * sqlite3_mprintf (const char *، ...) وظيفة من API sqlite3. ويستخدم الدالة المدمجة printf sqlite ويخصص الذاكرة للسلسلة باستخدام sqlite3_malloc64() . إذا كان كل شيء على ما يرام ، فإنه يعيد المؤشر إلى السلسلة ، وإلا فإنه يقوم بإرجاع NULL :

int id = 999;
char *sql;
sql = sqlite3_mprintf("INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (%d, 'REV', 25, 'Rich-Mond ', 65000.00 )", id);
if (sql != NULL) {
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if (rc != SQLITE3_OK)
        /* Do some error handling. */
    sqlite3_free(sql);
}

على عكس printf family functions ، sqlite3_mprintf لا يتمتع بالرفاهية للإبلاغ إذا كان التنسيق غير مرتبط بالحجج. لذا ، إذا حدث أنك تستخدم مترجم GCC ، فإن إضافة الرمز التالي يمكن أن يكون مفيدًا:

extern char *sqlite3_mprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));

الحل الآخر الموصى به في التعليقات ، هو استخدام إعداد sqlite3 ، وخطوة ووضع اللمسات الأخيرة على الوظائف:

int id = 999;
sqlite3_stmt *stmt = NULL;
char *sql = "INSERT INTO REV_ENTITY (ID,NAME,AGE,ADDRESS,SALARY) " \
            " VALUES (?, 'REV', 25, 'Rich-Mond ', 65000.00 )";
sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
/* Bind id. */
sqlite3_bind_int(stmt, 1, id);
if (sqlite3_step(stmt) == SQLITE_DONE) {
    printf("Insertion success\n");
} else {
    fprintf(stderr, "Insertion error\n");
}
/* Finalize and destroy statement. */
sqlite3_finalize(stmt);
0
وأضاف