各位大大好,我想用使用表單取得使用者想設定的WHERE條件,再利用php抓取MySQL裡的資料顯示在網頁上,並且設定每30筆資料為一頁。第一頁資料正常無錯誤訊息,但是其他頁數會出現Fatal error: Uncaught mysqli_sql_exception 錯誤訊息,並且同時出現Undefined variable($result_c1、$result_c2、$result_c3)的警告,一直無法解決,請問各位大大該如何解決?以下是我的程式碼,感謝各位大大!!
<?php
$result_c1 = $_POST['req1']; //取得表單資料
echo "$result_c1";
$result_c2 = $_POST['req2']; //取得表單資料
echo "$result_c2";
$result_c3 = $_POST['req3']; //取得表單資料
if($result_c2 != "LIKE"){
$result_c3 = $result_c3;
} else {
$result_c3 = "%$result_c3%";
}
echo "$result_c3";
echo '<a href="choose_test1.html"><button name="back">重設搜尋條件</button></a>';
// 定義資料庫資訊
$DB_NAME = "mydb"; // 資料庫名稱
$DB_USER = "root"; // 資料庫管理帳號
$DB_PASS = "**********"; // 資料庫管理密碼
$DB_HOST = "localhost"; // 資料庫位址
// 連接 MySQL 資料庫伺服器
$con = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS);
if (empty($con)) {
print mysqli_error($con);
die("資料庫連接失敗!");
exit;
}
// 選取資料庫
if (!mysqli_select_db($con, $DB_NAME)) {
die("選取資料庫失敗!");
} else {
/*echo "連接 " . $DB_NAME . " 資料庫成功!<br>";*/
}
// 設定連線編碼
mysqli_query($con, "SET NAMES 'utf8mb3'");
// 取得資料
$sql = "SELECT ROW_NUMBER() OVER(ORDER BY `產品編號`),`產品編號`,`品名規格`,`單位`,`倉庫編號`,`倉庫名稱`,`儲位`,`現有庫存` FROM `c0105_t` WHERE `$result_c1` $result_c2 '$result_c3'";
$result = mysqli_query($con, $sql);
$data_nums = mysqli_num_rows($result); //統計總比數
$per = 30; //每頁顯示項目數量
$pages = ceil($data_nums/$per); //取得不小於值的下一個整數
if (!isset($_GET["page"])){ //假如$_GET["page"]未設置
$page=1; //則在此設定起始頁數
} else {
$page = intval($_GET["page"]); //確認頁數只能夠是數值資料
}
$start = ($page-1)*$per; //每一頁開始的資料序號
$result = mysqli_query($con,$sql.' LIMIT '.$start.', '.$per) or die("Error");
echo '<table border="1">';
echo '<tr>
<th>資料編號</th>
<th>產品編號</th>
<th>品名規格</th>
<th>單位</th>
<th>倉庫編號</th>
<th>倉庫名稱</th>
<th>儲位</th>
<th>現有庫存</th>
</tr>';
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
$i = 0;
$n = 0;
while ( $i <= 3 ) {
echo '<tr>';
while ($n <= 7) {
echo "<td>$row[$i]</td>";
$i++;
$n++;
}
echo '</tr>';
}
}
echo '</table>';
//分頁頁碼
echo '共 '.$data_nums.' 筆-在 '.$page.' 頁-共 '.$pages.' 頁';
echo "<br /><a href=?page=1>首頁</a> ";
echo "第 ";
for( $i=1 ; $i<=$pages ; $i++ ) {
if ( $page-3 < $i && $i < $page+3 ) {
echo "<a href=?page=".$i.">".$i."</a> ";
}
}
echo " 頁 <a href=?page=".$pages.">末頁</a><br /><br />";
// 釋放記憶體
mysqli_free_result($result);
// 關閉連線
mysqli_close($con);
?>
照這篇寫 try catch
大概如下
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
可以知道沒有 handle 的 exception 到底是什麼原因
才可對症下藥
謝謝您,我試試看您的方法,感謝!
目前推測是第一頁之後
$sql = "SELECT ROW_NUMBER() OVER(ORDER BY `產品編號`),`產品編號`,`品名規格`,`單位`,`倉庫編號`,`倉庫名稱`,`儲位`,`現有庫存` FROM `c0105_t` WHERE `$result_c1` $result_c2 '$result_c3'";
這裡抓不到變數$result_c1、$result_c2、$result_c3 的值
1.先echo $sql;
2.順便echo [$result_c1][$result_c2][$result_c3];
$sql = "SELECT ROW_NUMBER() OVER(ORDER BY `產品編號`),`產品編號`,`品名規格`,`單位`,`倉庫編號`,`倉庫名稱`,`儲位`,`現有庫存` FROM `c0105_t` WHERE `$result_c1` $result_c2 '$result_c3'";
最後面的WHERE
$result_c1 $result_c2 '$result_c3'
怎麼看怎麼怪
echo $sql; 第一頁是正常的 ex :SELECT ROW_NUMBER() OVER(ORDER BY 產品編號
),產品編號
,品名規格
,單位
,倉庫編號
,倉庫名稱
,儲位
,現有庫存
,借入數量
,借出數量
,實際在庫量
FROM c0105_t
WHERE 品名規格
LIKE '%亮黑%'
echo [$result_c1][$result_c2][$result_c3]; 第一頁是正常的 ex :品名規格LIKE%亮黑%
第一頁之後都會報錯, $result_c1、$result_c2、$result_c3的值都是空的
$result_c1$result_c2 '$result_c3' 是為了抓取上一個頁面的POST所設的變數,不知道這樣寫對不對@@
$result_c1 = $_POST['req1']; //取得表單資料
echo "$result_c1";
$result_c2 = $_POST['req2']; //取得表單資料
echo "$result_c2";
$result_c3 = $_POST['req3']; //取得表單資料
if($result_c2 != "LIKE"){
$result_c3 = $result_c3;
} else {
$result_c3 = "%$result_c3%";
}
echo "$result_c3";
↑從這裡來的
錯誤訊息也看不到
資料內容值也看不到
我學藝不精幫不上忙
要期待別的高手出手了...
真的非常抱歉!!!是我說的不夠清楚,以下是選擇第一頁之外頁數的錯誤訊息:
Warning: Undefined array key "req1" in D:\xampp\htdocs\website_test\condb_test7_choose3.php on line 16
Warning: Undefined array key "req2" in D:\xampp\htdocs\website_test\condb_test7_choose3.php on line 18
Warning: Undefined array key "req3" in D:\xampp\htdocs\website_test\condb_test7_choose3.php on line 21
SELECT ROW_NUMBER() OVER(ORDER BY 產品編號
),產品編號
,品名規格
,單位
,倉庫編號
,倉庫名稱
,儲位
,現有庫存
,借入數量
,借出數量
,實際在庫量
FROM c0105_t
WHERE `` ''
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' at line 1 in D:\xampp\htdocs\website_test\condb_test7_choose3.php:92 Stack trace: #0 D:\xampp\htdocs\website_test\condb_test7_choose3.php(92): mysqli_query(Object(mysqli), 'SELECT ROW_NUMB...') #1 {main} thrown in D:\xampp\htdocs\website_test\condb_test7_choose3.php on line 92
資料方面因為算是機密資料,所以不太方便透漏,非常抱歉
以下是form的部分 :
echo '<form action="condb_test7_choose3.php" method="post">';
echo '<p>搜尋條件 :';
echo '<label for="c1"></label>';
echo '<select name="req1" placeholder="欄位">';
echo '<option value="產品編號">產品編號</option>';
echo '<option value="品名規格">品名規格</option>';
echo '<option value="單位">單位</option>';
echo '<option value="倉庫編號">倉庫編號</option>';
echo '<option value="倉庫名稱">倉庫名稱</option>';
echo '<option value="儲位">儲位</option>';
echo '<option value="現有庫存">現有庫存</option>';
echo '<option value="借入數量">借入數量</option>';
echo '<option value="借出數量">借出數量</option>';
echo '<option value="實際在庫量">實際在庫量</option>';
echo '</select>';
echo '<label for="c2"></label>';
echo '<select name="req2">';
echo '<option value="=" selected>等於/是(資料全部文字)</option>';
echo '<option value="LIKE">是(資料部分文字)</option>';
echo '<option value=">">大於</option>';
echo '<option value=">=">大於等於</option>';
echo '<option value="<">小於</option>';
echo '<option value="<=">小於等於</option>';
echo '<option value="<>">不等於(不是)</option>';
echo '</select>';
echo '<input type="text" name="req3" placeholder="值">';
echo '<button name="send">搜尋</button></p>';
echo '</form>';
這是form的樣子
上面的form
第一個下拉式選單是$_POST['req1']也就是$result_c1
第二個下拉式選單是$POST['req2']也就是$resultc2
最後一個是$POST['req3']也就是$resultc3
按下"搜尋"會轉跳到有錯誤訊息的php
這次的訊息看得很清楚
SELECT ROW_NUMBER() OVER(ORDER BY 產品編號),產品編號,品名規格,單位,倉庫編號,倉庫名稱,儲位,現有庫存,借入數量,借出數量,實際在庫量 FROM c0105_t WHERE `` ''
問題就是「因為 req1,req2,req3 都是空值造成 SQL 語法錯誤」
只要找出為什麼 req1,req2,req3 是空值的原因
就可以解決問題
這裡使用$_POST
(用 POST 方法接參數)
$result_c1 = $_POST['req1']; //取得表單資料
而這裡又這麼寫(用 GET 方法傳參數)
echo " 頁 <a href=?page=".$pages.">末頁</a><br /><br />";
如果你的「第二頁」是點上面這部份的連結的話
那就只會有(用 GET 方法接參數)的$page = intval($_GET["page"]); //確認頁數只能夠是數值資料
收得到資料
看來應該是這個問題了
1.選擇 req1,req2,req3
2.決定後按按鈕(以POST方法送出參數)echo '<form action="condb_test7_choose3.php" method="post">';
3.以POST接參數$result_c1 = $_POST['req1']; //取得表單資料
,成功查詢
4.點超連結至第二頁(以GET送出參數)echo " 頁 <a href=?page=".$pages.">末頁</a><br /><br />";
5.以POST接參數$result_c1 = $_POST['req1']; //取得表單資料
,全部是空值,組成 SQL 語法錯誤,完全無法查詢出資料
非常感謝大大還願意花時間幫我!!!我在google查了一下這方面的資料,發現需要使用ajax來做分頁(不知道有沒有理解錯),完全沒學過XD我再自己查資料看看怎麼寫,謝謝大大幫忙!!!
一般是這麼比較的
1.傳統頁面(整頁取代) vs AJAX(只換部份頁面)
2.資料不分頁 vs 資料分頁
3.用 POST 送收資料 vs 用 GET 送收資料
若用西餐的menu來比喻
以上三項就像沙拉、湯、前菜
各自選各自的,彼此間沒有因果關係也沒有必然關係
祝你好運
直白點說
不管是否使用 ajax
不管是否要分頁/不分頁送資料用什麼 POST/GET 收資料就要用一樣的 POST/GET
原來如此,謝謝大大解說!!!我試試把換頁改成POST形式
後來我全部改成GET,可是$result_c1、$result_c2、$result_c還是抓不到值@@
照你的程式來看,用 GET 的寫法的話
得寫成類似這樣
http ://url?page=2&req1=品名規格&req2=LIKE&req3=亮黑
才會抓得到值
非常感謝海綿寶寶大大!!!!!其他頁都順利出來了,真的太感謝了!!不過SELECT那裡莫名跑出很多%
SELECT ROW_NUMBER() OVER(ORDER BY 產品編號
),產品編號
,品名規格
,單位
,倉庫編號
,倉庫名稱
,儲位
,現有庫存
,借入數量
,借出數量
,實際在庫量
FROM c0105_t
WHERE 品名規格
LIKE '%%%%%亮黑%%%%%'
XD
$result_c3 = $_POST['req3']; //取得表單資料
if($result_c2 != "LIKE"){
$result_c3 = $result_c3;
} else {
$result_c3 = "%$result_c3%";
}
當 result_c2 是 LIKE 時
如果你把 result_c3「帶」到下一次呼叫
就會越串越多 % 了
可能的簡單改法
就是不要去改 result_c3
(使用 LIKE 時)在組合 SQL 時再加 % 就好, 大概像這樣
$sql = "SELECT ROW_NUMBER() OVER(ORDER BY `產品編號`),`產品編號`,`品名規格`,`單位`,`倉庫編號`,`倉庫名稱`,`儲位`,`現有庫存` FROM `c0105_t` WHERE `$result_c1` $result_c2 '%$result_c3%'";
不使用 LIKE 時維持現狀
$sql = "SELECT ROW_NUMBER() OVER(ORDER BY `產品編號`),`產品編號`,`品名規格`,`單位`,`倉庫編號`,`倉庫名稱`,`儲位`,`現有庫存` FROM `c0105_t` WHERE `$result_c1` $result_c2 '$result_c3'";
原來如此,謝謝海綿寶寶大大!!!真的非常非常感謝!!!先祝您新年快樂!