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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1530閲覧

PHP内でlikeを使ったSQLで変数を利用する

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/07/29 00:16

実現したいこと

PHP内でlikeを使ったSQLで変数を利用する

発生している問題・エラーメッセージ

シングルクォーテーションの場所が分からない。今のままだとSQLエラーになる

該当のソースコード

$sql = ""; $sql .= " SELECT "; $sql .= " KANRINO,"; $sql .=" KANRINO_OYA,"; $sql .=" IPADDRESS,"; $sql .= " keiti.KEITAINM AS KEITAINM,"; $sql .=" YOUTO,"; $sql .=" tant.TANTNM AS TANTNM,"; $sql .=" MAKER,"; $sql .=" OS,"; $sql .=" CPUNM,"; $sql .=" DOMEIN,"; $sql .=" CPU,"; $sql .=" KOASU,"; $sql .=" MEMORI,"; $sql .=" DESK1,"; $sql .=" DESK2,"; $sql .=" DESK3,"; $sql .=" DESK4,"; $sql .=" DESK5,"; $sql .=" OSLICENCE,"; $sql .=" OFFICE,"; $sql .=" CASE WHEN KONYUYM IS NULL THEN '-' ELSE SUBSTR(TO_CHAR(KONYUYM,'000000'),1,5) || '/' || SUBSTR(TO_CHAR(KONYUYM,'000000'),6,2) END KONYUYM, "; $sql .=" CASE WHEN HAIKIYM IS NULL THEN '-' ELSE SUBSTR(TO_CHAR(HAIKIYM,'000000'),1,5) || '/' || SUBSTR(TO_CHAR(HAIKIYM,'000000'),6,2) END HAIKIYM, "; $sql .=" BIKO"; $sql .= " FROM "; $sql .= " public.M_TANMATU tanm "; $sql .= " LEFT JOIN "; $sql .= " public.M_TANT tant "; $sql .= " ON "; $sql .= " tanm.tantcd = tant.tantcd "; $sql .= " LEFT JOIN "; $sql .= " public.M_KEITAI keiti "; $sql .= " ON "; $sql .= " tanm.keitaikb = keiti.keitaikb "; $sql .= " WHERE "; $sql .= " KANRINO Like %".$W_KENSAKU."% " ;→この部分です。

※SQLについて聞きたいのでッ前後の処理は省きます
$W_KENSAKUは’あああ’が入っているとします。今のままだと%あああ%でシングルクォーテーションがないため、エラーになります。シングルクォーテーションをいれるとW_KENSAKUという固定値になります・

試したこと

KANRINO Like %""'".$W_KENSAKU."'""% " ;

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

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

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

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

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

yambejp

2022/07/29 00:27

SQLの種類は? 変数をSQLに組み込む場合prepare処理を行いますが 本件ではPDOは使用しないのでしょうか?
m.ts10806

2022/07/29 04:23

受付中のまま放置するのはマナー違反です。 https://teratail.com/help 最低限のマナー守れない人は使ってはいけません。
guest

回答3

0

ベストアンサー

エラーを解消するだけであれば、末尾の行を以下のように変更すれば実行はできると思います。

$sql .= " KANRINO Like '%".$W_KENSAKU."%' " ; // LIKE述語の後の文字列をシングルクォートで 囲む

引用された箇所の外で対応しているのかもしれませんが、以下が必要になることは一応申し上げたいと思います。

  • SQLインジェクション対策(他の方の回答では言及されています)
  • ワイルドカード文字のエスケープ(これがないと _ や % を含む文字列を正しく検索できません)

投稿2022/07/29 03:21

ockeghem

総合スコア11701

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

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

退会済みユーザー

退会済みユーザー

2022/07/29 04:31

ありがとうございます。できました!!
guest

0

仮にMySQLだとして

SQL

1KANRINO Like concat('%',?,'%')

ですが%%をlikeするくらいならregexpで良いでしょう

SQL

1KANRINO regexp ?

投稿2022/07/29 00:48

yambejp

総合スコア114814

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

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

退会済みユーザー

退会済みユーザー

2022/07/29 00:51

postgresです。あと、W_KENSAKUにはテキストボックスで入力した値が入ってくるので利用する前提です。
yambejp

2022/07/29 00:57 編集

postgresだと文字列結合が「||」でしたっけ? KANRINO Like '%'||?||'%' 正規表現だとこうですかね KANRINO ~ ?
退会済みユーザー

退会済みユーザー

2022/07/29 01:06 編集

> postgresです 質問文を編集して追加情報として追記してください。其れは質問するうえで絶対に提供すべき非常に重要な情報だと認識してますか? 
guest

0

マニュアルを読みましょう。
https://dev.mysql.com/doc/refman/5.6/ja/pattern-matching.html
'%検索語句%'

PHPからいきなり実行するのではなく、
データベースに対してコマンドなど直に実行して想定の結果を得られるSQLを作れてから
PHPから実行してください。
PHPが実行してるわけではなく、PHPはSQL文字列を接続先DBに送って実行結果を受け取っているだけなので、「実行」自体は接続先DBで行われるものだからです。

あと、値部分にそのまま文字列を突っ込むとSQLインジェクションの脆弱性があるので、
プリペアドステートメントで、パラメータからバインドしてください。
PHPでデータベースに接続するときのまとめ
の["SELECT * FROM users WHERE id = '$id'" のように変数展開を使ってSQL文を組み立てている]参照。

投稿2022/07/29 00:28

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2022/07/29 00:45

質問内容が伝わってないみたいですね。 Like関数について聞きたいだけです。PHPからいきなり実行に関してはわかってます。その辺は省略しているだけでやってます。今回は関係ないので。SQLを聞きたいだけ
m.ts10806

2022/07/29 01:42

書いてないことを赤の他人が知ることはできませんし、ふてくされられるほどの質問内容になってるとは思えませんが、最初の2行で満たされてるので、そちらを参考に。
m.ts10806

2022/07/29 01:43

MySQLでもPostgreSQLでも同じ。 PHPからはSQLとして成り立つ文字列を作ればいいだけのことで、それが変数になろうと展開された文字列が渡されてるので関係ありません。
m.ts10806

2022/07/29 01:52 編集

>その辺は省略しているだけでやってます そのわりに作られてるのは直実行しても動かないSQLを作られてるようです。 やってなさそうだから指摘されてるだけのことです。 指摘されるのは嫌かもしれませんが、そこで面倒がったり反抗心だしても何も解決しないので、真摯な対応をお願いしますね。 あくまで赤の他人の厚意で成り立っている質問サイトなので、エスパーや家庭教師を依頼する場所ではないです。 例えプログラミングの件でなくても同じようなスタンスでネット上のやり取りでまともに解決できることは多くはないと思います。 指摘されたくなかったり説教されたくなければ、指摘には真摯に対応し、自身の情報を全て出せるだけ出すしかありません。 面倒でもそのほうが早く解決します。
退会済みユーザー

退会済みユーザー

2022/07/29 04:00

すいません。自力で解決しました
退会済みユーザー

退会済みユーザー

2022/07/29 04:00

説教って自覚してて草
m.ts10806

2022/07/29 04:21 編集

自覚してるから出したわけじゃないですが、あなたの頭では都合のいいようにしか変換されないようですね。 あなたと同種の人たちが第三者が見てもまっとうな「指摘」を「説教」と称するので倣っただけです。 そういう人たちと同種である自覚ないんですか・・・。 いずれにしても煽りたいだけなら他所でどうぞ。 本当に自力でないことは火を見るより明らかです。「回答を参考に」が抜けていますよ。 基礎の基礎が理解できてれば質問する必要がない内容ばかりですから。 「まとも」になりたければ基礎の基礎が足りてないことを自覚するところから始めましょう。 「SE辞める」とか言ってましたっけ。それならむしろ「目指す」ような人たちが使うような場所は全力で避けた方が良いでしょう。 あなたには相応しくありません。例え私が指摘しなくても他の人が同じような指摘をするだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問