- ベストアンサー
得た変数に対応する値をMySQLから取得する際のコマンド
こんにちは。 +-----------+------------+ | 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++のソースを書いていました。 アドバイスいただけますとありがたいです。 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もう解決しているかもしれませんが。 そんなに難しく考える事はないよ。 見た感じ、 「key_sports」までは問題ないと思われるので、 変数を記述しているkeyの型とかがあってないんじゃないのかい? 「%s」だったり、「c_str()」あたりを 変数の記述の部分であてがってみたりしてはどうだろうか。 @とかはいらないな。 たぶんゴール近いよ。
その他の回答 (2)
- zwi
- ベストアンサー率56% (730/1282)
まず、mysql_query()の戻り値を0以外かチェックしてエラー判定してください。それでエラー内容がmysql_error()で得られます。 それと sprintf(kuni_get2, "select val_sports from test007 where key_sports = @key") は意味が分りません。 MySQLのプロじゃないので知らないだけかもしれませんが、@keyってMySQLで置き換えてくれるんでしたっけ?少なくともsprintfでは置き換えてくれません。
- zwi
- ベストアンサー率56% (730/1282)
もしエラーなら、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つが 選択されている感じです。 補足になっていると幸いです。 宜しくお願い致します。
お礼
どんぴしゃでした! 「c_str()」を使用して、C出力に型を変えてみましたら、 改善されました! 優しく教えていただき、ありがとうございました! とても、助かりましたです。