台灣最大程式設計社群網站
線上人數
740
 
會員總數:245116
討論主題:189028
歡迎您免費加入會員
討論區列表 >> PHP >> $_POST 值無法echo顯示出來 但卻可以當作變數執行SQL指令
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
$_POST 值無法echo顯示出來 但卻可以當作變數執行SQL指令
價值 : 50 QP  點閱數:2176 回應數:20

樓主

哇係阿孫
門外漢
0 1
30 6
發送站內信

大家好~
目前我在研究Arduino透過PHP傳送值
再將值透過SQL指令丟到資料庫


以上面的例子來說
$sql1 <---這個SQL指令執行成功 且得到的結果也是對的
但是echo $a <---網頁顯示是空的
後來我有加個判斷 如果$a==Null 則echo 'Null' 否則 echo 'not Null'
執行後網頁顯示'Null'
覺得有趣的地方是 如果$a真的是Null
那sql的指令怎麼可以執行成功 且也有更新到我要更新的欄位....
Arduino POST過來的值 Content-Type是: application/x-www.-form-urlencoded

不知道各位大大們有沒有遇過類似的經驗
希望大大們可以指點迷津 感謝~"~


搜尋相關Tags的文章: [ POST ] , [ SQL ] , [ Arduino ] ,
本篇文章發表於2016-11-24 12:04
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
我是建議你,先輸出$sql1來看看吧。看他的sql命令是長怎麼樣的。

我想你這並非是正確的程式碼。
正常來講。如果$a=NULL的話。這段sql碼的確會報錯才對。

如果說你目前這段程式碼。然後不給post值的情況下。不報錯還可以運行
我只能說見鬼了。

但依照你的說明,看起來是沒報錯,但不是目前這樣的程式碼。那就只能請你提供一下正確的程式碼再來說明了
本篇文章回覆於2016-11-24 14:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

哇係阿孫
檢舉此回應



說明如上~~~~
我能確定POST過來的值都有成功在資料庫上更新

我在中間很多地方都嘗試用echo來測試 就是不給echo...
但是 SQL指令完全可以成功執行~~
以結果論來說 或許是OK的
不過我現在的需求 是得echo出我要的欄位= =

附帶一提 如果SQL指令是:SELECT * FROM database WHERE id = 2
像這樣 把後面的id給死
就可以成功echo出來
覺得 鬼打牆=0=

本篇文章回覆於2016-11-24 15:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

彩虹
檢舉此回應
你有確認一下前一頁form method是post還get嗎?
如果你沒有打method的話,預設會是get,你這邊就要改成$_GET["id"]來做接收

你檢查這邊到底是get還是post還是空值
<form action="insert.php" method="post">

本篇文章回覆於2016-11-24 17:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

彩虹
檢舉此回應
沒事,你應該是有設定method="post"沒錯,因為你其他欄位抓的

那你應該去檢查前一頁的 <input type="text" name="id" value="這邊你有放值進去嗎?">


我覺得你可以提供完整的程式碼給我們開一下 (含html form)
本篇文章回覆於2016-11-24 17:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

哇係阿孫
檢舉此回應
不好意思...
因為我前面不是透過form來POST值進來
應該說 不是透過網頁
而是透過一個叫做Arduino的電子零件
它的GET跟POST方法差不多
只是程式碼的上面 畢竟不同的平台
會有相對的差異~
我能確定值有POST過來的依據是因為我更改Arduino要POST的值
資料庫的確有作更改 且也是更改為POST過來的值

所以我覺得是因為透過Arduino 而不是透過form 才導致這個原因
只是 很奇怪...
在我想echo之前 整個程式都如預期順利跑出我要的結果 資料庫也有更新
最後要echo才發現 咦 怎麼會是空值...
如果真是空值 怎麼又可以執行SQL指令

然後我就鬼打牆了XD"
本篇文章回覆於2016-11-24 18:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

clouding
捐贈 VP 給 clouding 檢舉此回應
你要不要用 var_dump() 測試變數看看
不要用echo
本篇文章回覆於2016-11-24 18:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
話說為什麼不試試星空大說的
將你所有執行的SQL輸出看看實際執行的到底是什麼?
本篇文章回覆於2016-11-25 09:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
幾個觀念告訴你好了

1.要debug,也debug好重點。覺得資料庫有問題。為何不先將sql的字串丟出來看一下語法正確與否呢??

2.程式sql語法這樣操做~~~有點無言。其實只要

這樣就可以解決一大半的寫法了。還寫入再撈資料判斷!!!怎麼看怎麼奇怪。

3.先看看是不是有將出錯訊息給關了。因為我再怎麼看,這都該有錯誤訊息才對


本篇文章回覆於2016-11-25 10:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

哇係阿孫
檢舉此回應
TO clouding大大:
用var_dump($a)測試後出來的值還是NULL@@
謝謝提供方法~

TO 迷路大大:
這個php會接收到Arduino傳來的"temperture"跟"id"POST過來的這兩個欄位的值~
我這邊測試 不管是用個變數去接 例:$a=$_POST[id]
或者直接用$_POST["id"]當變數使用
拿$a 或是拿$_POST["id"] 都是可以放入SQL指令執行且資料庫也有做更新
所以才沒有特別留意SQL這邊~
假設temperature=25 id=7777 <---透過Arduino POST到這個php
會先把id=7777的資料裡面 把celsius欄位資料變成25
接著搜尋一樣id=7777的資料 判斷celsius這個值 如果>=24
那就把id=7777的資料裡面 sensor值更新為1
否則 sensor值為0
目的:如果溫度>=24度 就會亮LED燈<---sensor=1
如果溫度<24度 就會關LED燈<----sensor=0
目的也已達成~


TO星空大大:
1.資料庫跟SQL指令都沒問題 因為執行後的結果 完全達到我的目的 且沒跳出任何錯誤訊息~

2.因為我是先測試是否能從Arduino接到值並且更新資料庫 確定ok才開始加判斷 所以語法上面可能較為粗略 謝謝大大提供的方法!


順帶一提
這邊看不到搜尋sensor這個欄位的SQL指令
因為我放在另一個php (假設是b.php好了)
b.php這邊很單純:
$sql = select * from database where id = 7777 <--這邊id給死
$result = mysql_query($sql);

while($row = mysql_fetch_array($result))
{
echo $row["sensor}; <---只要能讓php echo值 Arduino就能直接判斷這個值 1=開燈 0=關燈
}

如果今天只有一個Arduino 那其實就沒什麼大問題~
可是如果今天有100個Arduino 那我得有100個b.php才能完成需求.........
我有試過用兩個Arduino同時連接a.php(就是上面鬼打牆的那個...)
不會互相衝到或更新錯欄位 也沒有開錯燈的問題XD

所以才想把b.php這裡的程式碼 放到a.php 並且將b.php的id變成變數(也就是$a)
但是如果這麼做 就沒辦法echo $row["sensor]......

select * from database where id = 7777 <---這樣可以echo $row["sensor]且是正確的值
select * from database where id = ".$a." <---這樣echo $row["sensor]是空值....

發現上述問題 我才回頭測試$a = $_POST["id"]; echo $a;
才發現怎麼會是空值QQ"
可是 a.php執行結果又是完全正確的
就只差不能echo我要的欄位=_=

感謝大大們的指教~
小弟會繼續測試QQ



本篇文章回覆於2016-11-25 11:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
既然你發現echo變數值得到的都是NULL
那麼以該變數為條件的資料庫更新卻能正常執行,你不覺得很詭異??
把SQL輸出出來看看資料庫到底執行了些甚麼,這難道很奇怪??
要是發現資料庫指令執行的條件也是空值時
是不是代表其實根本不是這支檔案去更新資料庫,真正讓資料庫取得正確值的是另有程式
本篇文章回覆於2016-11-25 13:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

彩虹
檢舉此回應
把sql指令印出來很看一下很難嗎?


我也不知道你沒必要在乎 id 給死不給死的問題
你的$_POST['id']根本沒東西,把沒有值的$_POST['id']在丟到$a變數裡,你覺得$a會有東西嗎??


本篇文章回覆於2016-11-25 14:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
以前我會這樣做(現在沒在寫PHP了),
在echo的時候 加上一個字串...這樣能明白到底是沒印出來,還是空值。
e.g.

本篇文章回覆於2016-11-25 14:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

哇係阿孫
檢舉此回應
TO 各位大大:

SQL指令印出來 果不其然是空值
$a=777 當然知道這樣一定可以 因為我測試過了~

我跟各位想的都一樣 既然是空值 怎麼可能會執行SQL指令 而且還更新到正確資料
現在各位一定會認為 $a是空值 $_POST["id"]是空值 我這邊echo出來 也的確是空值 連我自己也覺得是空值...
但是 $_POST["id"] 就是有接到值 就是有更新到資料庫~
我用$a = $POST["id"] 用$a拿去執行SQL 一樣~

Arduino那邊也會透過URL指令要執行哪個.php
所以不會有其他程式幫忙完成的問題~
實際上也只有a.php跟b.php

我相信 如果是用form表單POST過來 基本上不會有問題 因為網路上一堆範例~
所以我自己是認為 透過Arduino來POST值 是不是有其他技術上的問題
網路上有教如何讓Arduino的資料透過PHP更新到資料庫或者讀取資料庫
但是目前沒看到有類似我這樣的問題(不能透過POST傳過來的變數放入SQL指令 echo我要的欄位)

我會先往Arduino的方向試著找出問題
也謝謝各位大大提供debug的方法~

我先作個保證
以上情況 屬實........
沒有刻意問一個鳥問題來呼巄各位=_=
本篇文章回覆於2016-11-25 14:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
<?php
echo 'post=';
print_r($_POST);
echo 'get=';
print_r($_GET);
?>
先讓你的Arduino來跑看看會出現怎麼樣的訊息。我們再來討論空不空值的問題吧。

其實你已經有將問題找出來了。只是你著手錯了地方。

大家也都知道。其實我目前有幾個點倒是可以提供給你參考

1.目前可以確定的是程式這堣@定沒什麼大問題,所以我初估判斷是來源端的問題
這也是我為何要你先用表單來處理。你也確定用表單是沒問題的。

2.已經知道是發送端的問題,現在就是要得知道發送端到底是發送了什麼。
由於不知道他是用何種物件或模式來做發送。也不確定他是否真的就能post資料過來。
所以會先叫你用上面的程式碼來判斷他的值到底是什麼。送了什麼值過來。
也就是denug已經de到來源端這邊了

3.我認為你有將錯誤回報的功能給關了。要不能正常來說。
光是 「select * from database where id = 」這樣的sql語法,就因該會報「語法錯誤」的錯誤訊息出來才對。

4.最後~~~~可以追加以下語法。先建立一個test表。堶悼u放了num欄位。用int。預設先0
然後再每一次下sql命令時追加
update test SET num=num+1
運行一次後,再看看他的數字+了幾個。
這樣就可以借此來判斷你的Arduino可能呼叫了幾次

最後給你一句話。認真來說,大家都再告訴你該如何去debug。你不想照做或是覺得這是不可能的事而不想去試。
其實這是很要不得的。
每個程式設計師都存在著一種肓點。都有自已的自尊跟堅持。
我以前也是這樣。但是後來受人指點之後。就算人家跟我說1+1不等於2。我雖然覺得不可能。但也是會照著他們教的方式去做一下基本的測試
果不其然真的是1+1不等於2。(真是這樣還真見鬼了)
以上我是用比較極端的範例來說明。相信自已是很好。但有時也要注意自已是不是進入了某種肓點。
就像是你掛了太陽眼睛但將他忘了,一直再跟人家說不夠亮不夠亮。人家對你說明明就很亮了。你還是覺得不夠亮。
因為對方不會知道你帶著太陽眼鏡。而你自已又忘記了。就會陷入了一種肓點的存在。
本篇文章回覆於2016-11-25 15:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

哇係阿孫
檢舉此回應
TO 星空大大:

Arduino不吃PHP語法 所以我用Arduino的方式來print
但是Arduino的部分 我只能print出由b.php傳回來的sensor值 print出的結果不是1就是0
且Arduino也是依此來判斷開燈或關燈 所以我認為透過b.php取到sensor欄位值的功能應該沒問題(這邊是用GET取得)
b.php 只要 <?php echo x; ?> Arduino用GET就能接到x 然後我在Arduino判斷x來作出開燈或關燈

Arduino POST到a.php的部分 我只能從a.php這邊來測試是否有取到值
一開始我直接用SQL指令 並且直接在指令裡面放入$_POST來執行 是沒問題的
所以我下意識覺得SQL這邊是OK的 但我沒有故意不去測試大家提供的debug方法~
或許是我不小心放錯重點 或許是我搞錯敘述
但我很樂意接收大家提供的方法 畢竟我本來功力就不夠~(剛接觸一個月的菜鳥QQ)
就算不能解決眼前的問題 未來或許也會用到
若有不妥的地方 除了先跟大家致歉以外 還請大家指教~


錯誤回報的部分 我是沒有更動過php.ini 如果預設是不會回報的話 我再確認看看

num + 1 這邊我測試過 跟我想的一樣 會每秒+1
因為Arduino每秒會傳當前溫度值跟id值過來到a.php
然後每秒會透過b.php接收sensor這個欄位的值 判斷是否開燈
也就是說 Arduino會一直loop 直到斷電(因為它是電子零件~)
我有試過 改為10秒傳送跟接收1次 因為想說是不是loop太快
測試結果 還是空值~然後資料庫的資料更新變慢~

這個問題感覺就是個 1+0=2的概念="=
本篇文章回覆於2016-11-25 17:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.