Zmienna w odpytywaniu bazy.

0

Witam, piszę program, w którym dzięki komunikacji z bazą danych pobieram z niej pewne informacje. Mój problem jest następujący: w bazie znajduje się lista studentów, chcę aby po wprowadzeniu imienia studenta z klawiatury zapytanie SQL przyjęło zmienną (w której zapisuję imię wprowadzone z klawiatury) jako jeden z parametrów.

Poniżej fragment kodu:
Pobieram z klawiatury imię:

string imie;
cin >> imie;

Pobieram dane z bazy danych:

mysql_query(con, "SELECT s.* FROM student s, przedmioty p, student_przedmioty sp WHERE s.imie=imie");

Jak łatwo się domyślić fragment zapytania "s.imie=imie" nie działa poprawnie. Proszę o pomoc w jaki sposób należałoby coś takiego zrobić.

1

Na logikę - musisz jakoś tę zmienną tam wpleść do tego ciągu przecież, bo MySQL nie ma pojęcia o istnieniu jakichś Twoich zmiennych lokalnych czy globalnych.

Możesz zatem wykorzystać sprintf bądź stringstream*:

mysql_query(con, "SELECT s.* FROM student s, przedmioty p, student_przedmioty sp WHERE s.imie=\"" + imie + "\"");

Przy czym ja tam wolę sprintfy :P

Ew. jakieś wykorzystaj bindowanie, jeśli Twój interfejs to obsługuje.

* oczywiście kod który napisałem jest podany na sql injection, kombinuj dalej sam.

0
Patryk27 napisał(a):

Na logikę - musisz jakoś tę zmienną tam wpleść do tego ciągu przecież, bo MySQL nie ma pojęcia o istnieniu jakichś Twoich zmiennych lokalnych czy globalnych.

Możesz zatem wykorzystać sprintf bądź stringstream*:

mysql_query(con, "SELECT s.* FROM student s, przedmioty p, student_przedmioty sp WHERE s.imie=\"" + imie + "\"");

Przy czym ja tam wolę sprintfy :P

Ew. jakieś wykorzystaj bindowanie, jeśli Twój interfejs to obsługuje.

* oczywiście kod który napisałem jest podany na sql injection, kombinuj dalej sam.

Zastosowałem teraz coś takiego:

mysql_query(con, ("SELECT s.id FROM student s WHERE s.imie=" + imie).c_str());

, ale chyba nadal to nie jest poprawne rozwiązanie, ponieważ kolejnymi linijkami mojego kodu są:

result = mysql_store_result(con);
num_fields = mysql_num_fields(result);

i w tej drugiej program się sypie (błąd związany z pamięcią). Dodam, że jeśli sam z palca piszę całe zapytanie SQL to mechanizm działa prawidłowo.
Proszę o dalsze sugestie odnośnie linijki, w której zapisuję zapytanie do bazy.

0

Ale zdajesz sobie sprawę, że nie bez powodu moje zapytanie zawiera w środku cudzysłowy, tak?

0
Patryk27 napisał(a):

Ale zdajesz sobie sprawę, że nie bez powodu moje zapytanie zawiera w środku cudzysłowy, tak?

W zasadzie tak, tylko nie wiem co to w praktyce oznacza.

0
SELECT * FROM users u WHERE u.nick = patryk
SELECT * FROM users u WHERE u.nick = "patryk"

Nie rozumiesz różnicy między tymi dwoma zapytaniami?

0
Patryk27 napisał(a):
SELECT * FROM users u WHERE u.nick = patryk
SELECT * FROM users u WHERE u.nick = "patryk"

Nie rozumiesz różnicy między tymi dwoma zapytaniami?

Rozumiem. Ale jeżeli po dołączeniu zmiennej stosuję .c_str() to nie załatwia to sprawy?

0

Mam taką małą radę na przyszłość. Jak nie jesteś pewny w czym dokładnie tkwi błąd to wypisz na ekran sklejone zapytanie sql'owe. Wtedy zobaczysz o wiele szybciej co jest nie tak.

A do co tego czy .c_str() załatwia sprawę, to nie. Przeczytaj w dokumentacji o tej metodzie, zrozum to i będziesz wiedział co robi :) Bo teraz krążysz po omacku, a nie mam pojęcia dlaczego taka funkcja magicznie ma Ci wstawić cudzysłów tam gdzie jest wymagany.

0

Ale jeżeli po dołączeniu zmiennej stosuję .c_str() to nie załatwia to sprawy?

Nie wiesz do czego służy c_str, prawda? :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1