* Uofficiel Black/White liste V3
|
Denne tråd er over 6 måneder gammel
Er du sikker på, at du har noget relevant at tilføje?
C++ / Mysql / SystemAf Elitebruger jakob_lk | 30-09-2005 20:50 | 2478 visninger | 30 svar, hop til seneste
Hej..
Jeg er ved at prøve mig frem med c++ og mysql. men det er sku ikke helt så let som det lige virke til..
så vil gerne have lidt hjælp..
jeg køre en while hvor den skriver alle name og id ud fra en tabel
men jeg vil så gerne have den til at blande det sammen med lidt mere.
Det skal være sådan at den henter alle name og id fra min tabel og bruger dem to til at køre et andet linux script på min server.
har tænkt mig det skal se sådan ud.
system(echo '<name fra tabek>'|/root/status --id <id fra tabel>)
nå den så har køret det skal den gå ind og updater et felt ' disabled' og rette værdien til 1.
Håber der en som kan hjælpe mig.
Desvære har jeg ikke rigtig nogle point at gi, men håber der er en vendelig person som vil hjælpe mig.
--
Har ikke lige læst din kode, da jeg har travlt pt. Men hvis du kan forklare hvad problemet/fejlen er så skal jeg nok følge op på det imorgen over middag engang. -- Gæstebruger, opret dit eget login og få din egen signatur. Her er min kode hvis nogle kan hjælpe !
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
#include "/usr/include/mysql/mysql.h"
int main()
{
/* connection */
MYSQL *handle;
/* query result */
MYSQL_RES *result;
/* række i query result */
MYSQL_ROW row;
/* antal felter i query result */
int nfields;
/* pointer til array med felt længder i række i query resuult */
int *l;
/* counter */
int i;
/*
* åben connection til:
* server = "localhost"
* username = "root"
* password = ""
* database = "Test"
* port = 0 (bliver opfattet som default 3306)
*/
handle= mysql_init(NULL);
if(handle == NULL)
{
printf("MySQL error: %s", mysql_error(handle));
exit(1);
}
if(!mysql_real_connect(handle, "localhost", "root", "", "test", 0, NULL, 0))
{
printf("MySQL error: %s", mysql_error(handle));
exit(1);
}
/* udfør query */
mysql_query(handle, "SELECT name FROM test");
result = mysql_store_result(handle);
/* print resultat af query */
nfields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result))) {
l = (int *)mysql_fetch_lengths(result);
for (i=0; i<nfields; i++) {
printf(" %.*s", row ? l : 4, row ? row : "NULL");
}
printf("
");
}
/* luk query */
mysql_free_result(result);
/* luk connection */
mysql_close(handle);
return 0;
} -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] selv kode virker som det skal .. det er bare det sted hvor jeg skal bruge dataen fra mysql
Jeg vil gerne hvis jeg kunne bruge dataen som i php.
Fx.
system(echo '<name fra tabek>'|/root/status --id <id fra tabel>)
Det er den system commando jeg gerne vil have kørt. hvor den så i <name fra tabek> og <id fra tabel> bruger dataen fra mysql.
Når den så har gjordt det skal den update i den date den lige har hentet ud.
Den skal rette "disabled" fra 0 til 1 -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Hmm ja den var værre, ved ikke lige om der en funktion til at hive de bestemte ting fra row'en, men ellers må du nærmest lave en selv jo :/
Alternativt kan du hive dem fra databasen seperat - dog lidt surt også.
Den disabled du omtaler, er det et felt i databasen eller ? -- Gæstebruger, opret dit eget login og få din egen signatur. Hmm...ved ikke lige hvordan jeg skal lave det da jeg ikke er helt inde i det....
Det disabled det er et felt i databassen. -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] #5 > Ok, for at update disabled laver du jo bare en sql query mere:
char tmp[256];
mysql_query(handle, "SELECT id FROM test");
result = mysql_store_result(handle);
row = mysql_fetch_row(result);
sprintf (tmp, "UPDATE test SET disabled=1 WHERE id=%s", row);
mysql_query(handle, tmp);
Så updater den disabled (forudsat row er en streng, vil jeg dog tro den er, men hvis ikke så %i istedet)
Mht. at hive dataene ud, kan du så ikke lave en "SELECT * FROM test"
og så print("%s", row);
Og skrive hvad den så skriver på skærmen, her i forummet. Så skal jeg nok bikse noget kode sammen til formålet. -- Gæstebruger, opret dit eget login og få din egen signatur. Ved ikke om jeg har gjordt det rigtig, men jeg har ændret det til..
/*
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
#include "/usr/include/mysql/mysql.h"
int main()
{
/* connection */
MYSQL *handle;
/* query result */
MYSQL_RES *result;
/* række i query result */
MYSQL_ROW row;
/* antal felter i query result */
int nfields;
/* pointer til array med felt længder i række i query resuult */
int *l;
/* counter */
int i;
/*
* åben connection til:
* server = "localhost"
* username = "root"
* password = ""
* database = "Test"
* port = 0 (bliver opfattet som default 3306)
*/
handle= mysql_init(NULL);
if(handle == NULL)
{
printf("MySQL error: %s", mysql_error(handle));
exit(1);
}
if(!mysql_real_connect(handle, "localhost", "root", "", "test", 0, NULL, 0))
{
printf("MySQL error: %s", mysql_error(handle));
exit(1);
}
/* udfør query */
mysql_query(handle, "SELECT name FROM test");
result = mysql_store_result(handle);
/* print resultat af query */
nfields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result))) {
print("%s", row);
printf("
");
}
/* luk query */
mysql_free_result(result);
/* luk connection */
mysql_close(handle);
return 0;
}
*/
Og når jeg comepiler den får jeg følgende fejl.
sms.cpp: I function 'int main()':
sms.cpp:45: error: `print' undeclared (first use this function)
sms.cpp:45: error: (Each undeclared identifier is reported only once for each
function it appears in.)
Hvis det bedre passer dig kan du fange mig på mail : smaakage @ kagenet.dk -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] while ((row = mysql_fetch_row(result))) {
print("%s", row);
printf(" ");
Den understregede linie skal være printf, det er bare en slå fejl :) -- Gæstebruger, opret dit eget login og få din egen signatur. Nu jeg jeg prøvet med i og s og jeg får nogle meget mærkelig output.
jeg går bare nogle tal, og ingen af dem har jeg i databassen..
Intete af det giver nogle mening.. -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Hmmm nedtur, hvad output skrev den med din oprindelige kode (den fra #0) ? -- Gæstebruger, opret dit eget login og få din egen signatur. #9+10 mon ikke MYSQL_ROW row er en struct eller array? (linked list?) og ikke en streng? - så ville printf("%s", row); jo bare give nogle 'tilfældige' RAM-adresser... - har ikke lige tid til at undersøge det nu, men måske senere på dagen :-) -- Gæstebruger, opret dit eget login og få din egen signatur. yup - sådan er MYSQL_ROW defineret:
typedef char **MYSQL_ROW;
og nu kan jeg jo knapt huske hvordan sådan noget skal gøres, men prøv evt
printf("%s", &row); -- Gæstebruger, opret dit eget login og få din egen signatur. #11 > Det var jo ikke til at vide før vi testede det, vel ? :)
Har aldrig brugt SQL og C sammen, og da jeg ikke har database og kode, kan jeg ikke lave den slags tests selv. Men jo meget tyder på en struct/array, hvilket egentlig kun gør tingene nemmere - når vi lige hitter ud af hvad formatering denne har. -- Gæstebruger, opret dit eget login og få din egen signatur. Ah en **, det forklarer jo en del :)
Men din kode er gal, det skal være:
printf("%s", *row);
På den anden måde går du i modsatte retning :) (& = address of)
Så #0 prøv at lave en printf("%s", *row); og skriv outputtet herinde. -- Gæstebruger, opret dit eget login og få din egen signatur. Uhm btw. når det er ** burde det vel egentlig være et array af char*. men en row er jo bare en row. Hmmm meget mystisk.
Hvis printf("%s", *row) giver sære resultater, så prøv:
printf("%s", row[0]); -- Gæstebruger, opret dit eget login og få din egen signatur. Efter at have tænkt lidt mere over det, så tror jeg at jeg har en løsning der spiller. I din oprindelige kode fra #0 er følgende:
for (i=0; i<nfields; i++) {
printf(" %.*s", row ? l : 4, row ? row : "NULL");
}
Hvis du erstatter det understregede med:
printf("%s
", row[i]);
Så skulle den gerne spytte hver felt ud på en linie for sig (f.eks. select Navn, Adresse from Personer) så får du:
Navn
Adresse
Hvis du får et sådanne resultat, kan du tilgå row ligesom i php, altså row[0] er det første i dit select statement, row[1] det næste, osv. -- Gæstebruger, opret dit eget login og få din egen signatur. #13 hvis nu man kører linux kunne man bare se efter her: /usr/include/mysql/mysql.h (se linie 90) - i windows ved jeg ikke lige hvor den ligger, men... :-)
#15 row er jo også en slags tupple, altså en array af strings - så det er vel egentlig klart at den bliver nødt til at være ** -- The opposite of a correct statement is a false statement. But the opposite of a profound truth may well be another profound truth.
-- Niels Bohr #17 > Jah det kan man vel sige, en anden mulighed var en sammenkædet string med f.eks. komma separering.
Mht. at se i .h filen sidder jeg ved en maskine uden compiler - så har ingen headers at se på :D -- Gæstebruger, opret dit eget login og få din egen signatur. Hej...
Nu har jeg fået den til at udskive navn, men den gentar det bare lige så mangle gang som der er felter... -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Har fundet ud af det :) -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] men jeg har leget lidt med det databasse update. og kan ikke helt få det til at virke !!
-- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Hej igen, har ikke lige haft tid, men er klar nu. Du har fået den til at hive felterne og lave system(blabla) eller hvordan?
Det med at update disabled er det der volder problemer nu, korrekt ?
Kan du ikke lige give mig det select statement du bruger (altså select Navn, Id, whatever from hvor)
Jeg går ud fra dit SELECT Navn from TEST ikke er det endelige statement ? -- Gæstebruger, opret dit eget login og få din egen signatur. Hej...
har lige lagt en kopi op så du kan se hvordan det ser ud pt.
http://kagenet.dk[...]
jeg kan godt hive data ud fra et enkelt felt, men det med system og update mangler jeg stadig.. -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Du må i øvrigt gerne lige skrive, om det virker :) -- Gæstebruger, opret dit eget login og få din egen signatur. Hejsa, havde næsten glemt dig her i weekenden :D Men nu er jeg frygteligt tilbage.
Det er muligt du lige skal #include <stdio.h> også, men prøv om det duer uden (du har cstdio, den tjener muligvis formålet, hvis ikke så include stdio)
Derudover har du tre variabler der ikke bruges:
int *l
int i
int nfields
nfields bliver dog udfyldt, men derefter ikke anvendt. Hvis du ikke vil udbygge programmet bør du fjerne disse.
Jeg har ændret indrykning og kommentering af din kode lidt, håber ikke det er alt for slemt at læse :)
Men du kan finde koden her, den burde gøre det du ønsker (vise navn og id, update disabled, lave system kaldet)
http://up.peecee.dk[...] -- Gæstebruger, opret dit eget login og få din egen signatur. Hej....det ser rigtig godt ud og tror også det virke, men tror jeg har lavet en fejl i min system commando...
er der ikke en måde jeg kan få skrevet den ud så jeg kan se hvad der går galt ? -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] Og hvad står det der char tmp[100]; endelig for det??
de 100 ? -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...] #26 > Altså du vil gerne se hvad din system kommando ender op som ?
Det er nemt nok, du ændrer bare følgende:
system(tmp);
til
printf(tmp);
mht. char tmp[100]; så betyder de 100 at der er plads til 100 tegn (f.eks. fylder "hej" 3 tegn).
100 er langt mere end rigeligt, men da hver tegn kun fylder 1 byte, og dit program er meget småt, synes jeg ikke der er grund til at enten:
a. allokere dynamisk
eller
b. finde en max værdi der passer nøjagtigt
så derfor de 100, i større programmer bør man nok allokere dynamisk, men som sagt i dit tilfælde er det ligegyldigt :) -- Gæstebruger, opret dit eget login og få din egen signatur. Hej....
DU er bare en skatter... ikke nok med at du næsten har lavet det, men jeg er også vil at kunne se lidt hvordan det c++ virker...
Mange gange tak ! -- Skype : kagenet
MSN : SmaaKage(at)KageNet.dk
HP : www.KageNet.dk[...]
Grundet øget spam aktivitet fra gæstebrugere, er det desværre ikke længere muligt, at oprette svar som gæst.
Hvis du ønsker at deltage i debatten, skal du oprette en brugerprofil.
Opret bruger | Login
|
Du skal være logget ind for at tilmelde dig nyhedsbrev.
Hvilken udbyder har du til internet? 426 personer har stemt - Mit energiselskab (Ewii f.eks) 12%
|
|
|