Toon posts:

[C++] Database efficient en veilig uitlezen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben aan het werken aan een dynamische site die werkt door middel van CGI applicaties. In een van de applicaties word een database uitgelezen. Ik had naar een tijdje werken de volgende (werkende) code.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Logon.cpp: Geeft het Logonscherm weer

#include <string>
#include <iostream>
#include <afxdb.h>
using namespace std;

int main()
{
    // txt/HTML-Header verzenden
    cout << "Content-type: text/html\n\n";

    // CDatabaseobject aanmaken
    CDatabase dbForum;
    
    // Probeer met het databestand te verbinden
    try
    {
        // Verbind het object met een read-only databron
        // Zorg dat het ODBC-verbinding dialoogvenster NOOIT verschijnt
        dbForum.OpenEx( _T( "DSN=dbForum" ), CDatabase::openReadOnly | CDatabase::noOdbcDialog );
    }
    catch(CException* e)
    {
        cout << "<html><head><title>Fout</title></head><body>"
<< "Fout tijdens het verkijgen tot toegang tot de database</body></html>";
        return 0;
    }

    // CRecordsetobject aanmaken
    CRecordset rsForum(&dbForum);
    
    // Probeer gegevens te halen uit het databestand
    try
    {
        // Open rsForum en voer de SQL-opdracht uit,
        // Statishe verbinding, 
        rsForum.Open( CRecordset::snapshot,
_T("SELECT stringname, content FROM _HTMLVariables WHERE page = 'loginscreen' ORDER BY stringname"),
            CRecordset::readOnly | CRecordset::useBookmarks | CRecordset::noDirtyFieldCheck );
    }
    catch(CException* e)
    {
        cout << "<html><head><title>Fout</title></head>" 
<< "<body>Fout tijdens het verkrijgen van informatie uit de database</body></html>";
        return 0;
    }

    // Declareren van de variabellen, die daarna door databasewaarden gevuld worden
    string
        strHTMLTitle, strHTMLcmdSubmit, strHTMLcmdRegister, strHTMLcmdCancel, strHTMLsrcJavaScript, 
        strHTMLMainMessage, strHTMLUser, strHTMLPass, strHTMLsrcStyle, strHTMLcgiLogin, strHTMLcgiRegister
    ;
    
    // Voor de tijdelijke opslag voor veldwaarde
    CString cstrValue;
    string strValue;

    rsForum.GetFieldValue(1, cstrValue); strHTMLcgiLogin = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcgiRegister = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdCancel = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdRegister = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdSubmit = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLMainMessage = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLPass = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLsrcJavaScript = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLsrcStyle = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLTitle = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLUser = LPCTSTR(cstrValue);

    // Set van records en connectie naar Database sluiten
    rsForum.Close( );
    dbForum.Close( );
    
    // De pagina zelf
    cout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"" 
<< "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"
<< "\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n"
<< "<head>\n\t<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\" />\n\t"
<< "<title>" << strHTMLTitle << "</title>\n";
    
    // Geen javascripttags als er geen javascript gebruikt word
    if (strHTMLsrcJavaScript != "none") {
        cout << "\n\t<script languague=\"javascript\" src=\"" << strHTMLsrcJavaScript << "\"></script>";
    }

    // vervolg pagina
    cout << "\n\t<link rel=\"stylesheet\" href=\"" << strHTMLsrcStyle << "\""
<< "type=\"text/css\" />\n</head>\n\n"
        << "<body>\n\t<div id=\"main\">\n\t\t<div class=\"title\">" << strHTMLMainMessage << "</div>\n"
        << "\t\t<form method=\"post\" action=\"" << strHTMLcgiLogin << "\">\n"
        << "\t\t\t<table border=\"0\" width=\"100%\">\n"
        << "\t\t\t\t<tr><td>" << strHTMLUser 
<< "</td><td><input type=\"text\" name=\"cgiLoginName\" maxlength=\"50\" /></td></tr>\n"
        << "\t\t\t\t<tr><td>" << strHTMLPass 
<< "</td><td><input type=\"password\" name=\"cgiLoginPassWord\" maxlength=\"50\" /></td></tr>\n"
        << "\t\t\t</table>\n"
        << "\t\t\t<div class=\"buttons\">\n"
        << "\t\t\t\t<input type=\"submit\" value=\""
<< strHTMLcmdSubmit << "\" name=\"cmdSubmit\" />\n"
        << "\t\t\t\t<input type=\"reset\" value=\""
<< strHTMLcmdCancel << "\" name=\"cmdCancel\" />\n"
        << "\t\t\t\t<input type=\"button\" value=\""
<< strHTMLcmdRegister << "\" name=\"cmdRegister\" />\n"
        << "\t\t\t</div>\n"
        << "\t\t</form>\n"
        << "\t</div>\n</body>\n\n</html>";

    return 0;
}


Maar over het volgende gedeelte was ik niet tevrede:
C++:
1
2
3
4
5
6
7
8
9
10
11
    rsForum.GetFieldValue(1, cstrValue); strHTMLcgiLogin = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcgiRegister = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdCancel = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdRegister = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLcmdSubmit = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLMainMessage = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLPass = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLsrcJavaScript = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLsrcStyle = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLTitle = LPCTSTR(cstrValue); rsForum.MoveNext( );
    rsForum.GetFieldValue(1, cstrValue); strHTMLUser = LPCTSTR(cstrValue);


Zoals je ziet is daar geen enkele vorm van foutcontrole. Dit heb ik opgelost (gedeeltelijk, niet naar mijn voldoening) met andere code. Eerst werkte deze niet:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    rsForum.GetFieldValue(0, cstrValue);
    strValue = LPCTSTR(cstrValue);
    if (strValue == "strHTMLcgiLogin")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLcgiLogin = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLcgiRegister")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLcgiRegister = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLcmdCancel")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLcmdCancel = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLcmdRegister")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLcmdRegister = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLcmdSubmit")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLcmdSubmit = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLMainMessage")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLMainMessage = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLPass")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLPass = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLsrcJavaScript")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLsrcJavaScript = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLsrcStyle")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLsrcStyle = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLTitle")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLTitle = LPCTSTR(cstrValue);
        rsForum.MoveNext( );
        rsForum.GetFieldValue(0, cstrValue);
        strValue = LPCTSTR(cstrValue);
    }
    if (strValue == "strHTMLUser")
    {
        rsForum.GetFieldValue(1, cstrValue);
        strHTMLUser = LPCTSTR(cstrValue);
    }


Dez gaf op de regels met GetFieldValue(1, cstrValue) aanroepen de volgende foutmeldingen: "error C2668: 'GetFieldValue' : ambiguous call to overloaded function"
Dit heb ik opgelost door de query aan te passen naar ""SELECT * FROM _HTMLVariables WHERE page = 'loginscreen' ORDER BY stringname"", en daarna de nullen te vervangen door eenen en de eenen doo tweeen.

Zoals je ziet lost deze werkende code niet alle foute op en is hij uiterst lang, iets dat naar mijn idee beter en korter kan (en overzichterlijker). Ook gaf deze nieeuwe code ineens nieuwe warnings op de catch regels: "warning C4101: 'e' : unreferenced local variable Linking...".

De code geeft nu wel correcte uitvoer en ik weet dat er nog foutcontroles ingebouwd moeten worden in het uitleesgedeelte, maar ik wou eerst de code inkrimpen. Alhoewell ik geen idee heb hoe.

Hier nog even de database:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
page    |stringname                     |content
----------------------------------------------------------------------------
loginscreen | strHTMLTitle  | :: C++ Forum - Login ::
loginscreen | strHTMLcmdSubmit  | Aanmelden
loginscreen | strHTMLcmdRegister    | Registreren
loginscreen | strHTMLcmdCancel  | Wissen
loginscreen | strHTMLsrcJavaScript  | none
loginscreen | strHTMLMainMessage    | Welkom op het C++ Forum
loginscreen | strHTMLUser   | Gebruikersnaam
loginscreen | strHTMLPass   | Wachtwoord
loginscreen | strHTMLsrcStyle   | style\loginscreen.css
loginscreen | strHTMLcgiLogin   | login.exe
loginscreen | strHTMLcgiRegister    | register.exe

Ik gebruik Microsoft Visual C++ 6.0

Voor de duidelijkheid:
Heeft iemand een idee of een steundje in de goede richting betreffende het kleiner (en veiliger) maken van de code waarin de Recordsetvelden worden uitgelezen?

[ Voor 78% gewijzigd door Verwijderd op 23-02-2004 22:52 . Reden: Anti-opmaak vernageling ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

C++:
1
std::map<std::string, std::string>  Datafields;

?

Ik snap overigens vooral zo snel niet waarop je foutcontrole wil doen. Op het wel/niet aanwezig zijn van velden, DB errors, whatever?

[ Voor 51% gewijzigd door curry684 op 24-02-2004 10:05 ]

Professionele website nodig?


Verwijderd

Topicstarter
Op ten duur wil ik natuurlijk voor elke mogelijke fout een controlemechanisme hebben, zodat het programma vrijwel niet vastloopt, en altijd 'netjes' een foutcode stuurt naar de browser. Ik ben nu op het moment bezig om in het gedeelte met alle GetFieldValue foutcontrolle onder te brengen. Ik ben dus eerst begonnen met het schrijven van code die checkt of de veldwaarde die ik wil opslaan in de string wel in die string moet: (dit gedeelte dus)

C++:
1
2
3
4
5
6
7
8
    // controleer of het stringname-veld overeenkomt met de te vullen variabele
    if (strValue == "strHTMLcgiLogin")
    { 
        // Veld stringname en variabele komen overeen
        // strHTMLcgiLogin vullen met inhoud van veld content, waar in hetzelfde record
        // de waarde van het veld stringname "strHTMLcgiLogin" is
        rsForum.GetFieldValue(1, cstrValue); 
        strHTMLcgiLogin = LPCTSTR(cstrValue); 


Deze code werkt prima en hoeft maar een keer doorlopen te worden (de query is namelijk op alfabet gesorteerd en deze code ook). Maar ik vind de code persoonlijk behoorlijk lang, en vraag me dus af of dat echt niet korter kan.

(Oja: foutcontrole: ga nog controleren bij elke rsForum.MoveNext of het recordset al aan het einde is (rsForum.IsEOF))

dus dan word de code zoiets:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    if ( !rsForum.IsEOF( ) ){
       rsForum.GetFieldValue(0, cstrValue); 
       strValue = LPCTSTR(cstrValue); 
       if (strValue == "strHTMLcgiLogin") 
       { 
           rsForum.GetFieldValue(1, cstrValue); 
           strHTMLcgiLogin = LPCTSTR(cstrValue); 
           if ( !rsForum.IsEOF( ) ){
              rsForum.MoveNext( ); 
              rsForum.GetFieldValue(0, cstrValue); 
              strValue = LPCTSTR(cstrValue); 
           } 
      }
    }


Maar zoals je ziet word de code bij elke foutcontrole die ik toevoeg enorm veel vrergroot en omdat alle if-statements vrijwel hetzelfde doen (met uitzondering van de te vulle variabel en de veldnaam die daarmee overeenkomt) dacht ik dat dit wel iets beter kon. Maar ik heb dus zoals al gezecht geen idee hoe ik zo'n (waarschijnlijk loop) constructie moet bouwen waarin de variabelnaam variabel is.

(bovendien heb ik het idee dat ik nodeloos moeilijk aan het doen ben op deze manier)

(Gaat nu even wakker worden en eten enzo... Bovendien moet me zusje, dus kan er de komende tijd (enkele uren I think) eventjes niet naar kijken)

[ Voor 6% gewijzigd door Verwijderd op 24-02-2004 10:31 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Oftewel je probleem is dat je in de originele code afhankelijk bent van de volgorde en je wil alle waardes juist vast hangen aan hun echte naam... wat is er dan mis met een map:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
map<CString, CString> l_Fields;
CString l_Name;
CString l_Value;
while(!rsForum.IsEOF())
  {
  rsForum.GetFieldValue(0, l_Name); 
  rsForum.GetFieldValue(1, l_Value); 
  l_Fields[l_Name] = l_Value;
  rsForum.MoveNext();
  }
cout << "Cancel = " << l_Fields["strHTMLcmdCancel"] << endl;
cout << "Titel = " << l_Fields["strHTMLTitle"] << endl;

Ben je d'r toch met 5 regels code? :?

kan wellicht niet helemaal 100% werken, ik heb geen VC hier of zo, dus je zal zelf even wat moeten tweaken wellicht :)

[ Voor 17% gewijzigd door curry684 op 24-02-2004 10:36 ]

Professionele website nodig?


Verwijderd

Topicstarter
Met enkele aanpassingen van de code stuite ik op twee problemen:
- rsForum.GetFieldValue(0, variabele); geeft telkens een error dus MOET ik drie tabellen opvragen waarvan ik er een niet gebruik
- Met de nieuwe (eenigsinds aangepaste code zodat hij overeenkomt met de rest van het document) krijg ik 119 Warnings. Ik zoek uit hoe ik die er uit krijg, want dat zijn er natuurlijk veel te veel.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 24 februari 2004 @ 16:59:
Met enkele aanpassingen van de code stuite ik op twee problemen:
- rsForum.GetFieldValue(0, variabele); geeft telkens een error dus MOET ik drie tabellen opvragen waarvan ik er een niet gebruik
- Met de nieuwe (eenigsinds aangepaste code zodat hij overeenkomt met de rest van het document) krijg ik 119 Warnings. Ik zoek uit hoe ik die er uit krijg, want dat zijn er natuurlijk veel te veel.
- Wat voor error?
- Wat voor warnings?

:z

Professionele website nodig?


Verwijderd

Topicstarter
Ja snap je reactie, maar zat er zelf nog mee te spelen (bovendien, alle warnings bij elkaar namen 25 pagina's in beslag dus dat laat maar :) )...

Zat in MSDN te zoeken, kwam ik dit tegen: http://msdn.microsoft.com...MAPCCEND_(STL_SAMPLE).asp

daar staat dus een #pragma warning(disable:4786), en die haalt inderdaad mooi al mijn warnings weg :)

[ Voor 15% gewijzigd door Verwijderd op 24-02-2004 17:26 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 24 februari 2004 @ 17:22:
Ja snap je reactie, maar zat er zelf nog mee te spelen (bovendien, alle warnings bij elkaar namen 25 pagina's in beslag dus dat laat maar :) )...

[...]

daar staat dus een #pragma warning(disable:4786), en die haalt inderdaad mooi al mijn warnings weg :)
Als je ze allemaal met 1 pragma wegkrijgt waren het 25 pagina's met dezelfde anders hoor ;)

Professionele website nodig?


Verwijderd

Topicstarter
Ja klopt :)

Dit was een van de warnings:
c:\program files\microsoft visual studio\vc98\include\xtree(120) : warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,
std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<cha
r,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::_Kfn,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basi
c_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information
c:\program files\microsoft visual studio\vc98\include\map(46) : see reference to class template instantiation 'std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::basic_string<char,std::char_traits<
char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<cha
r> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::_Kfn,std::less<std::basic_string<char,std::char_traits<char>,std::allocato
r<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' being compiled


Kan ik daar verder nog iets aan doen, of zijn ze gewoonweg onschadelijk?


Verder werkt dat programma nu helemaal naar behoren. Even een ander vraagje. Ik vraag op deze pagina een wachtwoord op, deze word via post verzonden naar login.exe. Nu wil ik graag dit wachtwoord in login.exe versleutelen, en zo vergelijken met de versleutelde opgeslagen waarde in de database. (deze waarde komt daar doordat bij de regristratie op dezelfde manier het wachtwoord word versleuteld). Weet iemand of er daar functies voor zijn? Heb al wel gezocht in MSDN, maar die vind alleen in Visual Studio .Net hulpmiddellen voor encrypty.

[ Voor 145% gewijzigd door Verwijderd op 24-02-2004 21:47 ]


Verwijderd

Topicstarter
* Schop *

Het programma hierboven werkt geheel naar behoren. Nu heb ik nog enkele andere vragen (naar aanleiding van aanverwante programma's):
- Ik vraag op deze pagina een wachtwoord op, deze word via post verzonden naar login.exe. Nu wil ik graag dit wachtwoord in login.exe versleutelen, en zo vergelijken met de versleutelde opgeslagen waarde in de database. (deze waarde komt daar doordat bij de regristratie op dezelfde manier het wachtwoord word versleuteld). Heb al wel gezocht in MSDN naar encrypty en enkele andere woorden zoals md5, maar die vind alleen in Visual Studio .Net hulpmiddellen voor encrypty.
- Ik heb problemen met een query:
Ik heb een tabel (_user) met een primaire sleutel (userID), en twee velden (username en password). Daaraan wil ik een gebruiker toevoegen met behulp van INSERT. deze moet natuurlijk een eigen userID hebben. Nu had ik voor het maken van een numerieke waarde daarvoor hetvolgende bedacht:
SQL:
1
2
3
SELECT
MAX(userID) + 1
FROM _user;


Dat werkt natuurlijk
ook de SQL-commando om het veld in te vullen werkt:
SQL:
1
2
3
INSERT
INTO _user
VALUES (3, "TestNaam", "TestWachtwoord");

Ook die werkt naar behoren, er word een user met userID 3 gemaakt, met gebruikersnaam TestNaam en wachtwoord TestWachtwoord

Maar omdat ik de userID steeds anders wou laten zijn had ik dit bedacht:
SQL:
1
2
3
4
5
6
7
INSERT
INTO _user
VALUES (
  (SELECT
  MAX(userID) + 1
  FROM _user)
  , "TestNaam", "TestWachtwoord");


En die geeft de prachtig duidelijke error: "Er is een fout opgetreden met deze waarden: Niet nader omschreven fout". Nu verdenk ik er zelf van dat je geen SELECT kan nesten in een INSERT INTO VALUES, mar wou het zo aanpakken om te voorkomen dat twee gebruikers vrijwel tegelijkertijd aanmelden en zo hetzelfde ID krijgen (door vertragingen in het programma).
- Iets waar ik van morgen tegen aanliep: Een programma ontvangt informatie via de post action van een HTML-form. Maar stel voor, als iemand voor de grap gewoon het programma opvraagt. Dan krijgt het programma geen invoer en blijft hij dus geladen. Dit is een groot probleem, omdat dan op ten duur het geheugen volloopt tijsend gebruik. Dit probleem ervaar ik hierdoor:

Opvangen van de door het HTML-Formulier verzonden waarden:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Invoer van de post ontvangen
string strCGIInput;
cin >> strCGIInput;

// Maak een opslagplaats voor de gegevens uit de post
map<string, string> mapInput;
string strCGIName, strCGIContent;

// Loop voor het aantal voorkomende & tekens in string strCGIInput
while(!(strCGIInput.find('&') == -1))
  {
  // Gegevens ophalen en in mapInput opslaan
  strCGIName = strCGIInput.substr(0, strCGIInput.find('=')); 
  strCGIContent = strCGIInput.substr((strCGIInput.find('=') + 1), 
      (strCGIInput.find('&') - (strCGIInput.find('=') + 1)));
  strCGIInput = strCGIInput.substr((strCGIInput.find('&') + 1), strCGIInput.length());

  // Map vullen waar mapInput[strCGIName]=strCGIContent
  mapInput[strCGIName] = strCGIContent;
} 

Voor de duidelijkheid: Die code werkt GEHEEL naar behoren maar als het programma geen invoer krijgt (voor de cin) dan blijft het programma actief tot het eind der tijden zeg maar... En das best wel een probleem.

- Een opdoemend probleem waar ik nog niet aan gedacht heb hoe ik dat ga aanpakken omdat ik nog niet aan dat gedeelte ben toegekomen (moet eerst zorgen dat inlog en regristratiegegevens fatsoenlijk afgehandelt worden). Het bijhouden bij elke pagina wie er gebruik maakt van de pagina. Ik had iets bedacht met parameters ofzo achter het bestandsnaam maar dat is onveilig.

[ Voor 4% gewijzigd door Verwijderd op 25-02-2004 23:32 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op 24 februari 2004 @ 17:26:
Ja klopt :)

Dit was een van de warnings:
c:\program files\microsoft visual studio\vc98\include\xtree(120) : warning C4786: 'std ...

Kan ik daar verder nog iets aan doen, of zijn ze gewoonweg onschadelijk?
STLFilt, of upgraden naar MSVC7.x
(2004-98)=teveel.

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


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 25 februari 2004 @ 23:31:
Voor de duidelijkheid: Die code werkt GEHEEL naar behoren maar als het programma geen invoer krijgt (voor de cin) dan blijft het programma actief tot het eind der tijden zeg maar... En das best wel een probleem.
Kijk eens naar de CONTENT_LENGTH environment variable.
Pagina: 1