iT邦幫忙

0

php分頁跳轉問題

小弟在嘗試製作php分頁,但在製作中出現了些許問題,我篩選完條件之後,出現我篩選的條件,但按下下一頁,會跳轉回完全沒篩選的畫面,SQL指令完全跑掉,找了好久不知道是哪邊出錯,懇請高手賜教。

<?php
include ('sql_connect.php');
session_start();
?>
<?php


$per = 5;
$sql = "SELECT * FROM `virus`";
!empty($_GET['n']) ? $sql .= " WHERE Name LIKE '%" .$_GET['n']."%'":'';

$bol = true;
if(!empty($_POST)){
    foreach ($_POST as $key => $value):{
        if(!empty($value)){
            if($bol){
                $sql.= " WHERE ".$key." LIKE "."'".$value."'";
                $bol = false;
            }else{
                $sql.= " AND ".$key." LIKE "."'%".$value."%'";
            }
        }
    }
    endforeach;
}
echo "$sql";
$origin_query = mysqli_query($link,$sql);
//print_r($sql);


$OrderName_sql = $sql."GROUP BY OrderName";
$OrderName_query = mysqli_query($link,$OrderName_sql);
$OrderName_result = mysqli_fetch_all($OrderName_query,MYSQLI_ASSOC);

$Family_sql = $sql."GROUP BY Family";
$Family_query = mysqli_query($link,$Family_sql);
$Family_result = mysqli_fetch_all($Family_query,MYSQLI_ASSOC);

$Genus_sql = $sql."GROUP BY Genus";
$Genus_query = mysqli_query($link,$Genus_sql);
$Genus_result = mysqli_fetch_all($Genus_query,MYSQLI_ASSOC);

$data_num = mysqli_num_rows($origin_query);
$pages = ceil($data_num/$per);

if(!isset($_GET['page'])){
    $page = 1;
}else{
    $page = intval($_GET['page']);
}
$start = ($page-1)*$per;
//print_r($sql);
//$sql.='LIMT'.$start.','.$per;
!empty($sql) ? $sql .= " LIMIT " . $per * ($page - 1) . "," . $per : '';

//print_r($sql);
$query = mysqli_query($link, $sql);
$result = mysqli_fetch_all($query,MYSQLI_ASSOC);
?>

<!DOCTYPE html>
<html lang="en">

<head>
    
</head>

<body id="page-top">

<div class="overflow-auto">
                        <div align="center">
                            <form action="Test分頁.php" method="get">
                                名字:<input type="text" name="n" value="">
                                <input type="submit" value="搜尋">
                                <input type="button" onclick="location.href='Test分頁.php'" value="顯示全部">
                            </form>
                        </div>
                        <table class="table"  width="100px" cellspacing="0">
                            <thead class="thead-dark">
                            <tr>
                                <th hidden>No</th>
                                <th>ID</th>
                                <th>Name</th>
                                <th>OrderName</th>
                                <th>Family</th>
                                <th>Family_unclassified</th>
                                <th>Family_unassigned</th>
                                <th>Subfamily</th>
                                <th>Genus</th>
                                <th>Genus_unclassified</th>
                                <th>Genus_unassigned</th>
                                <th>PackFileName</th>
                                <th>NCLength</th>
                                <th>NCLength_Coding</th>
                                <th> NCLength_NonCoding</th>
                                <th>CodeRatio</th>
                                <th>TotalCDSLength</th>
                                <th>CDSCnt</th>
                                <th>RegionCnt</th>
                                <th>MotifCnt</th>
                                <th>Type</th>
                                <th>BaltimoreStr</th>
                                <th>BaltimoreGroup</th>
                                <th>Hit_organism</th>
                            </tr>
                            </thead>
                            <tbody>
                            <?php if(!empty($result)): ?>
                                <?php foreach ($result as $k => $v):?>
                                    <tr>
                                        <td hidden><?php echo $v['No']?></td>
                                        <td><?php echo $v['ID']?></td>
                                        <td><a href="<?php echo "page.php?ID=".$v['ID']?>"><?php echo $v['Name']?></a></td>
                                        <td><?php echo $v['OrderName']?></td>
                                        <td><?php echo $v['Family']?></td>
                                        <td><?php echo $v['Family_unclassified']?></td>
                                        <td><?php echo $v['Family_unassigned']?></td>
                                        <td><?php echo $v['Subfamily']?></td>
                                        <td><?php echo $v['Genus']?></td>
                                        <td><?php echo $v['Genus_unclassified']?></td>
                                        <td><?php echo $v['Genus_unassigned']?></td>
                                        <td><?php echo $v['PackFileName']?></td>
                                        <td><?php echo $v['NCLength']?></td>
                                        <td><?php echo $v['NCLength_Coding']?></td>
                                        <td><?php echo $v['NCLength_NonCoding']?></td>
                                        <td><?php echo $v['CodeRatio']?></td>
                                        <td><?php echo $v['TotalCDSLength']?></td>
                                        <td><?php echo $v['CDSCnt']?></td>
                                        <td><?php echo $v['RegionCnt']?></td>
                                        <td><?php echo $v['MotifCnt']?></td>
                                        <td><?php echo $v['Type']?></td>
                                        <td><?php echo $v['BaltimoreStr']?></td>
                                        <td><?php echo $v['BaltimoreGroup']?></td>
                                        <td><?php echo $v['Hit_organism']?></td>
                                    </tr>
                                <?php endforeach;?>
                            <?php else: ?>
                                <tr>
                                    <td align="center" colspan="4">
                                        系統目前並無任何資料
                                    </td>
                                </tr>
                            <?php endif; ?>
                            </tbody>
                            <tfoot class="thead-dark">
                            <tr>
                                <th hidden>No</th>
                                <th>ID</th>
                                <th>Name</th>
                                <th>OrderName</th>
                                <th>Family</th>
                                <th>Family_unclassified</th>
                                <th>Family_unassigned</th>
                                <th>Subfamily</th>
                                <th>Genus</th>
                                <th>Genus_unclassified</th>
                                <th>Genus_unassigned</th>
                                <th>PackFileName</th>
                                <th>NCLength</th>
                                <th>NCLength_Coding</th>
                                <th> NCLength_NonCoding</th>
                                <th>CodeRatio</th>
                                <th>TotalCDSLength</th>
                                <th>CDSCnt</th>
                                <th>RegionCnt</th>
                                <th>MotifCnt</th>
                                <th>Type</th>
                                <th>BaltimoreStr</th>
                                <th>BaltimoreGroup</th>
                                <th>Hit_organism</th>
                            </tr>
                            </tfoot>
                        </table>
                    </div>
                    <form method="post" action="Test分頁.php">
                        <label size="20px">OrderName : </label>
                        <select name="OrderName">
                            <option value="">請選擇</option>
                            <?php foreach ($OrderName_result as $OrderName):?>
                                <option value="<?php echo $OrderName['OrderName']?>"><?php echo $OrderName['OrderName']?></option>
                            <?php endforeach; ?>
                        </select>

                        <label size="20px">Family : </label>
                        <select name="Family">
                            <option value="">請選擇</option>
                            <?php foreach ($Family_result as $Family):?>
                                <option value="<?php echo $Family['Family']?>"><?php echo $Family['Family']?></option>
                            <?php endforeach; ?>
                        </select>

                        <label size="20px">Genus : </label>
                        <select name="Genus">
                            <option value="">請選擇</option>
                            <?php foreach ($Genus_result as $Genus):?>
                                <option value="<?php echo $Genus['Genus']?>"><?php echo $Genus['Genus']?></option>
                            <?php endforeach; ?>
                        </select>
                        <button  class="btn-primary"  type="submit">Enter</button>
                        <form method="post" action="Test分頁.php">
                            <?php $_POST['OrderName'] = ""?>
                            <?php $_POST['Family'] = ""?>
                            <?php $_POST['Genus'] = ""?>
                            <button class="btn-primary" type="submit">Clean</button>
                        </form>
                    </form>

                    <!--                        <a href="SeqJoin.php"><button>creat</button></a>-->
                    <div align="right">

                        <?php
                        echo '<lab style="font-size: 20px">共 '.$data_num.' 筆-在 '.$page.' 頁-共 '.$pages.' 頁</lab>';
                        echo "<br /><a class='btn btn-primary' href=Test分頁.php?page=1 type='button'>首頁</a>";
                        echo "<lab style='font-size: 20px'>第 </lab>";
                        for( $i=1 ; $i<=$pages ; $i++ ) {
                            if ( $page-3 < $i && $i < $page+3 ) {
                                echo "<lab style='font-size: 20px'><a href=Test分頁.php?page=".$i.">".$i."</a></lab> ";
                            }
                        }
                        echo "<lab style='font-size: 20px'> 頁 </lab><a class='btn btn-primary'href='Test分頁.php?page=".$pages."' type='submit'>末頁</a><br/><br/>"
                        ?>
                    </div>
<?php echo "$sql";?>
</body>

</html>


一開始畫面
https://ithelp.ithome.com.tw/upload/images/20191113/20111719wtsaWIr9Lz.png

篩選之後畫面
https://ithelp.ithome.com.tw/upload/images/20191113/201117199fdr0j4uj9.png

點選下一頁之後畫面
https://ithelp.ithome.com.tw/upload/images/20191113/20111719JxAPClFLZ4.png

看更多先前的討論...收起先前的討論...
fillano iT邦超人 1 級 ‧ 2019-11-13 16:18:29 檢舉
如果都是同一頁,把form裡面的action拿掉。
拿掉沒有用還是一樣,我的下拉式選單選完案下一頁SQL還是會跳掉
感覺是group by前面沒有加上空白造成的
其實我倒是發現他好像前端運行跟後端運行沒搞清楚。
因為發現到一個很不可思議的寫法。我下面有提到就不在這重覆了。
0
kuanhuayu
iT邦新手 5 級 ‧ 2019-11-13 16:30:02

按下一頁時沒有把過濾條件放在$GET,然後在接收過濾條件的部份改用$_REQUEST。

您是說這邊改掉嗎

if(!isset($_GET['page'])){
    $page = 1;
}else{
    $page = intval($_GET['page']);
}
1
浩瀚星空
iT邦超人 1 級 ‧ 2019-11-13 16:31:18

一般兩種做法。

如果確定是同一支程式的情況下。就如 fillano大說的。不要給 action 指定控制。
這樣的話就會自動帶入你的get值。目前看起來你的搜尋條件都是get值。所以還可以用。

而另外一個做法。就是將action的指定值讓它隨時帶著get值。
也就是說你的

action="Test分頁.php" 

改成用

action="<?php echo $url;?>"

參數發送的方式。
然後從程式中去指定$URL值。

看更多先前的回應...收起先前的回應...

不太了解什麼是不要給action指定控制

fillano iT邦超人 1 級 ‧ 2019-11-13 16:46:51 檢舉

GET是透過URL傳的,POST不是。如果你兩個都要收到,那在POST時,action要把要傳送的GET參數加上去。

代表我需要把POST更改為GET的意思嗎

fillano iT邦超人 1 級 ‧ 2019-11-13 17:00:53 檢舉

代表你要稍微理解一下GET跟POST以及他們跟html裡面form的關係XD

大大可以給我一個很簡單的範例參考嗎

先給你一個重點好了。
get傳送是不一定需要用form的。網址接的參數其實就是get傳送了。

你先去了解一下get跟post的特性吧。要不然真的會雞同鴨講的。

這些我都知道,我不清楚的是我選單post出去的值應該存成SQL指令了,但為何我下get下一頁SQL指令中的值就會被刪除

你存Sql下來?至少我沒看到你有存。每一次的發送。都得重送值的。sql也是依照每一次的傳送值重新給條件。
還是你以為sql會幫你記錄?

那就是天大的誤會

剛剛很仔細看了一下。發現你的form居然分成好幾段
也就是說。你的發送都是單純發送各自的值??

我想,這可能跟你覺得「SQL指令中的值就會被刪除」帶給你錯誤的感覺是一樣的。

請先記得一件事。每一次的選擇及每一次的發送。其對應值都是當下送出的值為判斷條件。sql並沒所謂會幫你記錄你之前送的值。
當然,說到這點。

其實我也可以教你改用session的方式。來去儲存你的值。來達到你覺得會記錄值的錯覺也是可以的。

不過說真的,你第一優先要先搞懂form才對。

這邊給你的建議如下:

一、將所有條件的發送值統一get或是post做發送。只留下一個form再將其全部包起來。不要分散不同的form。那只會害你不會發送不在同一個form的值。然後再每一次帶值。也將其值統一帶入到其對應的value上。
如如果用post傳送。

<input type="text" name="n" value="">

就改成用

<input type="text" name="n" value="<?php echo $_POST['n'];?>">

這樣可以確定每一次都能帶到值。這是表單連動處理的方式。不過記得第一次要給初始化值就是了。要不然在php7會報錯。php5記得不會報錯。

二、這一招就是我剛說的用session記錄方式。利用session來儲存你每一次的發送值。就只變動最新的變動值就行。
用這招要確保一件事,第一次連結要清空原session值。要不然它會一直記錄住。

以上二招,自行去研究。我話並沒講明。你要學的東西還很多。
還是說那一句,先搞懂一下form還有post跟get。不要只會說「我都知道」然後做出不知道的事。這很讓人無奈的。
人最怕的不是不懂不會。而是不懂還裝很會。然後找不到自已的問題在哪邊。這才是最可怕的。

您說要我去了解post get差異我查了很多的參考網站,都是說get是由網址傳遞參數,post是以form傳遞參數,不知道是我查的方式不對,還是他們講的都不對,我不知道您說要我去了解的意思,網路上所有的說明都是我已經知道的事情,但您還是請我去了解,我不知道我到底哪裡不足

你可以說說看你覺得你換頁有 post 出去的資料
跟接到 post 的資料的程式碼在哪裡嗎

我select option post出去的值是接到這邊來

$bol = true;
if(!empty($_POST)){
    foreach ($_POST as $key => $value):{
        if(!empty($value)){
            if($bol){
                $sql.= " WHERE ".$key." LIKE "."'".$value."'";
                $bol = false;
            }else{
                $sql.= " AND ".$key." LIKE "."'%".$value."%'";
            }
        }
    }
    endforeach;
}

但我換頁是用get的方式由這邊接收

if(!isset($_GET['page'])){
    $page = 1;
}else{
    $page = intval($_GET['page']);
}
!empty($sql) ? $sql .= " LIMIT " . $per * ($page - 1) . "," . $per : '';
fillano iT邦超人 1 級 ‧ 2019-11-14 16:34:27 檢舉

假設你的需求就是要同時收到頁碼跟查詢條件,那在處理分頁的部份,你要讓他可以傳出查詢條件,而在查詢的部份,你也要讓他可以收到分頁的資訊。你可以試試看到底怎樣可以做到。

這兩個可能會是拆開的兩個form,那這樣你就需要把各自的資訊補進去。例如<input type='hidden' name='n' value='(從GET收到的頁碼)' />插在查詢的表單裡,就可以在查詢的時候送出頁碼等等,方法非常多。

唉~~~~我簡單說明一下如下的程式碼

<form method="get" action="Test分頁.php">
     <input type="text" name="n" value="123">
     <input type="submit" value="test1">
</form>
<form method="post" action="Test分頁.php">
     <input type="text" name="a" value="456">
     <input type="submit" value="test2">
</form>

當你按下test1。你的PHP會拿到

$_GET['n']='123'

當你按下test2。你的php會拿到

$_POST['a']='456'

或許這樣還看不出來
那換成如下的寫法

<form method="post" action="Test分頁.php">
     <input type="text" name="n" value="123">
     <input type="submit" value="test1">

     <input type="text" name="a" value="456">
     <input type="submit" value="test2">
</form>

這樣子無論按下tes1及test2
你的php會得到

$_POST=Array('n'=>'123','a'=>'456');

以上的範例,是否有看出什麼了??還是還是不懂。
我原本其實不太想明說的。不過想說算了。
其實從你的程式碼的確可以看出你幾個問題。其一就是你對form的特性不了解。
一般來說,除非有特殊的需要。很少會用多個form來做區段式的處理。因為這只是會讓你想要發送的參數被分離掉。就如第一個例子那樣。按test1只會送test1內的參數。按test2只會送test2內的參數。
但從你的php程式碼來看。你的目的並非是想要做分開式發送來處理。

所以,我花了10多分來仔細了解你的問題在哪。除了上面說的,你對form不了解的問題非常嚴重。我也明白其實你現在也不懂你的錯在哪邊。
我也就一一的說明後。用上面的例子來給你了解一下。還是看不懂再提出來。

再來,我總算發現到一個你觀念上理解的問題了。我發現你有前後端運作分開運行特性的不了解情況。
我為何會這樣說。請先看你寫的程式碼這一段

<form method="post" action="Test分頁.php">
                            <?php $_POST['OrderName'] = ""?>
                            <?php $_POST['Family'] = ""?>
                            <?php $_POST['Genus'] = ""?>
                            <button class="btn-primary" type="submit">Clean</button>
                        </form>

這一段真的正用意。是完全沒意義的寫法。但為何你會這樣寫。
我推測你不懂得所謂前後端分離的用法。
推測你是想要按下clean後。去做將那三個post清空的處理。
但你不明白的是,php是一個後端應用。但你卻想要前端式操作。
也就是你認為按下clean就會去跑單純這一段php程式碼。
這是大錯特錯的觀念。以下我就先簡單說明一下。

php是組譯後生成的東西。也就是說。你在瀏覽器裏,絕對看不到內的東西。
簡單來說,你光這一段的寫法。對瀏覽器而言就是會變成如下的情況

<form method="post" action="Test分頁.php">



               <button class="btn-primary" type="submit">Clean</button>
                    </form>

是否會覺得很奇怪?這不奇怪。
因為$變數=???的html輸出是一個真值。它對html來說是屬於無字元的情況。經往php編輯完後送出html就會變成這個樣子。
單單看這樣的html碼。其實正常你也因該可以理解到一件事。光按下clean。它也只不過只是再跑一次濡傳任何值的php。可以說是完全無意義的動作。

要記得,php只是一個後端語言。所謂的後端語言。就是不可能在瀏覽器出現操作。且後端語言只是幫你將程式處理完後,生成html碼之後,就送到瀏覧器上。它就不會跑了。它的任務也就結束了。
直到你在form它或是指向呼叫它。
結束就是結束。也不會保留任何你說的所謂的變數(session的方式就是例外了)

說到這邊了,你這樣是否已經明白了?我怕再說下去你會更難理解。
先看看你這邊是否可以吸收的住。有問題再問。
但收斂一下你的態度。因為從你後面的對話,就代表了你根本不認為你錯在哪邊。但在質疑人家寫的怎麼會有錯。
人家寫的不會有錯,錯在你的用法跟使用的方式。
但因為你的錯誤太多了。只能先一個一個導正回來。先了解前後端的應用方式後。再去了解form的應用方式。

浩瀚星空我真正的問題是如何按下一頁時也將form中的值一起帶過去,後來只在下一頁中的加入我想傳遞的值就搞定了,所以我不知道您為何一直認為我的get post有問題?

所以我在回答你的問題了。你還看不出來??
已經告訴你form的特性跟post及get的特性應用。
借此來告訴你的post跟get還有表單的錯誤使用。

你居然還在跟我說你不知道錯在哪裏????
還在自已的思考思維挑戰不可能的任務?
算了,你認為沒問題就沒問題。範例也都給你看了。你還看不出來我也沒招了。就這樣子吧

1
小魚
iT邦大師 1 級 ‧ 2019-11-13 19:31:27

因為你沒有把篩選的參數帶到下一頁啊.
你看Google搜尋的參數

https://www.google.com/search?q=repository+%E6%98%AF%E4%BB%80%E9%BA%BC&ei=D27LXb-PIpCEr7wP7JCAiAo&start=40&sa=N&ved=0ahUKEwj_0pPBleblAhUQwosBHWwIAKEQ8tMDCJUB&biw=1600&bih=708

這麼長一串.

這程式碼 我豆頁好痛/images/emoticon/emoticon70.gif

小魚 iT邦大師 1 級 ‧ 2019-11-14 08:09:27 檢舉

阿展展展
不會啊,
我也寫過這樣的,
只不過是沒有加密的,
Google這個看起來可能有做過處理.

我要發表回答

立即登入回答