小弟在嘗試製作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>
一開始畫面
篩選之後畫面
點選下一頁之後畫面
按下一頁時沒有把過濾條件放在$GET,然後在接收過濾條件的部份改用$_REQUEST。
一般兩種做法。
如果確定是同一支程式的情況下。就如 fillano大說的。不要給 action 指定控制。
這樣的話就會自動帶入你的get值。目前看起來你的搜尋條件都是get值。所以還可以用。
而另外一個做法。就是將action的指定值讓它隨時帶著get值。
也就是說你的
action="Test分頁.php"
改成用
action="<?php echo $url;?>"
參數發送的方式。
然後從程式中去指定$URL值。
不太了解什麼是不要給action指定控制
GET是透過URL傳的,POST不是。如果你兩個都要收到,那在POST時,action要把要傳送的GET參數加上去。
代表我需要把POST更改為GET的意思嗎
代表你要稍微理解一下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 : '';
假設你的需求就是要同時收到頁碼跟查詢條件,那在處理分頁的部份,你要讓他可以傳出查詢條件,而在查詢的部份,你也要讓他可以收到分頁的資訊。你可以試試看到底怎樣可以做到。
這兩個可能會是拆開的兩個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還有表單的錯誤使用。
你居然還在跟我說你不知道錯在哪裏????
還在自已的思考思維挑戰不可能的任務?
算了,你認為沒問題就沒問題。範例也都給你看了。你還看不出來我也沒招了。就這樣子吧
因為你沒有把篩選的參數帶到下一頁啊.
你看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
這麼長一串.