• 解決済 Duong_phu

    (@duong_phu)


    サイト検索時に、シングルクォーテーション(’)を含んだ文字列で検索すると以下のようなエラーが表示されてしまいます。以下は「h’s」というワードで検索した時の表示です。

    <strong>WordPress database error</strong>: [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 's%') OR (wp_posts.post_content LIKE '%h's%'))) OR ((m.meta_value LIKE '%h\'s%'))' at line 1]
    SELECT DISTINCT wp_posts.* FROM wp_posts LEFT JOIN wp_comments AS cmt ON ( cmt.comment_post_ID = wp_posts.ID ) LEFT JOIN wp_postmeta AS m ON (wp_posts.ID = m.post_id) LEFT JOIN wp_users AS u ON (wp_posts.post_author = u.ID) WHERE 1=1 AND ( ( wp_posts.ID NOT IN (364,354,360,358,350,352,356,362,1955,2192,2207,2201,2202,2203,2204,2205,2206,2068,2116,2087,2086,2088,2091,2083,2090,2089,2080,2082,2081,2084,2085,2054,2013,2171,2159,2155,2156,2158,2160,2157,2154,1843,1871,1882,1879,1995,1872,3450,3815,4316) AND (((((wp_posts.post_title LIKE '%h's%') OR (wp_posts.post_content LIKE '%h's%'))) OR ((m.meta_value LIKE '%h\'s%')) OR (((cmt.comment_content LIKE '%h\'s%')) OR ((cmt.comment_author LIKE '%h\'s%'))) OR ((u.display_name LIKE '%h\'s%')) )) AND wp_posts.post_type IN ('post', 'page', 'attachment', 'xxxxx', 'xxxxx', 'xxxxx', 'xxxxx', 'xxxxx', 'xxxxx') AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'closed' OR wp_posts.post_author = 4 AND wp_posts.post_status = 'private' OR wp_posts.post_author = 4 AND wp_posts.post_status = 'hidden')) AND post_type != 'revision') AND post_status != 'future' ORDER BY wp_posts.post_date DESC

    ( xxxxx はカスタム投稿タイプ名です)

    ・「h’s」のようにスペースを空けずにシングルクォーテーションを挟んだ場合にエラー
    ・検索ワードが「h’」や「’s」、「h ‘ s」や「’」ではエラーの表示なし

    WordPressのバージョン: 3.5.1
    サーバーの種類: Linux
    PHPのバージョン: 5.3.3
    MySQLのバージョン: MySQL 5.0.x

    ネットで調べてみたのですが、同じような症状を解決したとの情報にはたどりつけませんでした。
    プラグインもひとつひとつ停止してみましたが症状は改善しませんでした。
    $_GET[‘s’]の処理に問題があるのかと思い、htmlspecialchars($_GET[“s”]) や mysql_real_escape_string($_GET[‘s’])を試してみたのですが、同様のエラーが出ます。

    テーマはゼロから作成した自作テーマを使用しています。
    テーマをtwentyelevenなどに切り替えるとエラーは表示されないので、おそらく自作テーマに問題があるのではと思います。
    サイト内検索の構造としては、複数のコンテンツごとに検索フォームを設置して、Wordpressのデフォルトのテーブルとは別にテーブルをMysql内に作成し、検索フォームごとに検索対象となるテーブルを振り分けています。その振り分けは、search.php内でフォームから受け取る値によって条件分岐させ、対応するテンプレートを呼び出しています。それらのテンプレート内でSQL文を発行し、データを取り出してくる、という形です。
    通常の投稿や固定ページの検索用のテンプレートでは、ごく普通にWordpressループを使用しているのみでSQL文の発行はしていません。が、通常の投稿や固定ページの検索時も、自作テーブルへの検索時も、同様のエラーが出ます。

    解決方法がわからず困っています。
    よろしくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • SQL文でのシングルコーテーションは構文上意味を持っています。
    なので、そのまま文字列のような扱いにするなら、エスケープする必要があります。

    その辺は考慮されてテンプレートに記述していますか?

    トピック投稿者 Duong_phu

    (@duong_phu)

    ありがとうございます。

    search.php の振り分け前にエスケープのためのコードを記述していたのですがうまくいかず、function.php に init のフックとして以下のように記述すると、エラーは表示されなくなりました。

    function escape_single_quote_search_query() {
    	$_GET['s'] = trim( $_GET['s'] );
    	if ( isset( $_GET['s'] ) ) {
    	  if (preg_match("/'/", $_GET['s'])) {
    			$_GET['s'] = str_replace("'", "'", $_GET['s']);
    		}
    	}
    }
    add_action( 'init', 'escape_single_quote_search_query' );

    ただ、
    実際はヒットするデータがあっても、検索結果には出てこないのです。
    (検索対象テーブルに「h's」とあっても出てこない)
    表示されなくなったエラーも、これで解決したのかどうか不安です。

    どうすればいいのでしょうか。。

    デバッグモードでもエラーは出ないですか?

    参照:問題解決のためのチェックリスト

    先ほどのエラー自体はSQL文の構文エラーとなっているのでそれが出なくなったということだとは思います。

    WordPressのクエリではなく、ご自分でSQL文を使って検索をしてるということでしょうか??

    トピック投稿者 Duong_phu

    (@duong_phu)

    公開中のサイトなので、すぐにはデバッグモードにできないのですが、Debug Barプラグインでcチェックすると、データベースエラーは出ていないのですが実行されたSQL文は上記のSELECT DISTINCT以下と同様でした。

    はい、固定ページや投稿、カスタム投稿はWordPressのクエリを使っていますが、WordPressのクエリは使わずに自作テーブルへの検索用テンプレートには自分でSQL文を作って実行しています。

    私はWordPressの中では自分でSQLを書かずにWP_Queryなどを利用して書くので、このような場合の方法はあまりよくわかりませんが、ひとついえることは、データベースを操作するようなカスタマイズで、実際に運用している最中のサイトでデバッグするのはお勧めできないということですね。

    トピック投稿者 Duong_phu

    (@duong_phu)

    ご指摘ありがとうございます。ローカルでミラーサイトを作るなどして対応しようと思っています。
    データベースエラーは一応解消されましたので、解決済みとさせていただきます。
    どうもありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「シングルクォーテーションを含ませてサイト内検索するとSQLエラーが表示」には新たに返信することはできません。