iT邦幫忙

0

SQL ? 語法相同 差別是主鍵!!!不懂意思..

  • 分享至 

  • xImage

圖1https://ithelp.ithome.com.tw/upload/images/20210618/20131917eTcZdSgEpx.jpg
圖2
https://ithelp.ithome.com.tw/upload/images/20210618/20131917FWStZHnJSE.jpg
圖3
https://ithelp.ithome.com.tw/upload/images/20210618/20131917jCf7Zp3Oj7.jpg
圖4
https://ithelp.ithome.com.tw/upload/images/20210618/2013191701DRXpt2l8.jpg
圖5
https://ithelp.ithome.com.tw/upload/images/20210618/20131917QygdVnRAcL.jpg

如圖1.圖2的方式跟圖6一樣
但是卻寫不進去...主鍵設定?
我已經設定尋找後ID沒有重複了阿 不就可當主鍵寫入資料表了嗎?
為什麼還是不能?
麻煩大大可以指點指點嗎...

通常主索引都是自動產生,在操作上自動產生的不會去上傳資料
如果你的索引是透過程式碼產生,那就不要在資料庫設定索引
sky800219 iT邦新手 5 級 ‧ 2021-06-21 09:47:53 檢舉
好的 謝謝大大!!
我欄位設錯><
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2021-06-18 23:43:01
最佳解答

先不說SQL Injection,
我看到的錯誤訊息是說你mysqli_error()函式用法錯誤,
你要查一下mysqli_error()的用法,
修正之後再來找問題.

看更多先前的回應...收起先前的回應...
sky800219 iT邦新手 5 級 ‧ 2021-06-18 23:58:35 檢舉

喔 那我整個理解錯方向一整下午..
老師說是主鍵問題..
所以我一直朝那方面去理解...

因為我看她錯誤顯示也是一列一列都有顯示出來..
指只是insert不進去的說...
就沒朝select去思考了!!

所以朝insert設定主鍵或是欄位錯誤去想想去思考好了..

小魚 iT邦大師 1 級 ‧ 2021-06-19 08:57:00 檢舉

先把錯誤的語法修正之後,
再來找原因吧.

sky800219 iT邦新手 5 級 ‧ 2021-06-19 11:22:37 檢舉

好的..謝謝大大 !!
我又找錯方向了><

小魚 iT邦大師 1 級 ‧ 2021-06-19 11:34:57 檢舉

一個程式如果會出現PHP原生的錯誤訊息,
這個程式的本身就是有問題的.

sky800219 iT邦新手 5 級 ‧ 2021-06-19 12:04:42 檢舉
連線成功
Notice: Undefined variable: mysqli in C:\xampp\htdocs\lhuregistrationX1\required.php on line 28

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\lhuregistrationX1\required.php:28 Stack trace: #0 {main}thrown in C:\xampp\htdocs\lhuregistrationX1\required.php on line 28

經由大大提醒 系統通知問題點了..
這樣好像比較有目標問題點了...
可是還在理解中= =

Call to a member function query() on null??
這樣迴圈他找不到!?
SQL找的到PHP寫不進去..
還是我資料庫沒設定好主鍵設定!?

小魚 iT邦大師 1 級 ‧ 2021-06-19 12:39:21 檢舉

如果是用Windows,
應該是php.ini沒有載入mysqli,
其實很多時候你可以把錯誤訊息丟到google,
就可以找到答案了.

但是你的28行是不是變了?

sky800219 iT邦新手 5 級 ‧ 2021-06-19 14:30:21 檢舉

應該是沒問題的..
"php.ini沒有載入mysqli,"
同資料庫...同樣設定...
所以可能向老師說得主鍵設定
關聯性 他沒辦法索引...

主鍵問題..
https://ithelp.ithome.com.tw/upload/images/20210619/20131917HwYyZXTf04.jpg

https://ithelp.ithome.com.tw/upload/images/20210619/20131917eUFsvTVbpN.jpg

抓得出來 可是沒關聯性 好像無法做其他動作..

為什麼depaertment有重複的...
當初老師還有辦法把它設為主鍵!!?

小魚 iT邦大師 1 級 ‧ 2021-06-19 17:22:26 檢舉

其實我不知道為什麼需要指定主鍵,
也可以直接使用AUTO_INCREMENT讓他自己長就好.

sky800219 iT邦新手 5 級 ‧ 2021-06-19 19:14:02 檢舉

AUTO_INCREMENT..了解
晚上來了解這個!!
好像不需要迴圈了
https://www.w3schools.com/sql/sql_autoincrement.asp
我試試看!! 謝謝大大!!

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-19 00:06:19

當程式執行結果不如預期
就會找原因

由於是 SQL 方面的問題
所以用 mysqli_error 看原因(或者線索)
而老師可能直接告訴你真正的原因

由於你的 mysqli_error 寫錯了
所以沒有發揮「提供錯誤原因線索」的功能
反而自己成為另一個錯誤

所以先解決 mysqli_error 的錯誤
就是
少傳一個參數
請看範例如下

// Perform a query, check for error
if (!mysqli_query($con,"INSERT INTO Persons (FirstName) VALUES ('Glenn')")) {
  echo("Error description: " . mysqli_error($con));
}
看更多先前的回應...收起先前的回應...
sky800219 iT邦新手 5 級 ‧ 2021-06-19 11:27:26 檢舉

好的..謝謝大大!!
又要理解一下了...

sky800219 iT邦新手 5 級 ‧ 2021-06-19 11:52:43 檢舉
<?php
	header('Content-Type: text/html; charset=utf-8');
	@require 'config.inc.php';
	//===============建立department資料表====================
	$sql="
SELECT (@SN:=@SN+1) as id,required ,CASE required 
WHEN '校必修' THEN 1 
WHEN '校選修' THEN 2 
WHEN '校選擇性必修' THEN 1 
WHEN '系專業必修' THEN 1
WHEN '系專業選修' THEN 2 
WHEN '系選擇性必修' THEN 1 
WHEN '院專業必修' THEN 1 
WHEN '院專業選修' THEN 2 
WHEN '院必修' THEN 1
WHEN '院訂必修' THEN 1 
ELSE 99 
END requiredID FROM (SELECT required FROM allmatch GROUP BY required ORDER BY required ) as Dummy1, 
(SELECT @SN:=0) as Dummy2 GROUP BY required 
";





	$result = mysqli_query($link_ID, $sql); //送出查詢
	
	if (!$mysqli -> query("INSERT INTO required (`id`, `requiredID`, `name`) VALUES ('".$id."',  '".$requiredID."' , '".$required."')")) {
    echo("Error description: " . $mysqli -> error);
}
	$required_index = mysqli_num_rows($result); //取得資料筆數
	for ($index=0; $index < $required_index; $index++){ 
		$requiredarr[$index] =  mysqli_fetch_array($result);	 //將資料存進陣列
	}
	for ($index=0; $index < $required_index; $index++){ 
		$id=$requiredarr[$index]['id'];
		$re=$requiredarr[$index]['requiredID'];
		$name=$requiredarr[$index]['required'];
		
		$sql="INSERT INTO `required`(`id`, `re`, `name`) VALUES ('".$id."',  '".$re."' , '".$name."')";
		echo $sql.'<br/>';
		if (!mysqli_query($link_ID, $sql)) {
			echo 'Error: ' . mysqli_error();
		}
	}

?>

顯示錯誤是if那邊

連線成功
Notice: Undefined variable: mysqli in C:\xampp\htdocs\lhuregistrationX1\required.php on line 28

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\lhuregistrationX1\required.php:28 Stack trace: #0 {main}thrown in C:\xampp\htdocs\lhuregistrationX1\required.php on line 28

call to member fuction on null ?
意思是找不到東西?

可是SQL找的到啊!!?
完蛋了 不知道問題點在哪..

靜下心來
這篇看清楚

mysqli_query 有兩種寫法,一般是二選一
if ($result = $mysqli -> query("SELECT * FROM Persons")) {
或是
if ($result = mysqli_query($con, "SELECT * FROM Persons")) {
而你的程式
卻在裡面同時出現兩種寫法

比較快的答案
就是改成 mysqli_query 那種(不是 $mysqli -> query 那種)

sky800219 iT邦新手 5 級 ‧ 2021-06-19 14:14:27 檢舉
$result = mysqli_query($link_ID, $sql); //送出查詢
	


    if ($result = mysqli_query($link_ID, $sql)) {
		echo "Returned rows are: " . mysqli_num_rows($result);
		  // Free result set
        mysqli_free_result($result);
}
        mysqli_close($link_ID);



  

	$required_index = mysqli_num_rows($result); //取得資料筆數
連線成功Returned rows are: 10
Warning: mysqli_num_rows(): Couldn't fetch mysqli_result in C:\xampp\htdocs\lhuregistrationX1\required.php on line 46

PHP顯示第一個ID找的答案是10列
代表資料沒錯
為什麼到"$required_index = mysqli_num_rows($result);"的時候

警告:mysqli_num_rows(): 無法在 C:\xampp\htdocs\lhuregistrationX1\required.php 第 46 行獲取 mysqli_result..

因為主鍵的設定?沒辦法讓他有關聯性對吧!?

sky800219 iT邦新手 5 級 ‧ 2021-06-19 14:30:39 檢舉

主鍵問題..
https://ithelp.ithome.com.tw/upload/images/20210619/20131917HwYyZXTf04.jpg

https://ithelp.ithome.com.tw/upload/images/20210619/201319172QwpGWru8x.jpg

抓得出來 可是沒關聯性 好像無法做其他動作..
為什麼depaertment有重複的...
當初老師還有辦法把它設為主鍵!!?

在這裡就把 result set free 掉了

// Free result set
mysqli_free_result($result);

之後要再$required_index = mysqli_num_rows($result);
自然讀不到 $result 了

sky800219 iT邦新手 5 級 ‧ 2021-06-19 19:30:37 檢舉
$result = mysqli_query($link_ID, $sql); //送出查詢
	


    if ($result = mysqli_query($link_ID, $sql)) {
		echo "Returned rows are: " . mysqli_num_rows($result);
		  // Free result set
    //    mysqli_free_result($result);
}
  //     mysqli_close($link_ID);



  

	$required_index = mysqli_num_rows($result); //取得資料筆數
	for ($index=0; $index < $required_index; $index++){ 
		$requiredarr[$index] =  mysqli_fetch_array($result);	 //將資料存進陣列
	}
	for ($index=0; $index < $required_index; $index++){ 
		$id=$requiredarr[$index]['id'];
		$re=$requiredarr[$index]['requiredID'];
		$name=$requiredarr[$index]['required'];
		
		$sql="INSERT INTO `required`(`id`, `re`, `name`) VALUES ('".$id."',  '".$re."' , '".$name."')";
		echo $sql.'<br/>';
		if (!mysqli_query($link_ID, $sql)) {
			echo 'Error: ' . mysqli_error();
		}
	}

PHP讀取時 系統顯示這裡錯誤 如圖 最下面兩行的IF語法

	$sql="INSERT INTO `required`(`id`, `re`, `name`) VALUES ('".$id."',  '".$re."' , '".$name."')";
		echo $sql.'<br/>';
		if (!mysqli_query($link_ID, $sql)) {
			echo 'Error: ' . mysqli_error();
		}
	}
連線成功Returned rows are: 10INSERT INTO `required`(`id`, `re`, `name`) VALUES ('1', '1' , '校必修')

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\lhuregistrationX1\required.php on line 61
 Error: INSERT INTO `required`(`id`, `re`, `name`) VALUES ('2', '2' , '校選修')

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\lhuregistrationX1\required.php on line 61
 Error: INSERT INTO `required`(`id`, `re`, `name`) VALUES ('3', '1' , '校選擇性必修')

https://ithelp.ithome.com.tw/upload/images/20210619/20131917XpI0kKjgr8.jpg

如圖我free關掉 close 也關掉了

mysqli_error() expects exactly 1 parameter, 0 given
這是我回答在上面的答案(mysqli_error())
證明
你根本沒看

sky800219 iT邦新手 5 級 ‧ 2021-06-21 09:47:26 檢舉

抱歉抱歉 謝謝大大!!!
原來一直都可以成功...
是欄位輸入錯誤!!
哀~~可以理解為什麼工程師會很辛苦了!!

如果問題解決了
就選個對你最有幫助的最佳解答
以進行結案動作

sky800219 iT邦新手 5 級 ‧ 2021-06-21 23:40:57 檢舉

謝謝...
以後要好好檢查編碼才對!!
一開始資料庫就不同 難怪語法不能work!!

我要發表回答

立即登入回答