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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

2回答

1050閲覧

wordpressでのデータベース検索について(ワイルドカードのエスケープ)

claya

総合スコア11

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2018/03/25 02:35

編集2018/03/25 05:22

前提・実現したいこと

wordpressにて、mysqlからデータを取得する検索機能を作成しておりますが、「%」を入力し検索するとデータベースの全件が抽出されてしまいます。
※データベースは自作のものです。

該当のソースコード

php

1<?php 2 global $wpdb; 3//GETにて検索するキーワードを取得// 4 $search = isset($_GET['search']) ? $_GET['search'] : ""; 5 6//データベースの検索及び抽出// 7 if (empty($search)){ 8  $sql = "" ; 9 }else{ 10 $sql = $wpdb->prepare( 11 "SELECT * FROM データベース WHERE culum1 like '%%%s%%' OR culum2 like '%%%s%%'", 12 array(($search),($search))); 13 } 14 $rows = $wpdb->get_results($sql); 15 if($rows): ?> 16//検索結果をテーブルで表示// 17<table> 18 <tr> 19 <th>カラム1</th> 20 <th>カラム2</th> 21 </tr> 22<?php foreach ($rows as $row): ?> 23 <tr> 24 <td><?=($row->culum1)?></td> 25 <td><?=($row->culum2)?></td> 26 </tr> 27<?php endforeach; ?> 28</table> 29<?php endif; ?> 30

試したこと

ワイルドカードである「%s」の%が原因だと推測しておりますが、検索しても解決方法が見つかっておりません。インジェクション対策としても解決しておきたいと思っております。

初心者につき初歩的な質問とは思いますが、ご助力頂ければ幸いです。

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

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

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

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

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

kei344

2018/03/25 02:53

WordPressのどのようなデータを検索されるのでしょうか。それともWordPressと関係の無い別テーブルがあるのでしょうか。
claya

2018/03/25 02:55

情報が足りず申し訳ありません。wordpressとは関係のない、自作のデータベースから検索を行うものです。
guest

回答2

0

ベストアンサー

これは LIKE 述語において、% や _ のエスケープを行う必要があります。

ワイルドカード文字のリテラルインスタンスをテストするには、その前にエスケープ文字を指定します。ESCAPE 文字を指定しない場合は、「\」 と仮定されます。

文字列 説明
% 1 つの 「%」 文字に一致します
_ 1 つの 「_」 文字に一致します

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5.1 文字列比較関数 より引用

試しに、%の代わりに、% を指定してみて下さい。%が検索されるはずです。
それを確かめた後に、$search 中の % を % に、_ を_ に変換するロジックを追加して下さい。これは、SQLインジェクション対策としてのエスケープとは別(独立)ですので念の為。ご質問のスクリプトはプレースホルダを使っているのでSQLインジェクション対策としてはエスケープ処理は必要ありませんが、LIKE述語の%と_のエスケープは必要です。

投稿2018/04/09 12:07

ockeghem

総合スコア11701

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

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

claya

2018/04/11 12:54

ご回答いただき、ありがとうございます。 ご指摘に基づき以下の通り修正したところ、全件出力されることがなくなりました。 $sql = $wpdb->prepare( "SELECT * FROM データベース WHERE culum1 like '%s' OR culum2 like '%s'", array(('\%'.'\%'.$search.'\%'.'\%'),('\%'.'\%'.$search.'\%'.'\%'))); phpやwpdbに関する記事を探しても解決策が見つからず、放置しようと諦めかけていたところでした。ご回答いただき、誠にありがとうございました。
guest

0

検索文字列の%を事前に%% にしてみるとか。

【【WP】$wpdb->prepare内のSQL文にワイルドカード【LIKE %】を使用する場合。Wordpress : 僕の私の備忘録】
http://blog.livedoor.jp/net_scope-diary/archives/31253813.html

投稿2018/03/25 03:25

kei344

総合スコア69364

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

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

claya

2018/03/25 03:49

ご回答頂きありがとうございます。 リンク先拝見させて頂きました。$wpdb->prepareの箇所を以下で試しましたが、結果は変わりませんでした。ご指摘と違いましたでしょうか。 $sql = $wpdb->prepare( "SELECT * FROM データベース WHERE culum1 like '%%%%%s%%' OR culum2 like '%%%%%s%%'",
kei344

2018/03/25 05:03

$searchの中身の話です。
claya

2018/03/27 13:17

$searchを以下の通りとしましたが、変わらず全件抽出されてしまいます。 $search = ('%'.$search.'%'); 度々の質問となり申し訳ありませんが、上記がご指摘と異なる場合は想定されていた書き方を教えて頂けませんでしょうか。
kei344

2018/03/27 15:48

$search の中身を置換してみましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問