iT邦幫忙

1

php初學者,
現在想要的網頁有
搜尋關鍵字給資料庫模糊搜尋 的功能
換頁 的功能

目前的情況:
搜尋後的結果網址不會更動
換頁之後的結果會網址後面會多出 p=頁數

這樣子會造成一個問題
就是如果我在p=2的時候搜尋別的關鍵字
會連接到該關鍵字搜尋結果的第2頁
請問要怎麼樣讓搜尋之後的結果去掉p=2呢?

目前嘗試過把搜尋按鈕從 input 改成 a href
但是這樣我COOKIE要存的變數好像會存不到

這是php

<?php

//商品查詢系統
function item_list()
{
    global $itemname,$smarty,$itname,$choose;
    //這個if可以讓cookie存的東西不會慢一步顯示
    if($_POST['choose']!=""){
    $choose = $_REQUEST['choose'];
    setcookie("choosecookie", $choose, time()+3600);
    $smarty->assign('choose',$choose);
    }
    elseif($_COOKIE['choosecookie']!=""){
    $choose = $_COOKIE['choosecookie'];
    $smarty->assign('choose',$choose);
    }
    if($_POST['itemname']!=""){
    $itemname=($_POST['itemname']);
    setcookie("itcookie", $itemname, time()+3600); //讓搜尋後頁碼會獲得cookie存的值
    $itname=$_REQUEST['itemname']; 
    item_list_choose();
    $smarty->assign('itname',$itname);

    }
    elseif($_COOKIE['itcookie']!=""){
        $itemname=$_COOKIE['itcookie'];
        $itname=$_COOKIE['itcookie']; 
        item_list_choose();
        $smarty->assign('itname',$itname);

        
       
    }
    else{

        item_list_choose();
        $smarty->assign('itname',$itname);
               
       
    }
    
}

//商品比價與心得
function price_form($item_page)

{
    global $smarty,$mysqli,$item_page;
    $sql ="SELECT * FROM info INNER JOIN price ON info.info_page = price.price_page JOIN review ON info.info_page = review.review_page and info.info_page=$item_page";
    $result=$mysqli->query($sql) or die($mysqli->connect_error);
    $i=$item_page;
    $item = $result->fetch_assoc();
    $price_item[$i] = $item;
      
    

    $smarty->assign('price_item',$price_item);
}



function item_list_choose()
{

    global $smarty,$mysqli,$itemname,$choose;


    // $itname=$_REQUEST['itemname'];
    if($choose==''){
    $sql ="SELECT * FROM info,price where info.info_itemname like '%$itemname%' and info.info_page = price.price_page";
    $result=$mysqli->query($sql) or die($mysqli->connect_error);
    $Num = $result->num_rows;
    $show = 24;
    

    if (!isset($_GET["p"])){ //假如$_GET["page"]未設置
        $p=1; //則在此設定起始頁數
    } else {
        $p = intval($_GET["p"]); //確認頁數只能夠是數值資料
    }
    $start=($p-1)*$show;
    $result=$mysqli->query($sql.' LIMIT '.$start.', '.$show) or die($mysqli->connect_error);
    $pages = ceil($Num/$show);
    $i  = 1;
    while($item = $result->fetch_assoc()){
      $all_item[$i] = $item;
      $i++;

    }

    $smarty->assign('all_item',$all_item);
    $smarty->assign('totalNum',$Num);  //宣告變數給前端
    $smarty->assign('choose',$choose); 
    $smarty->assign('pages',$pages); 
    $smarty->assign('p',$p); 
    // $smarty->assign('itname',$itname);
    }


接下來是html

這是html
<div class="col-xs-12 col-sm-12 col-md-4" align="center">
<form id="form1" name="form1" method="post" action="">
  <div style="font-size: 2.5vmin;">商品關鍵字:

    <input name="itemname" type="text" id="itemname" value="{$itname}" style="text-align:center;"  /></div></div>
<div> </div>
<div class="col-xs-12 col-sm-12 col-md-4" align="center">
  <input class="btn btn-danger btn-lg" type="submit" name="button" id="button" value="點此查詢商品!"/>
<!-- <a href ="index.php?op=item_list" class="btn btn-danger" type="submit" name="button" id="button">點此查詢商品!</a> -->

</form>
  <!-- 換頁   -->
    {if (($p-3)<0)}  

    {for $a=1;$a<=$pages and ($a-$p<=9);$a++} 
            <a href="index.php?op=item_list&p={$a}">{$a}</a>
    {/for}
    {elseif (($p-3)>0)}
    {for $a=($p-3);$a<=$pages and ($a-$p<=3);$a++} 
        <a href="index.php?op=item_list&p={$a}">{$a}</a>
    {/for}
    {/if}
    
    <a href="index.php?op=item_list&p={$pages}">末頁</a>
    </div>



  <div style="text-align: center;">共有{$pages}頁</div>
     </div>

小魚 iT邦研究生 5 級 ‧ 2017-12-03 18:53:39 檢舉
換頁用get,搜尋用post,這種寫法有點...
搜尋後重新做分頁
fillano iT邦超人 1 級 ‧ 2017-12-04 10:06:17 檢舉
你這樣寫會有sql injection的問題...請不要把request/post/get送進來的東西直接放進sql字串。

2 個回答

0
yoching
iT邦新手 4 級 ‧ 2017-12-06 10:27:24

一般來說,比較簡單的處理方式,就是搜尋直接指定第一頁了。
也就是你的action就不能用本頁直接post運行這樣的處理。你要直接指定網址讓他不會再送p值。

另外一般最好還是統一get處理。
如果怕被攻擊刷頁的話。就採用記錄式的方式。

我個人的做法也的確是將搜尋用post處理。然後再將其post的搜尋條件給session下來。跟做一個key處理。

之後的傳送才會用get的方式處理。但get的方式就也只會送頁碼而已

0
pupuliao
iT邦新手 5 級 ‧ 2017-12-07 14:23:06

先不論 其他人說的安全性

我個人的習慣是 使用Jquery 去控制所有事件
我不使用html 內建的,透過jquery 可以事先檢查所有條件是否合法

透過js 可以 去偵測 有沒有變更搜尋條件,當發現 搜尋條件變更,就可把頁碼 改道第一頁

透過 js 可以隨意決定要用submit的方式送出,還是使用ajax 的方式

我要發表回答

立即登入回答