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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

3回答

6194閲覧

[Node.js][MySQL]connection.queryでの第二引数代入時にシングルクォーテーションが付く

cheese8533

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2020/05/06 00:51

前提・実現したいこと

######前提
Node.js + MySQLでconnection.query(?を含むsql文,[],(error,results))を用いてクエリを実行したい。
しかし、?に代入する値がシングルクォーテーションで囲まれるためか、想定しているsql文でクエリを実行できない。

実現したいこと

connection.query(?を含むsql文,[],(error,results))を用いてクエリを実行したい。

######ご教示頂きたいこと

  • connection.query(?を含むsql文,[],(error,results))の第2引数代入の際に、シングルクォーテーションで囲まれる原因と解決方法。
  • 想定通りのクエリが実行できない原因が代入の際のシングルクォーテーションでない場合、問題の発生原因と解決方法。
環境

OS Windows10
Node.js v12.16.3
mySQL Ver 8.0.20 for Win64 on x86_64

ソースコード

js

1app.post('/foodsearch',(req,res)=>{ 2 const sql = 'SELECT food_name FROM foods WHERE food_name like "%?%"'; 3 const query = connection.query(sql,[req.body.SearchFood],(error,results) => { 4 console.log(req.body.SearchFood); 5 console.log(query.sql); 6 res.render('searchResult.ejs',{foods: results, word: req.body.SearchFood}) 7 }); 8});

試したこと

req.body.SearchFood値及び、sql文の確認

上記のコードを用い、formに「パウチ」と入力した際の各値を確認。
1行目のreq.body.SearchFood値に問題は無いが、2行目のsql文の代入した文字列の前後にシングルクォーテーションが存在している。

console

1パウチ 2SELECT food_name FROM foods WHERE food_name like "%'パウチ'%"
sql文のシングルクォーテーションの除去

以下の様にシングルクォーテーションを除去することで、想定通りのクエリが実行できることを確認しております。
しかしこの様な動かし方は限界があると思いますので、解決方法をご教示頂きたいと考えております。

js

1app.post('/foodsearch',(req,res)=>{ 2 const word = '"%' + req.body.SearchFood + '%"' 3 let sql = 'SELECT food_name FROM foods WHERE food_name like '+ word; 4 sql = sql.replace(/'/g, ''); // 検索文字のシングルクォーテーション除去 5 const query = connection.query(sql,(error,results) => { 6 res.render('searchResult.ejs',{foods: results, word: req.body.SearchFood}) 7 }); 8});

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

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

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

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

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

guest

回答3

0

ベストアンサー

?は1つのと対応するものですので、"%?%"のようにして文字列の一部だけ代入することはできません。

やり方としては、%を含む文字列を事前に生成して、それ全体を?に割り当てる、というのが適切です。特に、LIKEの一部にするような場合、LIKEで使う特殊文字のエスケープも必要ですので、呼び出し側での処理は欠かせません。

投稿2020/05/06 01:01

編集2020/05/06 01:02
maisumakun

総合スコア146018

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

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

cheese8533

2020/05/06 04:16

回答いただきありがとうございました。 ?は1つの値と対応する、ということを理解出来ていませんでした。 基礎を学んだ際には(?)の様な使い方が出来ていたので、深く考えずに今回も適応出来るものだと認識しておりました。 問題につきましてはご教示いただいた、文字列を事前に生成して第2引数に用いる手法を用いることで解決できました。 ご教示頂き本当にありがとうございました。
guest

0

maisumakun様の回答を参考に、以下の様に修正することで解決致しました。

js

1app.post('/foodsearch',(req,res)=>{ 2 const sql = 'SELECT food_name FROM foods WHERE food_name like ? '; 3 const word = '%' + req.body.SearchFood + '%' //?用文字列生成 4 const query = connection.query(sql,[word],(error,results) => { 5 console.log(req.body.SearchFood); 6 console.log(word); 7 console.log(query.sql); 8 res.render('searchResult.ejs',{foods: results, word: req.body.SearchFood}) 9 }); 10});

確認用

console

1パウチ 2%パウチ% 3SELECT food_name FROM foods WHERE food_name like '%パウチ%'

投稿2020/05/06 04:25

cheese8533

総合スコア1

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

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

0

const sql = 'SELECT food_name FROM foods WHERE food_name like "%?%"'; ↓ const sql = "SELECT food_name FROM foods WHERE food_name like '%?%'";

にしたらどうなりますか?

投稿2020/05/06 02:19

Orlofsky

総合スコア16417

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

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

cheese8533

2020/05/06 04:17

回答いただきありがとうございます。 変更してみましたが、下記のエラーが発生し解決できませんでした。 \node_modules\mysql\lib\protocol\Parser.js:437 throw err; // Rethrow non-MySQL errors
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問