プロが教えるわが家の防犯対策術!

こんにちは。

+-----------+------------+
| key_sports......| val_sports..........|
+-----------+------------+
| baseball............| America...........|
+-----------+------------+
| football.............| England.............|
+-----------+------------+
| sumou...............| Japan................|
+-----------+------------+


上記内容を例にして、
質問させていただきます。

C++のプログラム内に
MySQLから値を取得する意図を満たすソースを挿入しました。

プラグラム動作中に得る変数「key」から得る値を、

MySQLの「key_sports」の列の値とし、
「key」で指定した「key_sports」の値に対応する
「val_sports」の値を取得したいと思っています。

上記例では、
たまたまプログラム内から得たkeyが「baseball」だったとすると、
MySQLより「America」という値を取得したい感じです。

その際に必要となるコマンドというのは、
どのようになるものでしょうか?

最初、コマンドが以下内容かと思いましたが、
どうも適切に値が取得できていませんでした。
どう直せばいいでしょうか?

select val_sports from test007 where key_sports = @key
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

※table名:test007

CentOS内でC++のソースを書いていました。
アドバイスいただけますとありがたいです。
宜しくお願い致します。

A 回答 (3件)

もう解決しているかもしれませんが。



そんなに難しく考える事はないよ。
見た感じ、
「key_sports」までは問題ないと思われるので、
変数を記述しているkeyの型とかがあってないんじゃないのかい?
「%s」だったり、「c_str()」あたりを
変数の記述の部分であてがってみたりしてはどうだろうか。
@とかはいらないな。
たぶんゴール近いよ。
    • good
    • 0
この回答へのお礼

どんぴしゃでした!
「c_str()」を使用して、C出力に型を変えてみましたら、
改善されました!

優しく教えていただき、ありがとうございました!
とても、助かりましたです。

お礼日時:2009/04/23 17:18

まず、mysql_query()の戻り値を0以外かチェックしてエラー判定してください。

それでエラー内容がmysql_error()で得られます。

それと
sprintf(kuni_get2, "select val_sports from test007 where key_sports = @key")
は意味が分りません。
MySQLのプロじゃないので知らないだけかもしれませんが、@keyってMySQLで置き換えてくれるんでしたっけ?少なくともsprintfでは置き換えてくれません。
    • good
    • 0

もしエラーなら、MySQLからエラーメッセージが返ってきているはずですが?そのエラーメッセージに内容を教えてください。



key_sportsが文字列型だと、
select val_sports from test007 where key_sports = 'baseball'
じゃないとダメだと思うんですが。

この回答への補足

補足になれているか不安ですが、
エラーとしては、
プログラムを動作中に
「セグメンテーションエラー」と表示されて、
sqlのあたりで止まってしまう感じです。

MySQLにとりにいくあたりは、
下記にあるようなそーすになっていますが、
printfでエラーの場所を探していたら、
=================================
##(1)
##(4)
セグメンテーション違反です
=================================

と言う風になって終了していたので、
sqlコマンドが間違っているのだろうなと思い、
コマンド文の確認をさせていただきたくなった次第です。

=================================
char kuni_get2[256];
if(sprintf(kuni_get2, "select val_sports from test007 where key_sports = @key"));
mysql_query(conn, kuni_get2);
res = mysql_use_result(conn); //get the results

printf("## (1)\n");
while ((row = mysql_fetch_row(res)) != NULL){
printf("## (2)\n");
std::stringstream kstream ;
printf("## (3)\n");
kstream << row[0] ;
}

printf("## (4) \n");
=================================

試しに、「@key」としている部分を、
例えば、「'basebasll'」などとすると、
何もエラーなど発生せずに、
「America」を取得して、
プログラムが終了できるのを確認できています。

しかし、selectの際にwhereで指定している部分は、
実際には、
毎回任意に変化する変数keyを指定したいつもりでして、
「basebasll」や「sumou」などと直接に英数字を指定してしまうのは、
少し意図と異なってしまいますです。
変数をwhereの条件部で指定したい感じです。
それって不可能でしょうか?

key_sportsは確かに文字列型です。
table作成時「CHAR(256)」を指定して作成しています。
また、変数keyもcharで宣言が済まされている変数になり、
プログラムの動作に応じて、
baseball、footbasll、sumouの3つのどれか1つが
選択されている感じです。

補足になっていると幸いです。
宜しくお願い致します。

補足日時:2009/04/22 15:53
    • good
    • 0
この回答へのお礼

色々と勉強できる機会となりました!
アドバイスいただきまして、
ありがとうございました!

お礼日時:2009/04/23 17:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!