[請益] Ajax傳值到後端問題

看板Soft_Job作者 (firetim)時間3年前 (2020/10/21 23:39), 3年前編輯推噓8(8050)
留言58則, 16人參與, 3年前最新討論串1/1
各位大神好: 這兩天自己用Google Map API 弄一個地址查詢 在做連動式下拉選單時抓不到 Ajax 傳的值 不論用$request, $_GET 或 $_POST 裡頭都是空的 Ajax 用GET 或 POST 傳都一樣 而我自己在後端固定抓某筆資料庫的資料以 JSON 傳送 或是傳一筆假資料以 JSON 傳送又是成功能送回前端使選單連動 但就是改回由收到 Ajax 送的來資料再進資料庫找就會失敗 Ajax 那裡自己用 console.log('city') 確實是有東西的 已經困兩天了,找了好多網站和能問的人也是沒解 不曉得問題出在哪?有點開始懷疑是不是作業系統的編碼問題 ---------------- 以下是東西的Github https://github.com/snowtim/damaiquiz_googlemap Ajax 寫的部分在/resources/views/googlemap.blade.php 裡面 第105行開始 後端寫在/app/Http/Controllers/AddressController.php裡面 citylinkarea 那個 function 將 Ajax 引到 controller 的 route 寫在/routes/web.php 當中Route::post('/citylinkarea, ..........) 那行 作業系統:Ubuntu 後端 語言:PHP 資料庫:MySQL 框架:Laravel 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.224.206.23 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1603294796.A.19A.html

10/21 23:54, 3年前 , 1F
php fpm 預設首頁不是有範例?
10/21 23:54, 1F

10/22 00:01, 3年前 , 2F
你要不要直接說是哪一個檔案哪一行code?
10/22 00:01, 2F
忘記了~已補上 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 00:18:40

10/22 00:30, 3年前 , 3F
ajax的data先用JSON.stringfy試試看
10/22 00:30, 3F

10/22 00:32, 3年前 , 4F
然後其實有php版跟ajax版比較適合問
10/22 00:32, 4F

10/22 00:33, 3年前 , 5F
你有沒有開csrf token?
10/22 00:33, 5F
有哦~我有開

10/22 00:33, 3年前 , 6F
打錯了 更正JSON.stringify
10/22 00:33, 6F
還是一樣,不管是GET或POST都同樣情形,就是當後端回傳值寫死能正常回傳 只要改回非寫死的話,除了POST我沒辦法用window.location進去看,會跑出 The GET method is not supported for this route. Supported methods: POST. 還有POST非寫死後端傳回來會出現 http://127.0.0.1:8000/citylinkarea 500 (Internal Server Error)詢息外 GET就是單純沒變化,然後同樣都會執行寫在Ajax的error情形詢息 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 01:25:33

10/22 01:35, 3年前 , 7F
沒寫過laravel 但是我看你取參數的方法跟官網寫的不太
10/22 01:35, 7F

10/22 01:35, 3年前 , 8F
中文的版本停在5,不過當時用過5.6和5.7自己的取法是可以的 然後現在Google Map這個是版本是8的,但下方另一個function還是可以取到

10/22 01:46, 3年前 , 9F
可惜偶4寫C#的,不然我之前專題也是弄串接Google Map API
10/22 01:46, 9F

10/22 01:46, 3年前 , 10F
然後用AJAX取值來動態改畫面呈現
10/22 01:46, 10F
地圖是可以出現,用寫死的假資料也能標出地點 現在卡在查詢地點這裡辦法繼續下去

10/22 01:47, 3年前 , 11F
ajax裡面的type改成method應該就可以我之前也是用type無效
10/22 01:47, 11F
謝謝~還是相同情況QQ~一直卡在這裡 後面的雖然有先寫不過沒辦法跑完全部 根本不知道還會有什麼問題QQ~ ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 02:03:05 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 02:05:12 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 02:05:42

10/22 02:26, 3年前 , 12F
弱弱的想請問一下,如果把 method的 request['city']
10/22 02:26, 12F

10/22 02:26, 3年前 , 13F
換成$request->city這樣呢
10/22 02:26, 13F
也可以哦~自己試過兩種都取得到 只是我的問題還是一樣 在citylinkarea的function裡加了一段$request['city']沒值的回傳詢息 結果都會跑到這一段去 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 02:34:02

10/22 02:35, 3年前 , 14F
建議你可以先在發送請求時看request的body
10/22 02:35, 14F

10/22 02:37, 3年前 , 15F
然後直接debug看request接收到了什麼東西
10/22 02:37, 15F
有~request的body都只有關於來源位址的資料 但就是沒Ajax送來的東西 換成看$_GET, $_POST裡頭也OA都是空的

10/22 02:37, 3年前 , 16F
先console一下post到api之前的body看有沒有問題、然
10/22 02:37, 16F

10/22 02:37, 3年前 , 17F
後再看一下傳到laravel的內容? 可能key的大小寫打錯
10/22 02:37, 17F

10/22 02:37, 3年前 , 18F
之類的XD
10/22 02:37, 18F
您是指在data這裡打成data:console.log({City: city})這樣嗎? 我這樣打過console出來是有東西的

10/22 02:37, 3年前 , 19F
因為我看你js的city的c是大寫php卻是用小寫取
10/22 02:37, 19F

10/22 02:40, 3年前 , 20F
data: {city: city} 大小寫?
10/22 02:40, 20F

10/22 02:42, 3年前 , 21F
Body是data: {City: city}
10/22 02:42, 21F

10/22 02:42, 3年前 , 22F
不過php裡面是request[‘city’] 感覺怪怪的
10/22 02:42, 22F
大小寫都有試過~不過還是一樣的情形 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 04:26:27

10/22 07:27, 3年前 , 23F
Controller的citylinkarea內
10/22 07:27, 23F

10/22 07:29, 3年前 , 24F
加個if($request->ajax()){}
10/22 07:29, 24F

10/22 07:29, 3年前 , 25F
把你其他原本寫的都寫在這裡面試試
10/22 07:29, 25F
謝謝~不過還是一樣,然後我進去看dd($request->ajax()),是false 會不會是少引入了什麼? ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 08:05:53 ※ 編輯: firetim (61.224.206.23 臺灣), 10/22/2020 08:09:32

10/22 08:12, 3年前 , 26F
最好大小寫保持一致。有時這種小坑會害你浪費好多天
10/22 08:12, 26F
謝謝您的提醒~一開始自己是寫一致的 後來一直試沒效才開始大小寫交叉寫想了解是不是有什麼地方是規定一定得大寫自己不知道

10/22 09:21, 3年前 , 27F
CORS? 有開 browser console 看 log 嗎
10/22 09:21, 27F
是指開發人員工具最下面那格嗎?自己知道能看的地方都有開, 不曉得這是不是您說的?

10/22 09:33, 3年前 , 28F
還有一個問題是,你的HTML select option 只有給他te
10/22 09:33, 28F

10/22 09:33, 3年前 , 29F
xt 沒有設定value?
10/22 09:33, 29F

10/22 09:33, 3年前 , 30F
<option value=‘’>{{ $city->city}}<option>
10/22 09:33, 30F

10/22 09:33, 3年前 , 31F
然後下面用.val()
10/22 09:33, 31F

10/22 09:34, 3年前 , 32F
還是就是要拿text而已 那當我沒說XD
10/22 09:34, 32F
謝謝您~這裡的確是自己沒弄好,已經改了

10/22 12:05, 3年前 , 33F
官方文件有寫 $request->input('name')
10/22 12:05, 33F

10/22 12:06, 3年前 , 34F
然後雖然自己寫的專案沒差,但還是建議加個 validator
10/22 12:06, 34F

10/22 12:07, 3年前 , 35F
$request->ajax() 是判斷 request 種類,回 bool 正常
10/22 12:07, 35F
原來是這樣~了解了 官方文件寫的$request->input('name')我當時也有這樣寫過,但狀況一樣 所以當下覺得應該是在東西傳到後端這部分有問題,不過一直當時找不出原因 validator因為這個東西有時間壓力所以想說至少要把功能做出來 等功能OK我再回來補一些接收資料處理的間題,謝謝

10/22 12:53, 3年前 , 36F
用網址帶參數的方式測試$_GET能否取值(query parameter)
10/22 12:53, 36F

10/22 12:56, 3年前 , 37F
用$_POST的話要注意雖然method都是post 但ajax跟html for
10/22 12:56, 37F

10/22 12:56, 3年前 , 38F
m submit出去的request格式不一樣
10/22 12:56, 38F

10/22 12:56, 3年前 , 39F
不過記得laravel已針對這點處理過了
10/22 12:56, 39F
嗯~謝謝,最後有找到問題了~ssccg大的解答

10/22 13:09, 3年前 , 40F
問題解決了嗎,沒用過Laravel,查了一下網路資料
10/22 13:09, 40F

10/22 13:10, 3年前 , 41F
web.php只有Route::post('/citylinkarea'
10/22 13:10, 41F

10/22 13:11, 3年前 , 42F
所以用get method拒絕是合理的吧
10/22 13:11, 42F

10/22 13:12, 3年前 , 43F
另外Laravel官方文件說會以json array的方式回覆
10/22 13:12, 43F

10/22 13:14, 3年前 , 44F
AddressController.php寫死的範例看來是json array
10/22 13:14, 44F

10/22 13:14, 3年前 , 45F
從DB撈的部分原PO自行確認有沒有轉換
10/22 13:14, 45F

10/22 13:33, 3年前 , 46F
應該說data是array回覆的話,content-type會自動是
10/22 13:33, 46F

10/22 13:34, 3年前 , 47F
application/json,不用自己處理,其端才能正確解析
10/22 13:34, 47F
解決了~配合您和ssccg大的解答已弄出來T T 謝謝您

10/22 14:45, 3年前 , 48F
首先你的ajax的request的ontent-type要設成json
10/22 14:45, 48F

10/22 14:48, 3年前 , 49F
$.ajax的dataType是預期response的type (Accept header)
10/22 14:48, 49F

10/22 14:49, 3年前 , 50F
要用contentType: 'application/json'
10/22 14:49, 50F

10/22 14:56, 3年前 , 51F
然後同上面有人提過的,要看實際送出的HTTP request,要看
10/22 14:56, 51F

10/22 14:57, 3年前 , 52F
瀏覽器開發者工具的Network那頁
10/22 14:57, 52F

10/22 14:58, 3年前 , 53F
會發現照你的$.ajax寫法,送出的Content-Type是application
10/22 14:58, 53F

10/22 14:58, 3年前 , 54F
/x-www-form-urlencoded,Body的內容是JSON沒錯,但是在這
10/22 14:58, 54F

10/22 14:59, 3年前 , 55F
種Content-Type下body的格式是key1=value1&key2=value2...
10/22 14:59, 55F

10/22 15:00, 3年前 , 56F
會解析成整個JSON字串是key對應到空白value
10/22 15:00, 56F

10/22 15:27, 3年前 , 57F
是說我不確定你最早的版本長怎樣,以現在的來說其實沒必要
10/22 15:27, 57F

10/22 15:34, 3年前 , 58F
Request用json(不要JSON.stringfy),預設的方式就好
10/22 15:34, 58F
感謝ssccg大~問題確實出在應該用contentType: 'application/json' 我最一開始版本是用dataType: "JSON",不過當時一樣沒有用 我放上去的是弄一段時間休息就傳上去的 目前連動已經可以了~謝謝~ 感謝上面各位的幫忙!!也讓我多學到不少,為了這個弄了好多天QQ~ ※ 編輯: firetim (36.235.51.151 臺灣), 10/23/2020 01:55:18 ※ 編輯: firetim (36.235.51.151 臺灣), 10/23/2020 01:58:16
文章代碼(AID): #1Va5PC6Q (Soft_Job)