iT邦幫忙

0

Uncaught mysqli_sql_exception 問題

2024 2022-01-13 17:06:203673 瀏覽
  • 分享至 

  • xImage

各位大大好,我想用使用表單取得使用者想設定的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);

	?>

看更多先前的討論...收起先前的討論...
Felix iT邦研究生 2 級 ‧ 2022-01-13 17:42:12 檢舉
MySQL 有 ROW_NUMBER 函數?
2024 iT邦新手 5 級 ‧ 2022-01-14 17:19:15 檢舉
謝謝您,我學MySQL不久,所以也不太確定,但是把ROW_NUMBER() OVER(ORDER BY `產品編號`) 刪掉不做排序也會出現一樣的錯誤訊息
Felix iT邦研究生 2 級 ‧ 2022-01-14 19:36:09 檢舉
這是因為程式執行到 SQL 前就出錯了。
2024 iT邦新手 5 級 ‧ 2022-01-17 09:29:17 檢舉
請問大大,是POST那邊寫錯了嗎?但是第一頁資料能正常執行蠻神奇的@@
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2022-01-13 22:08:41
最佳解答

這篇寫 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 到底是什麼原因
才可對症下藥

看更多先前的回應...收起先前的回應...
2024 iT邦新手 5 級 ‧ 2022-01-14 17:21:34 檢舉

謝謝您,我試試看您的方法,感謝!

2024 iT邦新手 5 級 ‧ 2022-01-24 14:43:52 檢舉

目前推測是第一頁之後

$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'怎麼看怎麼怪
/images/emoticon/emoticon06.gif

2024 iT邦新手 5 級 ‧ 2022-01-24 15:59:49 檢舉

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";		

↑從這裡來的

錯誤訊息也看不到
資料內容值也看不到
我學藝不精幫不上忙
要期待別的高手出手了...

2024 iT邦新手 5 級 ‧ 2022-01-24 17:30:23 檢舉

真的非常抱歉!!!是我說的不夠清楚,以下是選擇第一頁之外頁數的錯誤訊息:
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的樣子
https://ithelp.ithome.com.tw/upload/images/20220124/20145441V5no2MDlpx.jpg

上面的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 語法錯誤,完全無法查詢出資料

2024 iT邦新手 5 級 ‧ 2022-01-25 10:15:06 檢舉

非常感謝大大還願意花時間幫我!!!我在google查了一下這方面的資料,發現需要使用ajax來做分頁(不知道有沒有理解錯),完全沒學過XD我再自己查資料看看怎麼寫,謝謝大大幫忙!!!

一般是這麼比較的
1.傳統頁面(整頁取代) vs AJAX(只換部份頁面)
2.資料不分頁 vs 資料分頁
3.用 POST 送收資料 vs 用 GET 送收資料
若用西餐的menu來比喻
以上三項就像沙拉、湯、前菜
各自選各自的,彼此間沒有因果關係也沒有必然關係

祝你好運

直白點說
不管是否使用 ajax
不管是否要分頁/不分頁
送資料用什麼 POST/GET 收資料就要用一樣的 POST/GET

2024 iT邦新手 5 級 ‧ 2022-01-26 09:34:35 檢舉

原來如此,謝謝大大解說!!!我試試把換頁改成POST形式

2024 iT邦新手 5 級 ‧ 2022-01-27 15:04:24 檢舉

後來我全部改成GET,可是$result_c1、$result_c2、$result_c還是抓不到值@@

照你的程式來看,用 GET 的寫法的話
得寫成類似這樣
http ://url?page=2&req1=品名規格&req2=LIKE&req3=亮黑
才會抓得到值

2024 iT邦新手 5 級 ‧ 2022-01-27 17:47:52 檢舉

非常感謝海綿寶寶大大!!!!!其他頁都順利出來了,真的太感謝了!!不過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「帶」到下一次呼叫
就會越串越多 % 了
/images/emoticon/emoticon59.gif

可能的簡單改法
就是不要去改 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'";
2024 iT邦新手 5 級 ‧ 2022-01-28 10:49:59 檢舉

原來如此,謝謝海綿寶寶大大!!!真的非常非常感謝!!!先祝您新年快樂!

/images/emoticon/emoticon59.gif

我要發表回答

立即登入回答