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

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

ただいまの
回答率

87.35%

検索結果表示

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,725

score 33

こんにちは。

サイトない検索をphpで実装している。
検索ワードは、POSTで送信されてきたワードとGETで送信されてきたワードがあります。
両方の方法で送られてきたワードを検索結果表示できるようにするには、どのように実装すればよいでしょうかね?
また、スペースを入ったら、結果にも表示されるようにしたいです。

一応、データベースを利用して検索することになります。

<?php
if($_POST["search"]):
    $_SESSION["s_res"] = array();
    $where = " WHERE 1 AND";
    $kensaku = htmlspecialchars($_POST['search']);
    $kensaku = trim($kensaku);
    $word = str_replace(" ", " ", $kensaku);
    $word = str_replace("'", "\'", $word );
    $words = preg_split("/[ ]+/",$word );
    $count = count($words);
else:
    if($_GET["tag"]):
        $_SESSION["s_res"] = array();
        $where = " WHERE 1 AND";
        $kensaku = htmlspecialchars($_GET["tag"]);
        $kensaku = trim($kensaku);
        $word = str_replace(" ", " ", $kensaku);
        $word = str_replace("'", "\'", $word );
        $words = preg_split("/[ ]+/",$word );
        $count = count($words);
    else:
        $err = "検索タグワードが入力されていません";
    endif;
endif;

どなた方が分かれば教えてお願いいたします。

何卒宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/07/08 12:19

    ソースコードを提示してください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/07/08 12:35



    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。

    また、仕様が不明確です。データベースを利用して検索するのでしょうか。

    キャンセル

回答 2

checkベストアンサー

0

詳細な仕様が不明なので、どんな感じでSQLを組み立てれば良いか、雰囲気がつかめるソースだけ提示します。

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

function str2array($string)
{
    $formatted = mb_convert_kana($string, 'KVas', 'utf-8');
    $arr = explode(' ', $formatted);
    $res = [];
    foreach ($arr as $v) {
        if ('' != $v) {
            $res[] = $v;
        }
    }
    return $res;
}

function makeSql()
{
    $arrFieldsForGet = ['f_get1', 'f_get2'];
    $arrFieldsForPost = ['f_post1', 'f_post2'];

    $get = str2array(filter_input(INPUT_GET, 'tag'));
    $post = str2array(filter_input(INPUT_POST, 'search'));

    $arrParams = [];

    $sql = "SELECT * FROM table ";
    $sql .= "WHERE 1 ";

    $sqlGet = '';
    foreach ($get as $v) {

        $arrOrSql = [];
        foreach ($arrFieldsForGet as $field) {
            $arrOrSql[] = "{$field} LIKE ?";
            $arrParams[] = sprintf("%%%s%%", $v);
        }

        $sqlGet .= sprintf(" AND (%s)", implode(' OR ', $arrOrSql));
    }
    $sql .= $sqlGet;

    $sqlPost = '';
    foreach ($post as $v) {

        $arrOrSql = [];
        foreach ($arrFieldsForPost as $field) {
            $arrOrSql[] = "{$field} LIKE ?";
            $arrParams[] = sprintf("%%%s%%", $v);
        }

        $sqlPost .= sprintf(" AND (%s)", implode(' OR ', $arrOrSql));
    }
    $sql .= $sqlPost;

    return ['sql' => $sql, 'params' => $arrParams];
}
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h2>タグ(GET)</h2>
        <form action="" action="get">
            <label for="tag">タグ</label>
            <input type="text" name="tag" value="<?= h(filter_input(INPUT_GET, 'tag')); ?>" />
            <button type="submit">検索</button>
        </form>

        <h2>キーワード(POST)</h2>
        <form action="" method="post">
            <input type="text" name="search" value="<?= h(filter_input(INPUT_POST, 'search')); ?>" />
            <button type="submit">検索</button>
        </form>

        <h2>出力</h2>
        <h3>GET</h3>
        <pre><?= h(filter_input(INPUT_GET, 'tag')); ?></pre>

        <h3>POST</h3>
        <pre><?= h(filter_input(INPUT_POST, 'search')); ?></pre>

        <h3>SQL</h3>
        <pre><?php var_dump(makeSql()); ?></pre>
    </body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/11 12:13

    テーブルの構造など具た的な情報を提示してください。また、本質問はすでに解決済みとなっていますし、タイトルと追加質問の内容は異なるものですので、あたらな質問を立てることをお勧めします。

    キャンセル

  • 2016/07/11 13:15

    新たに質問致しました。
    コメントありがとうございました。

    今後とも何卒宜しくお願いいたします。

    キャンセル

  • 2016/07/11 13:33 編集

    https://teratail.com/questions/40715
    こちらの質問拝見しましたが…
    SQLインジェクションの脆弱性ありますし、TABLEの定義は明らかにされていませんね…。
    私が提示したコードをもとに書き直されることをお勧めします。

    キャンセル

0

POSTとGETのキーが競合しなければ$_REQUESTで参照できます
ただし$_REQUESTは他の環境変数やセッションやクッキーも参照するのでご注意ください
優先順位は一般に
$_ENV > $_GET > $_POST > $_COOKIE > $_SESSION
となりますがvariables_orderの設定で任意に変更できるようです。

なお、厳密には参照値が配列となる場合もあるので例外処理を入れる必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/08 14:53

    yambejpさん

    この度、ご回答いただき誠にありがとうございます。

    参考になります。
    誠にありがとうございます。

    今後とも何卒宜しくお願い致します。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る