[C] Variable meenemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Excuses voor de rare titel, ik kan even geen betere bedenken.

Laat voorop staan dat ik net pas ben begonnen in de wondere wereld van C, en dus nog bar weinig verstand ervan heb.
Ik ben dus wat tutorials aan het doen, en kan bijv wel al een connectie maken vanuit c naar een mysql db en er data in dumpen.


Maar wat ik eigenlijk wil leren, en weten, is hoe ik van zeg binary a de uitvoer als variable kan nemen voor mijn huidige .c mysql.

Welicht een beetje vreemd, ik zal het proberen te verduidelijken.


Stel ik heb een binary op mijn linux systeem met de naam binarya.
Als ik deze op de commandline uitvoer dan krijg ik een output.
Deze filter ik normaal gesproken op de cmdline om de juiste kolom te zien als volgt.
code:
1
/usr/bin/binarya | sed '3,100!d' | cut -c 5-8.


Ik wil die uitvoer dus als char meenemen in mijn nieuwe binarie ? ( ik weet niet of dat uberhaupt wel kan en "im barking up the wrong tree")

dus ik probeerde.
code:
1
char *sid="/usr/bin/binarya | sed '3,100!d' | cut -c 5-8";


en gebruik dan in mijn mysql query

code:
1
INSERT INTO test VALUES('sid')


Maar helaas krijg ik dus niet het gewenste resultaat, in mijn DB komt gewoon "sid" te staan ipv de waarde die ik zou verwachten.
Iemand enige tijd of zin om mij op wellicht een domme fout te wijzen?

(let op ik ben nog aan het leren en vanallerlei tutorials aan het doen)

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 11:09:

en gebruik dan in mijn mysql query

code:
1
INSERT INTO test VALUES('sid')


Maar helaas krijg ik dus niet het gewenste resultaat, in mijn DB komt gewoon "sid" te staan ipv de waarde die ik zou verwachten.
Lijkt me wiedes; je insert letterlijk een string. Je zou sowieso dus de string moeten opbouwen met de inhoud van de variabele sid en niet de string sid. Verder weet ik te weinig van 't onderwerp maar iets zegt me dat je een beetje een vreemde constructie er op na houdt.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
RobIII schreef op vrijdag 23 april 2010 @ 11:24:
[...]

Lijkt me wiedes; je insert letterlijk een string. Je zou sowieso dus de string moeten opbouwen met de inhoud van de variabele sid en niet de string sid. Verder weet ik te weinig van 't onderwerp maar iets zegt me dat je een beetje een vreemde constructie er op na houdt.
Dat kan ik me voorstellen dat het vreemd is, want ik snap er letterlijk nog de ballen van :+
Maar dat komt nog wel :)

met
code:
1
char *blaat="blaatblaat";

heb ik toch laterna als ik blaat gebruik (bijvoorbeeld in de mysql_real_connect) "blaatblaat" als waarde?

Kan dat ook door als char een binary output te gebruiken?

Hoop dat je me nu snapt :P :X

EDIT

Of wacht even, ok , ik denk dat ik snap wat jij bedoel , even wat frommelen.
Of nee toch niet

Bedoel jij dat ik een string moet maken van mijn variabelen?

[ Voor 9% gewijzigd door CrankyGamerOG op 23-04-2010 11:32 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, waarom maak je gebruik van c als je eigenlijk gewoon een soort shell-script aan het maken bent? Even mysql aanroepen zal ook werken, escapen kan zelfs ook in bash (iets als "${text//\'/\'}")... c maakt niet automatisch unix system calls ofzo, en variabelen worden ook niet automatisch herkend. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
pedorus schreef op vrijdag 23 april 2010 @ 11:33:
Tsja, waarom maak je gebruik van c als je eigenlijk gewoon een soort shell-script aan het maken bent? Even mysql aanroepen zal ook werken, escapen kan zelfs ook in bash (iets als "${text//\'/\'}")... c maakt niet automatisch unix system calls ofzo, en variabelen worden ook niet automatisch herkend. :)
Omdat wat ik doe geen specifieke functie heeft, ik wil leren waartoe C in staat is, en hoe het functioneerd.
Niet omdat ik perse iets wil bereiken met een specifiek functie.


Wat ik wilde leren/achterhalen is het volgende.


Stel binary A , geeft mij een bepaalde output ( zeg bijv "je fiets is gejat" )
Ik wil weten of ik vanuit een nieuwe C binary die variable "je fiets is gejat" kan opvragen en meenemen.

Humm wellicht was die uitleg makkelijker als in mijn TS :)


Trouwens terugkomend op mijn eerste tutorial, MySQL connectie opbouwen en querys maken.
Je defineert daar dmv van char de variabelen die je later in de mysql_real_connect gebruikt.
Wat ik even niet snap is , is het niet gevaarlijk om de waarden (dus localhost,user en pass) hardcoded in de C te gebruiken?

[ Voor 15% gewijzigd door CrankyGamerOG op 23-04-2010 11:50 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

CrankyGamerOG schreef op vrijdag 23 april 2010 @ 11:29:
Bedoel jij dat ik een string moet maken van mijn variabelen?
Nee, hij bedoelt dat je een string moet maken met behulp van je variabelen. Kijk eens naar sprintf(). Vergelijkbaar met printf(), maar gooit de uitvoer in een string (char array) ipv naar het scherm. Het resultaat wil je vervolgens aan mysql voeren.

C:
1
2
3
char * mystr = "aap";
char buffer[200];
sprintf(buffer, "hallo, hier staat mystr: %s", mystr);

buffer bevat hierna "hallo, hier staat mystr: aap". Op dezelfde manier kun je dus ook je query opbouwen.

PS. voor veiligheid wil je snprintf() gebruiken om ervoor te zorgen dat er niet meer karakters in de string worden gestopt dan de buffer lang is, maar die functie is helaas niet standaard...

PPS. stringbewerkingen zijn in C++ beduidend simpeler en veiliger dan in C. Als het een optie is zou ik zeker voor C++ gaan.

[ Voor 10% gewijzigd door .oisyn op 23-04-2010 12:05 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
.oisyn schreef op vrijdag 23 april 2010 @ 12:04:
[...]

Nee, hij bedoelt dat je een string moet maken met behulp van je variabelen. Kijk eens naar sprintf(). Vergelijkbaar met printf(), maar gooit de uitvoer in een string (char array) ipv naar het scherm. Het resultaat wil je vervolgens aan mysql voeren.

C:
1
2
3
char * mystr = "aap";
char buffer[200];
sprintf(buffer, "hallo, hier staat mystr: %s", mystr);

buffer bevat hierna "hallo, hier staat mystr: aap". Op dezelfde manier kun je dus ook je query opbouwen.

PS. voor veiligheid wil je snprintf() gebruiken om ervoor te zorgen dat er niet meer karakters in de string worden gestopt dan de buffer lang is, maar die functie is helaas niet standaard...

PPS. stringbewerkingen zijn in C++ beduidend simpeler en veiliger dan in C. Als het een optie is zou ik zeker voor C++ gaan.
Bedankt :) ik zal er eens naar gaan kijken zometeen.
C++ is zeker ook een optie hoor :) ik ben nergens aan verbonden, ik wil gewoon leren hoe die dingen in elkaar zitten :)

Thnx iedereen alvast :)
(ps mochten mensen nog meer dingen toe te voegen hebben ga gerust je gang :) )

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Aangezien je linux gebruikt, is het handig om eens naar de popen() functie te kijken (man popen)

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
H!GHGuY schreef op vrijdag 23 april 2010 @ 12:42:
Aangezien je linux gebruikt, is het handig om eens naar de popen() functie te kijken (man popen)
Humm popen lijkt inderdaad te doen wat ik wil
althans ik kan het met printf op mijn scherm toveren (de output)
Maar het probleem waar ik tegenaanloop is echt dat ik een lijst krijg als output, en ik die lijst graag in een db wil dumpen.

dus bijv.
#./binarya
ID      Host A      Host B    Port  Protocol Timestamp  Duration   Mode CRC 
-------- --------------- --------------- ------ -------- ---------- ---------- ---- --------
001   XX.XX.XX.XX XX.XX.XX.XX 21 FTP 10:00 20sec Psv 324E32
002  XX.XX.XX.XX XX.XX.XX.XX  21 FTP 11:00 50sec Act  32fr453


Daar bedoel ik dus mee, ik moet elke kolom in een eigen column zien te krijgen in MySQL
Nu kan ik dit met php en shell_exec met gemak, maar uiteraard wil ik weten hoe het met c zou moeten.

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 13:31:
Nu kan ik dit met php en shell_exec met gemak, maar uiteraard wil ik weten hoe het met c zou moeten.
In PHP bouw je je query toch ook met variabelen? Waarom zou dat in C(++) anders zijn :? Even paramterized queries etc. buiten beschouwing gelaten. In PHP doe je iets als:
PHP:
1
2
3
$query = "insert into mytable (a,b,c) values ('$a','$b','$c')";
//of
$query = sprintf("insert into mytable (a,b,c) values ('%s','%s','%s')", $a, $b, $c);
Escaping etc. buiten beschouwing gelaten, voor de SQL Injection roepers ;) Neem maar even aan dat $a, $b en $c door mysql_real_escape zijn gehaald.

En het equivalent voor C heb al gehad. Waar zit dan precies je probleem nog in?

[ Voor 43% gewijzigd door RobIII op 23-04-2010 13:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
RobIII schreef op vrijdag 23 april 2010 @ 13:33:
[...]

In PHP bouw je je query toch ook met variabelen? Waarom zou dat in C(++) anders zijn :? Even paramterized queries etc. buiten beschouwing gelaten. In PHP doe je iets als:
PHP:
1
2
3
$query = "insert into mytable (a,b,c) values ('$a','$b','$c')";
//of
$query = sprintf("insert into mytable (a,b,c) values ('%s','%s','%s')", $a, $b, $c);
Escaping etc. buiten beschouwing gelaten, voor de SQL Injection roepers ;) Neem maar even aan dat $a, $b en $c door mysql_real_escape zijn gehaald.

En het equivalent voor C heb al gehad. Waar zit dan precies je probleem nog in?
Ja dat begrijp ik wel ;)
Maar in php doe ik met de shell exec en sed en cut de juiste kolom eruit vissen.
Het gaat er dus nu meer om hoe ik de uitvoer van popen in stukken kan "hakken" en elke een eigen $variable toe kan kennen.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
  FILE *in;
  extern FILE *popen();
  char buff[512];

    if (!(in = popen("binarya", "r"))) {
    exit(1);
  }

  /* De uitvoer lezen, regel per regel. */
  while (fgets(buff, sizeof(buff), in) != NULL ) {
    printf("%s", buff);
  }

  pclose(in);
}


Ik krijg nu dus de hele lijst terug aan waarden in die binary.
In PHP, gebruik ik dus zoals boven in de TS aangegeven :

/usr/bin/binarya | sed '3,4!d' | cut -c 5-8

Ik doe dus met sed (wat ik eigenlijk geen betere manier voor kon verzinnen) en cut de kolom en regel eruit vissen en die als waarde wegschrijven

PHP:
1
$waarde=shell_exec('/usr/bin/binarya | sed '3,4!d' | cut -c 5-8');


(het gaat er uiteindelijk om dat ik de binarya zelf aanpas zodat hij het zelf wegzet naar de db uiteraard)(waarvan ik uiteraard de source heb :) )
Maar ik wil eerst leren hoe ik het kan pipen en wegschrijven middels een 2e binary.

Wellicht is de manier waarop ik het wil leren totaal onlogisch, en denken jullie wel , uhmmm wat doet ie nou allemaal, als dat zo is, zeg het dan maar gewoon :)

[ Voor 34% gewijzigd door CrankyGamerOG op 23-04-2010 14:19 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 14:11:
Het gaat er dus nu meer om hoe ik de uitvoer van popen in stukken kan "hakken" en elke een eigen $variable toe kan kennen.
Again: Hoe zou je het in php (of beter: pseudocode) doen? En wat lukt je dan niet bij het omzetten naar een C equivalent.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
RobIII schreef op vrijdag 23 april 2010 @ 14:12:
[...]

Again: Hoe zou je het in php (of beter: pseudocode) doen? En wat lukt je dan niet bij het omzetten naar een C equivalent.
Humm ja ik kan natuurlijk de sed en cut meenemen in de popen, maar ik vroeg me af of iemand ook nog andere manieren wist? iets met een array oid? :?


want ik had in mijn php script dus iets van 10x een shell_exec("binary | sed * | cut -c *-*) staan.

Daarbij lijkt het mij over te komen dat je denkt dat ik iets in PHP wil doen, ik wil dus eigenlijk niks via php doen, ik wil vanuit C meteen dumpen in de MySQL.

[ Voor 25% gewijzigd door CrankyGamerOG op 23-04-2010 14:52 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Volgens mij wil jij iets bereiken als
code:
1
/usr/bin/binarya | sed '3,100!d' | cut -c 5-8 | jouwCapp

Dat wil zeggen, je wilt de output van a door sed en cut naar jouw programma sturen. Dat kan. Als je de pipe zo opzet, dan kun je de input daarvan met scanf("%255s", buffer) lezen. Wel zorgen dat buffer een char[256] is natuurlijk. scanf retourneert 0 als je probeert voorbij de laatste regel te lezen, dus op die manier weet je hoe ver je bent.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 14:17:
Humm ja ik kan natuurlijk de sed en cut meenemen in de popen, maar ik vroeg me af of iemand ook nog andere manieren wist? iets met een array oid? :?
Je kunt toch een string splitten of niet? En die splitresultaten in een array mikken? Of dat nou in C of PHP is boeit toch niet? Ik zie niet waarom je met sed en cut enzo zou moeten klooien.
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 14:17:
want ik had in mijn php script dus iets van 10x een shell_exec("binary | sed * | cut -c *-*) staan.
Wat in PHP dus ook niet nodig was geweest (sed/cut) als je daar met wat splits de output had "gelezen". Dat je dat niet doet blijkt nu pas; dat kan en kon ik ook niet ruiken ;) Ik begreep door "Nu kan ik dit met php en shell_exec met gemak" dat je gewoon een shell_exec('binary') deed en het in PHP verder afhandelde (strings splitten/array vullen).
CrankyGamerOG schreef op vrijdag 23 april 2010 @ 14:17:
Daarbij lijkt het mij over te komen dat je denkt dat ik iets in PHP wil doen, ik wil dus eigenlijk niks via php doen, ik wil vanuit C meteen dumpen in de MySQL.
Het is me klinkklaar dat je iets met C wil doen; maar je geeft aan wel "Nu kan ik dit met php en shell_exec met gemak" en dat las ik als: ik ken PHP. En als je weet hoe je iets in PHP doet kun je het (min-of-meer natuurlijk) ook in C doen. Dat je andere functies nodig hebt, syntax verschillen enzo daargelaten. Het idee blijft hetzelfde: string splitten, arraytje vullen etc.

Maar het is mij inmiddels al helemaal niet meer duidelijk of je uberhaupt wat programmeerervaring hebt of dat je alles een beetje creatief bij elkaar hebt geknipt en geplakt :P En dat is niet lullig bedoeld (we zijn allemaal ooit ergens begonnen) maar ik lees dus nergens in dit topic of je echt een beetje het concept programmeren beheerst. Zeker omdat je vraagt: "iets met een array ofzo" terwijl het antwoord van een beetje programmeur daarop zal zijn: d'uh.

[ Voor 21% gewijzigd door RobIII op 23-04-2010 18:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
no offense taken hoor :)

M.b.t programmeren, nee ik ben niet thuis in PHP coden zelf of C,
Bash daarintegen kan ik dan weer wel :)
Ik ben meer bezig tijdens mijn werk met probleemoplossingen op server gebied(dus ook wel PHP af en toe) dan dan ik me bezig houd met programmeren.
Vandaar ook de intresse nu in het programmeren zelf, ik wil me horizon verbreden.

Ondertussen ben ik afgestapt van het pipen van het programma in een nieuw programme en ben ik aan het proberen of ik het originele programma kan aanpassen zodat deze de results meteen wegschrijft naar een MySQL db.

Je zegt "splitten", ik zal hier eens op googelen :+


Wellicht heb je nog wat ideeen waarmee ik zou moeten beginnen om het concept te leren "beheersen"?
In het begin van het topic gaf ik aan dat ik tutorials aan het doen was, dus ik dacht daarmee aan te geven dat ik er nog niet vrij veel verstand van had.

Bedankt voor je input zover iig :)

[ Voor 16% gewijzigd door CrankyGamerOG op 23-04-2010 21:14 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou je willen aanraden het programmeren onder de knie te krijgen vanaf stap 1. Je zult waarschijnlijk wat dingen te lezen krijgen waarvan je denkt: "Jaaah, dat weet ik al, en dat is zo simpel" maar je moet gewoon doorbijten om de onderliggende principes door en door te snappen.

Voor C kan ik deze tutorial/lesreeks op www.reddit.com aanraden. Reddit is een soort mix tussen een link-arregator site als Digg een community als Tweakers. In dit gedeelte op Reddit geeft iemand les in C. Je kan vragen stellen, en je hebt kleine examens aan het einde van de zoveel lessen. Er zijn nu 60 lessen en hij houdt het nog iedere dag bij.

Dit specifieke probleem zou je al na de eerste 10 lessen zelf moeten hebben opgelost. Het is een denkfout die je maakt. En we kunnen het nu met zijn allen uitleggen maar dan snap je het nog niet. Geloof me, ik heb het zelfde gehad met het principe van OOP, op een dag stond ik op, las het boek nog eens door en opeens snapte ik het. De klik was er. Duurde wel 2 maanden voordat ik bij dat punt aankwam. ;)

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Verwijderd schreef op zondag 25 april 2010 @ 20:28:
Ik zou je willen aanraden het programmeren onder de knie te krijgen vanaf stap 1. Je zult waarschijnlijk wat dingen te lezen krijgen waarvan je denkt: "Jaaah, dat weet ik al, en dat is zo simpel" maar je moet gewoon doorbijten om de onderliggende principes door en door te snappen.

Voor C kan ik deze tutorial/lesreeks op www.reddit.com aanraden. Reddit is een soort mix tussen een link-arregator site als Digg een community als Tweakers. In dit gedeelte op Reddit geeft iemand les in C. Je kan vragen stellen, en je hebt kleine examens aan het einde van de zoveel lessen. Er zijn nu 60 lessen en hij houdt het nog iedere dag bij.

Dit specifieke probleem zou je al na de eerste 10 lessen zelf moeten hebben opgelost. Het is een denkfout die je maakt. En we kunnen het nu met zijn allen uitleggen maar dan snap je het nog niet. Geloof me, ik heb het zelfde gehad met het principe van OOP, op een dag stond ik op, las het boek nog eens door en opeens snapte ik het. De klik was er. Duurde wel 2 maanden voordat ik bij dat punt aankwam. ;)
Thnx voor de link :) , eens even kijken wat het me brengt, en je hebt gelijk, ik wil inderdaad gewoon vanaf 0 beginnen en bij de basis.

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Wil je niet gewoon argumenten meegeven aan je c programma ?

Dat kan: http://publications.gbdir...10/arguments_to_main.html

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Nee ik wil geen argumenten meegeven, thnx voor je input .


Wellicht kan iemand hier mij nog iets anders uitleggen.

Ik heb een variable in C en ik wil die variable(de inhoud) wegschrijven naar de DB.
Heeft iemand een idee/of url hoe je dit moet aanpakken, ik heb het idee dat mijn google kunsten falen op dit punt.

Enigste wat ik tegenkom is een user input character array, maar ik wil gewoon nu eerst weten hoe ik een in de code al vooraf bepaalde variable kan wegschrijven naar een mysql db.


ik probeerde het met
C:
1
if (mysql_query(conn, "INSERT INTO test VALUES('', '%s,VARIABLENAME', 'fiets', 'ik', 'is', 'gek', 'op', 'friet', 'test', 'test')"))


Maar dan komt er dus letterlijk %s,variablename te staan in die column

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 13:21
Om variabelen in een string in te vullen het je de functie sprintf nodig.
Zie .oisyn in "[C] Variable meenemen"

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
gvdh schreef op dinsdag 04 mei 2010 @ 11:48:
Om variabelen in een string in te vullen het je de functie sprintf nodig.
Zie .oisyn in "[C] Variable meenemen"
Ja dan kan ik dus een buffer(ook weer een variable?) opbouwen met de waarde van die variablen.
Maar hoe voer ik de INSERT dan uit zodat hij de waarde van de variable wegschrijft ipv de variable zelf?

De code zelf geeft trouwens errors
C:
1
2
char buffer[200];
        sprintf(buffer, "%s", STRING);


code:
1
 error: expected expression before &#8216;STRING&#8217;

[ Voor 17% gewijzigd door CrankyGamerOG op 04-05-2010 12:02 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:16

Creepy

Tactical Espionage Splatterer

No offence maar heb je enig idee wat je aan het doen bent? C is geen PHP. Als je een query hebt samengesteld m.b.v. sprintf dan kan je de variabele waar de volledige query in staat toch direct meegeven aan mysql_query()? Dus wat lukt je daar dan niet mee?

[ Voor 3% gewijzigd door Creepy op 04-05-2010 12:01 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Misschien die opgebouwde buffer meegeven aan mysql_query zodat die gewoon uitgevoerd word :?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
CrankyGamerOG schreef op dinsdag 04 mei 2010 @ 11:53:
[...]

Ja dan kan ik dus een buffer(ook weer een variable?) opbouwen met de waarde van die variablen.
Maar hoe voer ik de INSERT dan uit zodat hij de waarde van de variable wegschrijft ipv de variable zelf?
Zoiets?
C:
1
2
3
char query[200];
// dit mag je zelf invullen
if (mysql_query(conn, query))

Ik raad je aan om een goede C/C++ tutorial of boek te zoeken. Dit is basic C :)

offtopic:
spuit 11 :+

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Woy schreef op dinsdag 04 mei 2010 @ 12:02:
Misschien die opgebouwde buffer meegeven aan mysql_query zodat die gewoon uitgevoerd word :?
No offense taken.

ja daar ben ik nu dus achter, echter lukt de buffer opbouw al niet, zie boven.
JanDM schreef op dinsdag 04 mei 2010 @ 12:02:
[...]

Zoiets?
C:
1
2
3
char query[200];
// dit mag je zelf invullen
if (mysql_query(conn, query))

Ik raad je aan om een goede C/C++ tutorial of boek te zoeken. Dit is basic C :)
Heb je nog tips voor een goed boek?

[ Voor 36% gewijzigd door CrankyGamerOG op 04-05-2010 12:03 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Een goede zoekterm is "C string manipulation"

b.v.

http://computer.howstuffworks.com/c35.htm

Ook een functie als strstr (om een string in een string te zoeken) kan handig zijn.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 16-09 22:28

Matis

Rubber Rocket

CrankyGamerOG schreef op dinsdag 04 mei 2010 @ 12:02:
Heb je nog tips voor een goed boek?
http://www.cplusplus.com/

Tutorials, FAQ's, Forum.

Eigenlijk zou je dat eerst hebben moeten doornemen :P

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk ook eens naar strtok()

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
JanDM schreef op dinsdag 04 mei 2010 @ 12:02:
Ik raad je aan om een goede C/C++ tutorial of boek te zoeken. Dit is basic C :)
Ik zou eigenlijk aanraden om c links te laten liggen. TS is als ik zo kijk niet iemand die pointers gaat snappen. ;) Dan kun je beter aan de slag met een andere taal. Voor deze taak zou ik zelf Perl gebruiken, maar een php-script, java of c# gaat vast ook lukken. En ik bedoel dan programmeren zonder dat je sed of cut aanroept.

En voor een boek: ga anders naar de bieb, (vrijwel) ieder boek is goed genoeg in dit stadium. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 13:21
CrankyGamerOG schreef op dinsdag 04 mei 2010 @ 11:53:
[...]

Ja dan kan ik dus een buffer(ook weer een variable?) opbouwen met de waarde van die variablen.
Maar hoe voer ik de INSERT dan uit zodat hij de waarde van de variable wegschrijft ipv de variable zelf?

De code zelf geeft trouwens errors
C:
1
2
char buffer[200];
        sprintf(buffer, "%s", STRING);


code:
1
 error: expected expression before &#8216;STRING&#8217;
Wat probeer je hier mee te bereiken? Waar komt STRING vandaan?
De tweede parameter is een string waarin je dingen wil vervangen. Hier moet je dus je query zetten, met op de juiste plaats %s, %d, etc. sprintf vult dan op deze plaatsen de waarden in van de variabelen die je opgeeft.

In jouw geval moet je dus dit doen:
C:
1
2
3
char buffer[200];
sprintf(buffer, "INSERT INTO test VALUES ('', '%s', '...')", VARIABLENAME);
if (mysql_query(conn, buffer))



Maar, zoals hierboven gezegd wordt: leer eerst de basics van C, of kies een eenvoudigere programmeertaal. Anders zal je tegen dit soort problemen blijven aanlopen.

Acties:
  • 0 Henk 'm!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 13:40

voodooless

Sound is no voodoo!

Hebben we het al gehad over SQL insertion :? Misschien meteen kijken naar parameterized queries, dat lost ook al wat string plak problemen op.

Neemt niet weg dat een goed C boek wel een aanrader is :)

Do diamonds shine on the dark side of the moon :?


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
gvdh schreef op dinsdag 04 mei 2010 @ 12:19:
[...]


Wat probeer je hier mee te bereiken? Waar komt STRING vandaan?
De tweede parameter is een string waarin je dingen wil vervangen. Hier moet je dus je query zetten, met op de juiste plaats %s, %d, etc. sprintf vult dan op deze plaatsen de waarden in van de variabelen die je opgeeft.

In jouw geval moet je dus dit doen:
C:
1
2
3
char buffer[200];
sprintf(buffer, "INSERT INTO test VALUES ('', '%s', '...')", VARIABLENAME);
if (mysql_query(conn, buffer))



Maar, zoals hierboven gezegd wordt: leer eerst de basics van C, of kies een eenvoudigere programmeertaal. Anders zal je tegen dit soort problemen blijven aanlopen.
Thnx, dit was idd de oplossing, en gelukkig na wat lezen snap ik ook wat het doet nu

C:
1
2
3
4
5
6
 char buffer[200];
                sprintf(buffer, "INSERT INTO tester VALUES ('','%s','')",variable));
                if (mysql_query(conn, buffer))
                {
                fprintf(stderr, "%s\n", mysql_error(conn));
                }


Wellicht dat iemand het volgende ook weet..
Ik wil de hostname van de machine die de query doet, mee weg schrijven in de db.
De table heeft een collumn ervoor alleen krijg ik met geen manier de hostname erin.
Op welke manier kan ik een variable setten die de hostname heeft?

Ik probeerde dus
C:
1
char *hostname = "hostname";


Maar op een of andere manier werkt dat niet zoals ik wil ( ik krijg dan letterlijk hostname ipv de variable)
(ik probeerde het als volgt btw)
C:
1
2
3
4
5
6
7
 char *hostname = "test.host.lan" 
 char buffer[200];
                sprintf(buffer, "INSERT INTO tester VALUES ('','%s','%s')",variable,hostname));
                if (mysql_query(conn, buffer))
                {
                fprintf(stderr, "%s\n", mysql_error(conn));
                }


Ook al zou dit werken, dan zou dit nog resulteren dat ik de code op elke machine moet aanpassen met de juiste hostname, is dit op een andere manier op te vangen?

[ Voor 20% gewijzigd door CrankyGamerOG op 16-05-2010 10:48 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CrankyGamerOG schreef op zondag 16 mei 2010 @ 10:44:
Wellicht dat iemand het volgende ook weet..
Ik wil de hostname van de machine die de query doet, mee weg schrijven in de db.
De table heeft een collumn ervoor alleen krijg ik met geen manier de hostname erin.
Op welke manier kan ik een variable setten die de hostname heeft?
Wellicht dat je zelf eens een keer wat zoekt/moeite doet/zorgt dat je de basics onder de knie hebt? En, het is al aangekaart, nogmaals: Wikipedia: SQL injection

[ Voor 10% gewijzigd door RobIII op 16-05-2010 10:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
RobIII schreef op zondag 16 mei 2010 @ 10:48:
[...]

Wellicht dat je zelf eens een keer wat zoekt/moeite doet/zorgt dat je de basics onder de knie hebt?
Daar ben ik druk mee bezig , maar ik wil uiteraard dit ook werkend hebben ;)

en check mijn edit even ;) je bent me iets te snel jij :+

MBT de SQL injection, daar ben ik me meer dan van bewust, maar dat is een stap verder.
De code is ook niet voor productie bedoeld, ik wil gewoon kijken hoe het werkt.
Als ik dat onder de knie heb kan ik het gaan verbeteren zodat ik SQL injection kan uitsluiten.

[ Voor 27% gewijzigd door CrankyGamerOG op 16-05-2010 10:51 ]

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Wat ik even niet snap is , is het niet gevaarlijk om de waarden (dus localhost,user en pass) hardcoded in de C te gebruiken?
Weet iemand hier nog iets over? Is namelijk een vraag waar ik ook wel nieuwsgierig naar ben, aangezien er best C/C++ decompilers op internet zijn te vinden. Hardcoden lijkt dus niet echt veilig... En je wilt ook niet je client het db wachtwoord in laten voeren.

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
L0calh0st schreef op zondag 16 mei 2010 @ 20:29:
[...]


Weet iemand hier nog iets over? Is namelijk een vraag waar ik ook wel nieuwsgierig naar ben, aangezien er best C/C++ decompilers op internet zijn te vinden. Hardcoden lijkt dus niet echt veilig... En je wilt ook niet je client het db wachtwoord in laten voeren.
Daar ben ik idd nog steeds benieuwd naar, het lijkt mij veiliger als je het dmv een conf file zou doen?

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 11:56
Dat lijkt me inderdaad veiliger.

Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Comp_Lex schreef op zondag 16 mei 2010 @ 21:08:
Dat lijkt me inderdaad veiliger.
Als er nou ook eens iemand met een voorbeeld kwam oid :+

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je de waardes inderdaad als clear-text opneemt in je code, kan die vaak al gewoon met notepad o.i.d. uitgelezen worden.

Je kunt de waarde misschien encrypten, maar uiteindelijk moet de waarde alsnog een keer decrypted worden en in het geheugen geladen worden. Er is eigenlijk geen 100% veilige manier om in een lokale executable username/password op te nemen. Het is een beetje afhankelijk van waar je precies een username/password voor hebt. Als het bijvoorbeeld een username/password is voor een resource op internet, dan zou je per user een aparte username/password kunnen genereren, die de gebruiker tijdens de installatie in moet vullen. Deze kun je dan ergens in een file of het register opslaan ( Eventueel encrypted met een machinekey ).

Over het punt van de hostname. Als je in een variabele de string "hostname" stopt, en die stop je daarna weer in je query is het natuurlijk logisch dat daar gewoon hostname geinsert word. Wat je dus zal moeten doen, is aan het OS via een API call de hostname opvragen. Over hoe je dat doet, is genoeg te vinden op internet.

[ Voor 18% gewijzigd door Woy op 17-05-2010 10:48 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
L0calh0st schreef op zondag 16 mei 2010 @ 20:29:
[...]


Weet iemand hier nog iets over? Is namelijk een vraag waar ik ook wel nieuwsgierig naar ben, aangezien er best C/C++ decompilers op internet zijn te vinden. Hardcoden lijkt dus niet echt veilig... En je wilt ook niet je client het db wachtwoord in laten voeren.
Ik ben zelf nu aan het kijken naar : "iniparser"
iniParser is a simple C library offering ini file parsing services. The library is pretty small (less than 1500 lines of C) and robust, and does not depend on any other external library to compile. It is written in ANSI C and should compile on most platforms without difficulty.

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
CrankyGamerOG schreef op maandag 17 mei 2010 @ 11:17:
[...]

Ik ben zelf nu aan het kijken naar : "iniparser"


[...]
Overigens lijkt het me een groter probleem dat alle db's hetzelfde wachtwoord hebben, dan dat het clear-text in de executable staat. Op een lokale machine is het wachtwoord uiteindelijk wel te achterhalen, op wat voor manier je het ook doet.

Afhankelijk van je installatie scenario kan je beter per machine tijdens de installatie een username/wachtwoord genereren, en die lokaal encrypted opslaan. Als dan iemand bij zijn installatie de username/wachtwoord achterhaalt, kan hij daar in ieder geval niks mee bij een andere installatie.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Woy schreef op maandag 17 mei 2010 @ 11:24:
[...]

Overigens lijkt het me een groter probleem dat alle db's hetzelfde wachtwoord hebben, dan dat het clear-text in de executable staat. Op een lokale machine is het wachtwoord uiteindelijk wel te achterhalen, op wat voor manier je het ook doet.

Afhankelijk van je installatie scenario kan je beter per machine tijdens de installatie een username/wachtwoord genereren, en die lokaal encrypted opslaan. Als dan iemand bij zijn installatie de username/wachtwoord achterhaalt, kan hij daar in ieder geval niks mee bij een andere installatie.
Klopt, zo heb ik het nog niet bekeken +1

Let wel op dat dit allemaal nog in de "probeer en ontdek™" fase zit , ik moet het nog leren :+

KPN - Vodafone Ziggo Partner


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is daarom een goed uitgangspunt om alle gegevens die je uiteindelijk bij de client hebt als compromised te zien. Alle manieren om dat te beveiligen zijn lapmiddelen ( Neemt niet weg dat je die misschien wel wilt toepassen ), maar je wilt eigenlijk bereiken dat de gegevens die de client heeft geen kwaad kunnen ( In ieder geval voor andere gebruikers ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • CrankyGamerOG
  • Registratie: Juni 2003
  • Laatst online: 12:23

CrankyGamerOG

Assumption is the mother.....

Topicstarter
Woy schreef op maandag 17 mei 2010 @ 12:52:
Het is daarom een goed uitgangspunt om alle gegevens die je uiteindelijk bij de client hebt als compromised te zien. Alle manieren om dat te beveiligen zijn lapmiddelen ( Neemt niet weg dat je die misschien wel wilt toepassen ), maar je wilt eigenlijk bereiken dat de gegevens die de client heeft geen kwaad kunnen ( In ieder geval voor andere gebruikers ).
ik zou elke client natuurlijk wel een eigen login kunnen maken in de db.
En aangezien het dan met een conf werkt is dat denk ik wel te doen.

food for thoughts :+

thnx

KPN - Vodafone Ziggo Partner

Pagina: 1