質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

9141閲覧

MySQLのSELECT文でシンタックスエラーが取れません

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/11/22 17:42

Javaで、MySQLを使っています。

下記のソースコードから、転記したSQL文を実行しようとすると、以下のシンタックスエラーの例外でます。
原因はなにでしょうか?

// SQL文の作成 String strSQL = "SELECT * FROM system_log" + " WHERE" + " (create_time >= '" + strStart_date + "')" + " AND (create_time <= '" + strEnd_date + "')" + " ORDER BY create_time DESC" + " LIMIT 200";

⇒ SQLException:Syntax error or access violation, message from server: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESCLIMIT 200' at line 1

ちなにに直接SQLを下記のようにして打ち込むとエラーがでなく、抽出できます。
SELECT * FROM system_log WHERE (create_time >= '2015-11-22 21:47:15') AND (create_time <= '2015-11-22 21:48:33') ORDER BY create_time DESC LIMIT 200;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2015/12/09 14:49

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答5

0

まず**String strSQL = ...**の直後にブレイクポイント置いてみてstrSQLの値を確認してみる

あと大きなお世話かもしれませんが、プレースホルダを使う等コード内に書くSQL文が簡潔で見やすいものに保つ癖を付けるようにしたほうがいいです
文字列を組み立てるコードを書いていると、とんでもない間違いが潜んでいる時があります
別のところからコピペしてたりであってると思い込んでいてなかなか気づかないことがある

気分を害されたら申し訳ありませんが、SQLインジェクションが散々セキュリティインシデントの話題に登っているのに、未だに文字列を結合してSQL文を生成しているコードを書き続けるのは意識が低い気がします
最近は「意識が高い」のがあんまり好ましくなく揶揄されますが、書くコードの品質は高く保ちたいものです

投稿2015/11/22 18:34

編集2015/11/22 18:35
dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/22 19:10 編集

ご回答ありがとうございます。 SQLインジェクションは、当社先祖代々から、ライブラリがあり、これで確認が取れた後、ちょっと手間ですが、おまじないで、目隠しをする対応予定です。当然、セカンドインジェクションや、まだ公にされていない攻撃方法4パターンへの対応も先祖代々しています。 ただ、それにするとかなり強固なSQLになる反面、ここだけで、色々なデータでの動作確認がしにくいこともあり、まず、SQL上でOKだったので、次の段階として、これでソース上で動作確認したかったのです。その作業が、低レベルとのご指摘、深く受け止め、今後は、確認作業はせずに、直接、一発で書いて、時間の節約をするようにします。ご指摘ありがとうございます。他会社では、確認やテストをしない人もいるよので(その会社は、バグだらけですが)、私も一発音盤で作るようにします。時間の節約をすることもときには、とても大切と当たり前のことをに認識しておりますので(出戻りバグ修正時間とどちらがはやいか?になりますが、私は最初からバグのないものを作りたいという気持ちでいますが、初心者で未熟なにで、ベテランの皆様のご意見に素直に従うことも時には重要と考えます。)。ただ、そうなると、皆さんに、SQL文をご提示して質問ではなく、文章のみの質問となることをお許しくださいませ(以前には、具体的に提示しないとわからない!!、質問の仕方もしらないのか?、質問すべきではないなどと、お叱りを受けました。きちんと、プロフィールに書い絵有るのを読めない人がいるようで悲しいです。)。 ところで、興味がありますのは、 1.未だに文字列を結合してSQL文を生成しているコードを書き続けるのは意識が低い気がします ⇒ 是非、どんな素晴らしい方法でければ、良いのかを知りたいので、具体的なJAVA文を書いてくださいますようお願い致します(おそらく、SQL文ではなく、一旦、JAVAの文章とする最近はやりの方法と考えておりますが、違う可能性もありますので、是非ご提示いただけると勉強になります)。ここをご覧になっている皆様のためにも、ご参考になると考えますので。 お手数ですが、もっともっと、勉強したいとかんげがえておりますので、お願い致します。 2、最近は「意識が高い」のがあんまり好ましくなく揶揄されますが、書くコードの品質は高く保ちたいものです ⇒「「意識が高い」のがあんまり好ましくなく揶揄」を言う方は、初心者の私よりもさらに初心者か、視野や心の狭い方だと考えますし、何をしても、反対派や否定はは必ずいますので、無視するのが宜しいかと。 初心者ですが、技術者は、最善のものを突き詰め、最良の物を作るよう日頃から指示をうけております。 尚、Javaなのに、strSQLとプレシックスを付けているのは、JAVAの道からはずれるとご規定を何度も他のサイトでうけておりますが、そん半面、一番大切なのは、品質。と、ただ、品質を考慮し、可読性のよく、後任者にも、パッとみて、一つも誤解が無く理解できるもの、ということで、常識はずれでお叱りを受けつつも、プリフィックスや、その他、実施しています。品質とは、できたものが100%動けばベストではなく、さらに、将来を考慮したものにすることで、120%の未来分の+20%が上乗せされると、ご指示を頂いた方の影響です。
dojikko

2015/11/22 19:29

プロフィールを見て回答していませんでした あと興味があるのは「SQLのエラーを解決すること」だと思っていました 失礼しました
guest

0

ベストアンサー

みなさまご回答をありがとうございます。
結構色々試してみは、放置し、
また試してみは、放置し、
をくりかえしましたが、何百もの同様なのSQL文を半年で作っておりますが、
ここの一か所だけが、このエラーになります。
このSQLの関数(メソッド)を丸ごとコピーしたりしても、同じSQLエラーがでます。
そこで、直打ちテストで、SQLの結果がOKでしたので、当社の5重以上のSQLセキュリティーライブリーに埋め込んだところ、正常に動きました。
ということで、原因は不明なので、気持ちが悪いです。

ですが、色々アイデアを出していただいた皆様には、
大変お手数をおかけし、ありがとうございました。

投稿2015/12/07 09:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/08 21:13 編集

。。。
guest

0

strSQLをどこかに表示してそれを実行してみたらどうなりますか?

投稿2015/11/22 19:36

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/22 19:54

ご回答ありがとうごあいます。 早速やってみます。その時の、strSQLの中身もここへ貼り付け致します。 ご提案ありがとうぎざいます。
退会済みユーザー

退会済みユーザー

2015/11/22 20:11

結果のご報告です。 中身はこれです⇒ SELECT * FROM system_log WHERE (create_time >= '2015-11-23 22:00:00') AND (create_time <= '2016-12-31 23:59:59') ORDER BY create_time DESC LIMIT 200 1.ローカルPC上での動作では、シンタックスエラーがでない。 2.サーバ上にJAVAファイルをテキストモードでコピーし、日付が最新を確認。 3.サーバーのhttpdを例スタート。 4.サーバー上記、このSQLを呼ぶとシンタックスエラー。 5.ざんんんですが、サーバー上でのstrSQLの値は見れていいませんので、例外をだして、強制的に、strSQLの中を見てみます。
退会済みユーザー

退会済みユーザー

2015/11/22 22:29

上の手順2と3の間でJavaソースファイルのコンパイルはしていないのでしょうか? もしコンパイルしていないのでしたら、サーバ上に残っている古いclassファイルが実行されているでしょう。 古いソースプログラムでは、すでに指摘されているように「'DESCLIMIT 200' 」という部分にDESCとLIMITの間にスペースが抜けていたのではないでしょうか?
guest

0

エラーでDESCとLIMITがついて表示されているのでスペースがおかしいのかもです。
'DESCLIMIT 200'

何れにしても、シンタックスエラーと言っているのでSQLが間違っているってことです。
デバッグして実際に実行しているSQLを取得して確認したほうがいいと思います。

投稿2015/11/22 18:01

matsumoto

総合スコア590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/22 18:26

ご回答ありがとうございます。 下記にかいりますように、直にSQL文にすると、正常に抽出されます。
guest

0

DESCとLIMITがくっついていると判定されているからでは?
後ろにも半角スペースを空けてみるとかORDER~200まで1行にまとめてみるとか

投稿2015/11/22 17:45

yuki84web

総合スコア1857

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/22 18:28

ご回答ありがとうございます。 >後ろにも半角スペースを空けてみるとかORDER~200まで1行にまとめてみるとか 両方とも実施済みですが、同じくエラーとなります。 今まで、このようなコーティングは数をこないしているので、 不思議で、且、対策がわからなくて困っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問