LINUX.ORG.RU

Из C++ доступ к mysql ?


0

0

Господа!!!

А где мона почитать как сделать insert данных в таблицу mysql`я (на localhost`е) использую язык C в unix`ах ... ;)????

url плиззььь....

anonymous
Ответ на: комментарий от anonymous

Сам недавно разбирался, вот кусок моего примерчика для авторизации в сквиде через mysql


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <mysql/mysql.h>

long select_limit(MYSQL *sock, char *user, char *pass)
{
	char query[255];
	MYSQL_RES *res;
	MYSQL_ROW row;
	
	long limit=0;
	
	sprintf(query, "SELECT mlimit FROM auth WHERE username='%s' and password=PASSWORD('%s')", user, pass);
	if (mysql_query(sock, query)==0)
	{
		if ((res=mysql_store_result(sock))!=NULL)
		{
			if ((row=mysql_fetch_row(res))!=NULL)
			{
				limit=atol(row[0]);
				mysql_free_result(res);
				return limit*1024*1024;
			}
			else
			{
				mysql_free_result(res);
				return -1;
			}
		}
		else
		{
			return -1;
		}
	}
	else
	{
		return -1;
	}
	return -1;
}

int main()
{
	MYSQL *sock, *mysql;
	char myhost[]="localhost";
	char myuser[]="squidroot";
	char mypass[]="sqroot";
	char mydb[]="squidlog";
	int myport=3306;
	
	char *user;
	char *pass;
	
	char buf[256];
	char *str;
	
	long dload=0;
	long limit=0;
	char active;
	
	//Connect to mysql
	mysql = mysql_init(NULL);
	sock = mysql_real_connect(mysql, myhost, myuser, mypass, mydb, myport, NULL, 0);
	
	if (sock==NULL)
	{
		fprintf(stderr, "%s\n", mysql_error(mysql));
		exit(1);
	}
	
	setbuf(stdout, NULL);
		
	while (fgets(buf, 256, stdin) != NULL) 
	{
		if ((str = strchr(buf, '\n')) != NULL)
			*str = '\0';		/* strip \n */
		
		if ((user = strtok(buf, " ")) == NULL) 
		{
			printf("ERR\n");
			continue;
		}
		if ((pass = strtok(NULL, "")) == NULL) 
		{
			printf("ERR\n");
			continue;
		}
		
		limit=select_limit(sock, user, pass);

		if (dload==-1 || limit==-1)
			printf("ERR\n");
		else
		{
			if (dload>=limit)
				printf("ERR\n");
			else
				if (active=='N')
					printf("ERR\n");
				else
					printf("OK\n");
		}
	}
	
	mysql_close(sock);
	return 0;
}

Delay ★★
()
Ответ на: комментарий от Delay

> sprintf(query, "SELECT mlimit FROM auth WHERE username='%s' and password=PASSWORD('%s')", user, pass);

Именно через такие дыры программы и ломаются.

anonymous
()
Ответ на: комментарий от anonymous

>sprintf(query, "SELECT mlimit FROM auth WHERE username='%s' and password=PASSWORD('%s')", user, pass);

Для самообразования, в чём она заключается?

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за подсказку, действительно может упасть в сегфолт ... но за полтора месяца использования ни один кулхацкер сквида еще не уронил:)

Delay ★★
()
Ответ на: комментарий от Delay

Это называется _потенциальная_ дыра, и увидев такое, лучше это место пропатчить. :)

anonymous
()
Ответ на: комментарий от anonymous

А в mysql placeholder'ы есть? Поверхностное чтение документации этот вопрос не прояснило.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.