Daten einlesen, abfragen und vergleichen
-
Hallo,
es ist vollkommen egal in welcher Sprache du das ganze machst, das Prinzip bleibt immer das gleiche.
Vom Beispiel von TheChrissy würde ich jedoch Abstand nehmen. Thema http://de.wikipedia.org/wiki/SQL-Injection
-
Ok, danke
Wie könnte man das denn am besten in einer If - Abfrage unterbringen ?
Sprich:
.
.
.
If (EingabeBenutzer==BenutzerNameDB && EingabePasswort==PasswortDB)
{
öffne das nächste fenster;
}
.
.
.Hab leider noch nicht viel Ahnung von SQL, arbeite aber dran
-
Die Richtung von TheChrissy hat schon gestimmt, nur solltest du die übergebenen Eingaben (Benutzername, Kennwort) prüfen.
Entweder das ganze richtig escapen oder z.B. als Prepared Statement ausführen.Nachdem du dann den Befehl an die Datenbank geschickt hast, prüfst du einfach ob ein Eintrag zurück kam. Wenn das der Fall ist waren die Zugangsdaten richtig und du kannst weiter machen.
-
Hallo,
ich wollte eigentlich nur ein schnelles Beispiel bringen. Das es nicht sicher ist, ist mir klar.
Ansonsten nimmt man solche Prüfungen immer auf dem Server bzw. auf der Datenbank vor. Andernfalls müsstest du ja erst die Login Daten zurück schicken.
Liebe Grüße
Christopher
-
Moin,
könnt ihr mir vielleicht noch kurz verraten wie ich das in C++ umsetzte:
.$_POST['benutzer']
$_POST ist ja quasi eine globale Variable, die alle Daten speichert, die gepostet werden oder versteh ich das falsch.
Womit wäre das in C++ vergleichbar ??
Grüße
-
meine Abfrage sieht jetzt so aus:
"SELECT * FROM bndlaender WHERE Nachname=tb_Name->Text and Passwort=tb_Passwort->Text";
läuft aber leider nicht
-
Hallo,
ich habe leider keinerlei Erfahrung mit Datenbank abfragen über C++. Vielleicht könntest du noch ein wenig mehr Code posten. Vielleicht findet man dann die Ursache.
Gruß
Christopher
-
hab jetzt mal ein bisschen weiter rumgesucht und geforscht, mittlerweile sieht die Abfrage so aus:
befehl = verbindung->CreateCommand(); befehl->CommandText = "SELECT count(*) FROM Konten WHERE Nachname='Schmitz' and Passwort='abc'"; Int32 count = (int) ExecuteScalar();
das Ergebnis ist leider das gleiche. Weiß allerdings noch nicht genau ob die ExecuteScalar() - Methode so richtig angewand ist...
-
Ein paar mehr Information wären hilfreich
C++, ok, aber welche Datenbank. Verwendest du zufällig die SqlCommand-Klasse (.NET Framework)?
-
arbeite mit SQL Server 2008
hier mal der ganze Code:
#pragma once namespace Touch_Test_2 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Windows::Forms; using namespace System::Data::SqlClient; /// <summary> /// Zusammenfassung für Login_Test /// </summary> public ref class Login_Test : public System::Windows::Forms::Form { String ^verbindungsstr; SqlConnection ^verbindung; SqlCommand ^befehl; SqlDataReader ^leser; //int ^_object; array<String^> ^dbNachname; array<String^> ^dbVorname; array<String^> ^dbPasswort; private: System::Windows::Forms::TextBox^ tb_Name; private: System::Windows::Forms::TextBox^ tb_Passwort; private: System::Windows::Forms::Button^ btn_Anmelden; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Label^ label2; public: virtual Object^ ExecuteScalar(); public: Login_Test(void) { InitializeComponent(); // verbindungsstr = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Konten.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; verbindung = nullptr; befehl = nullptr; leser = nullptr; dbNachname = gcnew array<String^>(16); dbVorname = gcnew array<String^>(16); dbPasswort = gcnew array<String^>(16); try { // Verbindung herstellen verbindung = gcnew SqlConnection(verbindungsstr); verbindung->Open(); // Daten aus Datenbank abfragen befehl = verbindung->CreateCommand(); befehl->CommandText = "SELECT * FROM bndlaender WHERE Nachname='Wynands' and Passwort='abc'"; //System::Object ^_object = ExecuteScalar(); /*dbNachname[0] = leser->GetString(0); dbVorname[0] = leser->GetString(0); dbPasswort[0] = leser->GetString(0);*/ } catch (SqlException ^e) { MessageBox::Show(e->Message, "Datenbankfehler"); } catch (Exception ^e) { MessageBox::Show(e->Message, "Datenbankfehler"); } finally { if (leser != nullptr) leser->Close(); if (verbindung != nullptr) verbindung->Close(); } // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Login_Test() { if (components) { delete components; } } private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->tb_Name = (gcnew System::Windows::Forms::TextBox()); this->tb_Passwort = (gcnew System::Windows::Forms::TextBox()); this->btn_Anmelden = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // tb_Name // this->tb_Name->Location = System::Drawing::Point(158, 73); this->tb_Name->Name = L"tb_Name"; this->tb_Name->Size = System::Drawing::Size(215, 20); this->tb_Name->TabIndex = 0; // // tb_Passwort // this->tb_Passwort->Location = System::Drawing::Point(158, 148); this->tb_Passwort->Name = L"tb_Passwort"; this->tb_Passwort->Size = System::Drawing::Size(215, 20); this->tb_Passwort->TabIndex = 1; // // btn_Anmelden // this->btn_Anmelden->BackColor = System::Drawing::Color::Transparent; this->btn_Anmelden->FlatAppearance->BorderSize = 3; this->btn_Anmelden->FlatAppearance->MouseDownBackColor = System::Drawing::Color::Olive; this->btn_Anmelden->FlatAppearance->MouseOverBackColor = System::Drawing::Color::DarkKhaki; this->btn_Anmelden->FlatStyle = System::Windows::Forms::FlatStyle::Flat; this->btn_Anmelden->Font = (gcnew System::Drawing::Font(L"Magneto", 9, static_cast<System::Drawing::FontStyle>((System::Drawing::FontStyle::Bold | System::Drawing::FontStyle::Italic)), System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->btn_Anmelden->ForeColor = System::Drawing::Color::DarkRed; this->btn_Anmelden->Location = System::Drawing::Point(151, 202); this->btn_Anmelden->Margin = System::Windows::Forms::Padding(4, 3, 4, 3); this->btn_Anmelden->Name = L"btn_Anmelden"; this->btn_Anmelden->Size = System::Drawing::Size(165, 27); this->btn_Anmelden->TabIndex = 4; this->btn_Anmelden->Text = L"Anmelden"; this->btn_Anmelden->UseVisualStyleBackColor = false; this->btn_Anmelden->Click += gcnew System::EventHandler(this, &Login_Test::btn_Anmelden_Click); // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(27, 81); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(35, 13); this->label1->TabIndex = 2; this->label1->Text = L"Name"; // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(27, 147); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(52, 13); this->label2->TabIndex = 3; this->label2->Text = L"Kennwort"; // // Login_Test // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(466, 262); this->Controls->Add(this->label2); this->Controls->Add(this->label1); this->Controls->Add(this->btn_Anmelden); this->Controls->Add(this->tb_Passwort); this->Controls->Add(this->tb_Name); this->Name = L"Login_Test"; this->Text = L"Login_Test"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: void btn_Anmelden_Click(Object^ sender, EventArgs^ e) { // Wenn eins oder beide Eingabefelder leer sind if (tb_Name->Text == "" || tb_Passwort->Text == "") { MessageBox::Show("Sie müssen beide Eingabefelder bearbeiten", "Meldung"); } // Wenn der Benutzername und das Kennwort richtig sind int count = befehl->ExecuteScalar(); if (count != 0) { Form^ _DB = gcnew Login_Test; _DB->Show(); } // Wenn Benutzername und Kennwort nicht übereinstimmen if (tb_Name->Text != tb_Passwort->Text) { MessageBox::Show("Ihr Benutzername und/oder Kennwort ist falsch !!!", "ACHTUNG !!!"); } } }; }
Hab jetzt noch folgenden Fehler in der If - Abfrage:
error C2440: 'Initialisierung': 'System::Object ^' kann nicht in 'int' konvertiert werden
1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
-
Dann mußt du entsprechend 'casten':
int count = (int)befehl->ExecuteScalar();
Edit: Dann kompiliert zwar dein Code, wird aber dennoch nicht funktionieren, da du innerhalb des ButtonClick-Events ja deine Verbindung schon wieder geschlossen hast (und auch der Rest dieser Methode ist unsinnig).
P.S. C++/CLI und WinForms sind eine denkbar ungünstige Kombination, s.a Windows Forms und Visual C++ MACHT KEINEN SINN!
-
Das merke ich auch immer mehr. Allerdings muss ich mit dem Programm nachher auch einen Microcontroller ansprechen können. Und für Hardware bezogene Geschichten soll sich C++ doch besser eignen oder ?
Oder besteht auch die Möglichkeit, die Benutzeroberfläche und eventuell Datenbankanbindung in C# und die Steuerung eines Microcontrollers in C/C++ zumachen und diese dann nachher miteinander zu verknüpfen ???
-
Hallo winni_07,
Ja genau so würde ich es machen, also GUI und DB-Anbindung mittels C# und die Microcontroller-Steuerung mittels C oder C++. Erzeuge dir einfach eine DLL mit C-Schnittstelle (d.h. nur native Datentypen) und von C# aus kannst du diese dann mittels [DllImport] einbinden: Platform Invoke Tutorial
-
Na das liest sich ja ganz gut. Wenn du nichts dagegen hast, meld ich mich nochmal bei dir wenn es so weit ist
Gruß
-
Du kannst auch dann gerne im C-Sharp-Forum nachfragen (da ich dort Moderator bin und häufiger lese als hier).
Oder natürlich im entsprechenden C#-Unterforum hier...