1

生成されたリンクのリストを使用して検索を絞り込みたい。

製品 (パネル メーター) のデータベースがあり、各行には一意のモデル番号とそのモデルに関する情報が含まれています。ユーザーがモデル番号と入力タイプを検索できるようにする検索を作成しました (これらは、標準の 4 ~ 20mA またはカスタム レンジなどの信号を受信できるプロセス メーターです)。検索に加えて、スクリプトは、結果を絞り込むためにクリックできるようにしたいリンクの 3 つの一意の配列も作成します。これまでのところ、これらの php のスニペットを使用してリンク リストを作成しています。

//create a series list
$uniqueseries[] = "<a href='#' onclick='document.searchform.submit()'>{$row['series']}</a>";

//create a inputs list
$uniqueinputs[] = "<a href='#' onclick='document.searchform.submit()'>{$row['sio']}</a>";

//create a series list
$uniquepowers[] = "<a href='#' onclick='document.searchform.submit()'>{$row['pso']}</a>";

//create array of unique series types
$uniqueseries = array_unique($uniqueseries);

//create array of unique input types
$uniqueinputs = array_unique($uniqueinputs);

//create array of unique power types
$uniquepowers = array_unique($uniquepowers);

これは「バックエンド」スクリプトにあります (少し下にあります)。

リンクのセットごとに、最初に非一意のリンクの配列 (MySQL が最初に返したすべての結果に 1 つ) を作成し、次に array_unique を使用して配列を一意のリンクのみに切り詰めます。次に、検索ページで ", $uniqueseries); ?> のようなものを使用して、リンクの配列を出力します。

私が実現したいのは、ユーザーがリンクをクリックすると、元の MySQL クエリに絞り込みクエリを追加して再送信することで、検索結果を絞り込むことです。この動作の例は、ユーザーが左側のリンクをクリックして同じ検索を保持する Amazon 検索に表示されますが、特定の部門またはその製品に固有のオプション (つまり、検索時の RAM の量) に絞り込むことができます。カメラを検索するときのコンピューターまたはピクセル数。)

私の場合、ユーザーがモデル番号と入力タイプ (デフォルトの 2 つのキー) に対して検索を開始すると、たとえば「4 から 20」という用語を使用して検索を開始すると、ユーザーには 3500 を超える結果が返されます (非常に製品の大規模なカタログです。) 左側には、結果を絞り込みたい固有のリンクのリストがあります。そのため、ユーザーが「電源」オプションの下に「120 V AC with battery backed data」と表示されている場合、そのリンクをクリックして、4 ~ 20 mA 入力のすべてのメーターを返す必要があります (生成された入力オプションの下に表示されるように、複数のバリエーションがあります)。 「電源」ソースとして「バッテリ バックアップ データ付き 120 V AC」がある場合のみ。

私は正しい方向に進んでいるように感じますが、PHPに関してはまだ初心者です。

参考までに、検索「バックエンド」に使用しているコードを次に示します。

<?php

    //creates DB connection
    $dbHost = 'host';
    $dbUser = 'user'; 
    $dbPass = 'pass';
    $dbDatabase = 'db';
    $con = mysql_connect($dbHost, $dbUser, $dbPass) or trigger_error("Failed to connect to MySQL Server. Error: " . mysql_error());

    mysql_select_db($dbDatabase) or trigger_error("Failed to connect to database {$dbDatabase}. Error: " . mysql_error());

$time_start = microtime(true);  

//create arrays for results and errors
$error = array();
$results = array();

//creates arrays holding values for narrowing results
$uniqueseries = array();
$uniqueinputs = array();
$uniquepowers = array();
$uniquedigsize = array();
$uniquedignum = array ();
$uniquedigcol = array();
$uniquedistype = array();

//reset some variables if needed
isset($_GET['page'])?"":$_GET['page'] = 1;
isset($resultcount)?"":$resultcount = 0;

if (isset($_GET['search'])) {

    //removes HTML/JS
    $searchString = trim($_GET['search']);
    $searchStripped = strip_tags($searchString);
    //prevents SQL injections
    $searchSan = mysql_real_escape_string($searchStripped);

    if (count($error) <1) { //search continues if no errors exist
        $searchSQL = "SELECT series, model, img, pso, sio, dig_size, dig_num, dig_col FROM meters WHERE levenshtein('%{$searchSan}%',model) < 4 OR levenshtein('%{$searchSan}%',sio) < 4 ORDER BY model";

        $searchResult = mysql_query($searchSQL) or trigger_error("There was an error with MySQL. " . mysql_error() . "<br> Query was {$searchSQL}.");

        if (mysql_num_rows($searchResult) < 1) {
            $error[] = "The search term '{$searchString}' yielded no results.";
        } else {
            $i = 1;
            while ($row = mysql_fetch_assoc($searchResult)) {
                $results[] = "<tr><td align='center'>{$i}</td> <td align='center'><a href='/catalog/{$row['series']}.pdf'>{$row['series']}</a></td>  <td align='center'><img src='/img/productimg/small/{$row['img']}'></td>  <td align='center'>{$row['model']}</td>  <td>&nbsp;{$row['sio']}</td>  <td>&nbsp;{$row['pso']}</td> <td align='center'>{$row['dig_num']}</td> <td align='center'>{$row['dig_size']}\"</td> <td align='center'>{$row['dig_col']}</td></tr>";

                //create a series list
                $uniqueseries[] = "<a href='#' onclick='document.searchform.submit()'>{$row['series']}</a>";

                //create a inputs list
                $uniqueinputs[] = "<a href='#' onclick='document.searchform.submit()'>{$row['sio']}</a>";

                //create a series list
                $uniquepowers[] = "<a href='#' onclick='document.searchform.submit()'>{$row['pso']}</a>";

                $i++;
            }
        }

        //create array of unique series types
        $uniqueseries = array_unique($uniqueseries);

        //create array of unique input types
        $uniqueinputs = array_unique($uniqueinputs);

        //create array of unique power types
        $uniquepowers = array_unique($uniquepowers);

        //results paginator
        $resultcount = count($results); //number of results
        $perpage = 5; //number of results per page
        $totalpages = ceil($resultcount / $perpage); //calculates total number of pages
        $startresult = (($_GET['page'] - 1) * $perpage); //calculates the first result number for page
        $brokenresults = array_slice($results, $startresult, $perpage); //slices array into groups set by $perpage
        $nextpage = $_GET['page'] + 1; //calculate next page number
        $lastpage = $_GET['page'] - 1; //calculates last page number
    }
}

function removeEmpty($var) {
   return (!empty($var)); 
}
$execution_time = (microtime (true) - $time_start); //calculates script processing time
?>

これは、「フロントエンド」に使用しているコードです。

    <body>
        <!-- Google Analytics Script -->
        <?php include_once("scripts/analyticstracking.php") ?>

        <div class="wrapper"> <!-- Sticky Footer Wrapper -->
            <div id="panorama"></div>
            <div id="header">
                <?php include("include/header/banner.php") ?>
                <?php include("include/header/nav.php") ?>
                <?php include("include/header/quicksearch.php") ?>
            </div>
            <form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>" name="searchform" id="searchform">
            <div id="content">
                <?php include("scripts/searchbackend.php") ?>
                <?php include("scripts/searchform.php") ?>
                <?php include("scripts/searchoptions.php") ?>
                <div id="searchresults">
                    <center>
                        <?php 
                        echo (count($error) > 0)?"The following had errors:<br /><span id=\"error\">" . implode("<br />", $error) . "</span><br /><br />":"";

                        echo ($resultcount > 0)?"<table id='searchtable' ><thead align='center'><tr><th width='50px'></th><th width='50px'>Series</th><th width='50px'>Image</th><th width='85px'>Model</th><th width='50px'>Input</th><th width='50px'>Power Supply</th><th width='50px'># of Digits</th><th width='50px'>Digit Size</th><th width='50px'>Display Color</th></tr></thead><tbody>" . implode("", $brokenresults) . "</tbody></table>":""; //returns results
                        ?>
                        <div id="resultsfooter">
                            <?php
                            if (count($results) > 5) {
                                echo ($_GET['page'] > 1)?"<br><a href='/search.php?search={$_GET['search']}&page={$lastpage}'>Previous</a>" . "&nbsp;&nbsp;Page {$_GET['page']}/{$totalpages}&nbsp;&nbsp;" . "<a href='/search.php?search={$_GET['search']}&page={$nextpage}'>Next</a>":"<br>Page {$_GET['page']}/{$totalpages}&nbsp;&nbsp;" . "<a href='/search.php?search={$_GET['search']}&page={$nextpage}'>Next</a>";
                            }

                            echo ($resultcount > 0)?"&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;Search found {$resultcount} results in {$execution_time} seconds.":"";  //result count and time
                            ?>
                        </div>
                    </center>
                </div>
            </div>
            </form>
        </div>
        <div class="footer"> 
            <?php include("include/footer/footer.php") ?>
        </div>

    </body>

同様に、これは私の「searchoptions.php」の内容です:

            <div id="searchoptions">
                <fieldset id="searchin" class="searchoptions">
                <legend>Serach In</legend>
                    <input type="checkbox" class="checkbox" name="model" <?php echo isset($_GET['model'])?"checked":''; ?> /><label class='checklabel'>Model</label><br>
                    <input type="checkbox" class="checkbox" name="input" <?php echo isset($_GET['input'])?"checked":''; ?> /><label class='checklabel'>Input</label>
                </fieldset>
                <fieldset class="searchoptions" style="<?php if (count($uniqueseries) < 2) {echo "Display: none;";} ?>">
                <legend>Series</legend>
                <?php echo implode("<br>", $uniqueseries); ?>
                </fieldset>
                <fieldset class="searchoptions" style="<?php if (count($uniqueinputs) < 2) {echo "Display: none;";} ?>">
                <legend>Input</legend>
                <?php echo implode("<br>", $uniqueinputs); ?>
                </fieldset>
                <fieldset class="searchoptions" style="<?php if (count($uniquepowers) < 2) {echo "Display: none;";} ?>">
                <legend>Power</legend>
                <?php echo implode("<br>", $uniquepowers) ?>
                </fieldset>
                <input type="submit" class="" value="Update Search" style="" <?php if (!isset($types)) { if (isset($_GET['model'])) {"`model` LIKE '%{$searchSan}%'";} elseif (isset($_GET['input'])) {"`input` LIKE '%{$searchSan}%'";} } ?> />
            </div>

ここからアクセスできるテスト サイトで最新の変更を公開しています: new.foxmeter.com "FM" または "4 to 20" を検索してみてください。今のところ、"4-20" と "4 20" は "4 to 20" と同じ結果を返しませんが、それは可能であり、まだ私のリストの一番上にはありません.

また、以前の検索を維持したいと思います。そのため、検索は「4 ~ 20」から始まり、「バッテリ バックアップ データ付き 120 V AC」電源の 4 ~ 20 プロセス メーターのみに絞り込まれ、再び絞り込むと「120 V AC 付き 4 ~ 20 プロセスバッテリーでバックアップされたデータ」を以前から改良し、新しい改良も加えました。

不明な点がある場合は、終日ここにいますので、私に何か考えがあれば、遠慮なく質問したり、訂正したりしてください。誰からの助けにも感謝します。新しいサイトのほとんどの機能を完成させましたが、この検索には多少問題がありました。これを完了することで、私のタスクは (ほぼ) 完了したことになります。

4

0 に答える 0