Я работаю с учебником по API MySQL C от http://zetcode.com/tutorials/mysqlcapitutorial/, следующий пример работает нормально:
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
mysql_query(conn, "INSERT INTO writers VALUES('Leo Tolstoy')");
mysql_query(conn, "INSERT INTO writers VALUES('Jack London')");
mysql_query(conn, "INSERT INTO writers VALUES('Honore de Balzac')");
mysql_query(conn, "INSERT INTO writers VALUES('Lion Feuchtwanger')");
mysql_query(conn, "INSERT INTO writers VALUES('Emile Zola')");
mysql_close(conn);
}
Как я могу изменить код для принятия пользовательских значений вместо жестко закодированных, возможно ли заменить сценариев и ex. Лев Толстой с указателем char или чем-то?
У вас есть в основном два варианта:
sprintf
. Затем вы должны использовать mysql_real_escape_string
для всех ваших переменных, иначе ваш код будет уязвим для SQL-инъекции.mysql_stmt_execute
приведены некоторые примеры. (это лучший вариант)Вам, вероятно, придется составлять ваши строки, например. используя sprintf()
.
Возможно, вы можете использовать sprintf()
/snprintf()
, например:
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;
conn = mysql_init(NULL);
/* error checking missing */
mysql_real_connect(conn, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);
/* error checking missing */
mysql_query(conn, "CREATE TABLE writers(name VARCHAR(25))");
/* error checking missing */
do {
char cmd[1000];
char *name = "Leo Tolstoy"; /* get from user or file or something */
snprintf(cmd, 999, "INSERT INTO writers VALUES('%s')", name);
/* error checking missing */
mysql_query(conn, cmd);
/* error checking missing */
} while (0);
mysql_close(conn);
/* error checking missing */
}
mysql_real_escape_string
всю вашу переменную, чтобы убедиться, что вы не станете жертвой атаки SQL-инъекции как указано @ Lukáš Lalinský link