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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

SQL

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

PHP

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

Q&A

4回答

362閲覧

PHP部分検索教えてください

Y.okubo

総合スコア12

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

SQL

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

PHP

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

0グッド

1クリップ

投稿2018/10/23 14:31

###完全一致でなく当該単語を含む検索が可能なようにしたいです

素人質問で申し訳ありません。
作ってもらったサイトを自分で手直ししているのですが、PHPの知識もなく壁にぶち当たってしまいました。
完全一致での検索表示はできるようになったのですが、部分一致や単語をスペースで複数個入力しての検索表示の仕方がどうしてもわかりません。
以下当該要件の箇所と思われるところです。

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

エラーメッセージ

$word = $_REQUEST["word"];

if ($word) {
$db->search[] = array("field" => "works.title", "value" => $word);
$ap->set("word", $word);
}

ソースコード

試したこと

{}の中に以下を挿入したりしてみましたが変わりませんでした。
$sql = "SELECT * FROM works WHERE title LIKE '%$word%'";

よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2018/10/23 14:34

ごめんなさい。コードが掻い摘みすぎて意味が分かりません。環境情報も合わせて(DBの定義なども)なるべく全体的な流れがわかるようなもの、全くの他人が再現確認可能な情報にしていただけますか?また、コードはマークダウンのcode機能を利用してください。
m.ts10806

2018/10/23 14:36

また「作ってもらったサイト」は勝手に手直ししても良いのでしょうか。もちろん自己責任において対応されているのかと思いますが、作ってもらった人に依頼した方が確実なのでは?見たところ独自に作られた仕組みに見受けられないこともない(フレームワーク使ってるかもしれませんが、これだけではわからない)ので、もし独自な仕組みであれば全くの他人には手が出しづらい領域です。その独自の仕組みで対応しなければ何が起きるかわかりませんし。ここはやはり作った人にやってもらうのが確実です。
Y.okubo

2018/10/23 14:47

全て不慣れで申し訳ありません。追加で制作をお願いする資金がなかったため自分で手直ししておりました。データベースは「works」というデーブルの「title」という項目からの検索をしたいと思っています。今の所これで完全一致の検索では表示されるよになっています。何かを追加すればできそうに感じたのですが、、、うまくお伝えできず申し訳ありません。
m.ts10806

2018/10/23 14:51

元々資金かけてできているのでしたら尚更ですね。全くの他人が無責任に(ちょっと汚い言い方ですが、無償で)手を出すには難しい領域です。
Y.okubo

2018/10/23 14:53

わかりました。すみませんでした。ありがとうございます。
guest

回答4

0

$db インスタンスを作り出している class を読み、LIKE 検索用のメソッドがあれば利用、なければ拡張するのが一般的です。
文字連結で対応するのはセキュリティ上絶対にやってはいけない対応です。

コピペでなんとかするスタイルでは対応できないので、キチンと理解のある方に依頼してください。

投稿2018/10/23 22:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Y.okubo

2018/10/24 02:15

わかりました。ありがとうございます!
guest

0

SQLインジェクションの危険性もありますし、phpの学習も必要になってくると思うので、作ってもらった人に対応してもらうか新たにちゃんとした人に作ってもらったりすることも視野に入れたほうがいいでしょうね。

投稿2018/10/23 23:06

ponokaPG

総合スコア48

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

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

Y.okubo

2018/10/24 02:14

わかりました。ありがとうございました!
guest

0

$sql = "SELECT * FROM works WHERE title LIKE '%$word%'";
これの$word変数の中に直接%を両サイドに文字列として含めみてください。

投稿2018/10/23 14:45

ponokaPG

総合スコア48

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

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

Y.okubo

2018/10/23 15:04

ご回答ありがとうございます!$str='%'.$word.'%';と$sql = "SELECT * FROM works WHERE title LIKE ".$str;を{}に挿入してみましたが変わりませんでした。素人で申し訳ありません!これであっていますでしょうか
ponokaPG

2018/10/23 22:46

問題解決するにはもうちょっと使ってるFW(フレームワーク)等の名前やバージョンを追加してみてはどうでしょうか。後、純粋にphpに書くならスペース区切りの複数検索はexplodeという関数を使えば、スペース区切りで配列の中に単語が入っていきます。それをsql文を作る部分でforeachを使い文を結合していく感じで検索すればいいとおもいます。 foreach($word_list as $value) { $str='%'.$value.'%'; $sql .= " AND search LIKE ".$str; } (以下実行部分) 実行部分はフレームワーク差あり フレームワーク等の仕様に従い真似できればお使いください。フレームワークが分かり次第色々また助言できるかもしれません。助けになれないかもしれないのでその時はすみません。
退会済みユーザー

退会済みユーザー

2018/10/24 03:22 編集

なんらかクエリをビルドする物を使っているので、生 SQL 文をいくら書いても意味ないです。 で、その前提ではあるものの、そもそも提示のコードもおかしいので、以下を実験してみてください。 「検索文字列として'100%'が正しく検索できるか?」 エスケープの概念を学習すると、上記が検索できる SQL 文が発行できるようになります。
Y.okubo

2018/10/24 03:05

ありがとうございます!急にやることになってしまい勉強不足でした。皆様にご指摘いただいている意味もよく理解できていないのでご意見を参考に勉強してみます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/10/24 08:02

先のコメントは、ponokaPG さんに宛てたものです。 混乱させて申し訳ない。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71 この辺の記事を参考に学習すると良いです。 今回の指摘の回答も中に含まれています。
Y.okubo

2018/10/24 09:34

ありがとうございます!読んで勉強したいと思います。
Y.okubo

2018/10/24 10:25

結局フレームワークではなくsmartyというテンプレートエンジンを使っているとのことでした!
ponokaPG

2018/10/24 11:20

勉強なります。
Y.okubo

2018/10/25 03:51

しつこくすみません!adminをいじっていて思ったのですが、管理画面上ではニックネームやメールアドレスなどの部分検索ができるため、adminのPHPページをみてみたのですがこのような箇所がありました↓ "search" => array( // 検索条件 /* "name" => array( "title" => "名前", "type" => "text", "cond" => "like", "placeholder" => "部分一致で検索します", ), ○質問で載せたコードも他の項目からのコピペでいじったもので、当初 "cond" => "in",というものが入っていました。なので"cond" => "like",に変えて挿入したのですがやはり変わりませんでした。 何かこれで思いつくことございましたらお願い致します。何度も申し訳ありません。
退会済みユーザー

退会済みユーザー

2018/10/25 05:20

「$db インスタンスを作り出している class を読み、LIKE 検索用のメソッドがあれば利用、なければ拡張するのが一般的です。 文字連結で対応するのはセキュリティ上絶対にやってはいけない対応です。 コピペでなんとかするスタイルでは対応できないので、キチンと理解のある方に依頼してください。 」
guest

0

具体的にすると

$str='%'.$word.'%';
といった具合に整形してください。
それを
$sql = "SELECT * FROM works WHERE title LIKE ".$str;
という感じで

投稿2018/10/23 14:48

編集2018/10/23 14:50
ponokaPG

総合スコア48

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

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

m.ts10806

2018/10/23 14:55

独自で作られたっぽい仕組みに入れ込まなきゃいけない可能性が高いので、SQLだけでは解決しないと思います。たぶん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問