【问题标题】:String I/O in C with respect to MariaDB/MySQL C connector API?C 中关于 MariaDB/MySQL C 连接器 API 的字符串 I/O?
【发布时间】:2017-04-06 18:12:28
【问题描述】:

我正在使用 MariaDB C-connector API 在 C 中创建一个函数,以允许用户输入新的用户名和密码并将它们存储在 MariaDB/MySQL 数据库中。我使用 strcpy_s() 和 strcat_s() 在缓冲区内将多个字符串连接在一起,以便生成 MariaDB/MySQL 查询以将信息放入数据库中。这会导致“字段列表中的未知列”错误。在我使用“foo”和“bar”作为预设字符串实现函数之前,我在这里问过一个类似的问题,我收到的答案(有效)是将“foo”和“bar”更改为“'foo '" 和 "'bar'"。这行得通。有没有办法在运行时以“'foo'”形式而不是“foo”形式从用户那里获取字符串?下面是函数的相关代码。

void NEW_PLAYER(MYSQL *con)
{
    char NAME[16];
    char PASSWORD[16];
    char ch = NULL;
    unsigned int i = 0;

    printf("New Username: ");
    while (ch != '\n')    // terminates when the user presses enter
    {
        ch = getchar();
        NAME[i] = ch;
        i++;
    }
    NAME[i] = '\0';
    i = 0;
    ch = NULL;
    printf("New Password: ");
    while (ch != '\n')    // terminates if user hits enter
    {
        ch = getchar();
        PASSWORD[i] = ch;
        i++;
    }
    PASSWORD[i] = '\0';
    printf("%s", NAME);
    printf("%s", PASSWORD);
    char TEMP[256];
    char str1[] = "INSERT INTO PLAYERS VALUES(";
    strcpy_s(TEMP, str1); strcat_s(TEMP, NAME); 
    strcat_s(TEMP, ", "); 
    strcat_s(TEMP, PASSWORD);
    strcat_s(TEMP, " ,0, 0, 0, 1)");

    if (mysql_query(con, TEMP)) {
        fprintf(stderr, "%s\n", mysql_error(con));
        exit(-1);
    }
}

【问题讨论】:

    标签: mysql c database string mariadb


    【解决方案1】:
    • 您需要在 INSERT 语句中为文字加上引号。
    • 如果NAMEPASSWORD, and/orTEMP`不够大,内存会损坏。
    • 您必须对 NAME 或 PASSWORD 中的某些特殊字符(尤其是引号)进行转义。

    C 是一种非常低级的语言,无法与 MySQL 一起使用。在大多数语言中,整个功能以及修复程序需要 5-10 行代码。

    【讨论】:

    • 你知道 Perl、PHP、VB、Java、Python 吗?
    • 慰问。如果团队只知道这种语言,我可以理解使用一种特定的语言。如果是因为“C 允许更好的优化”,那么这是错误的。当然,您可以更好地微优化代码。但真正的性能提升是通过着眼大局和优化算法来实现的。当您将大量时间花在诸如字符串操作之类的琐事上时,这很难做到。 50 年前,类似的口头禅适用于“汇编语言”。
    • 连接器在 C 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2016-04-26
    • 2022-09-30
    • 1970-01-01
    • 2015-05-24
    • 2014-07-17
    • 2011-08-02
    相关资源
    最近更新 更多