iT邦幫忙

0

AJAX Edge可以run,Chrome卻不行

各位前輩大家好,
小弟是程式菜鳥,目前正在學PHP
小弟參考網路上前輩的程式寫了一個AJAX三層連動
但是這個程式在Edge可以run,不過在Chrome卻沒反應,不知是那邊有問題/images/emoticon/emoticon06.gif

<select name="form_cory" id="form_cory">
                                <option>請選擇第一類</option>
                                <?php
                                $query_country = "SELECT csc_id, csc_cory FROM cs_cory";
                                $cory_resut = $db_link->query($query_cory);
                                while ($cory_row_result = $country_resut->fetch_assoc()){ ?>
                                    <option vaule="<?php echo $cory_row_result['csc_id'];?>"><?php echo $cory_row_result['csc_cory']?></option>
                                <?php } ?>
                            </select>&nbsp
                            <select name="form_parts" id="form_parts">
                                <option>請選擇第二類</option>
                            </select>&nbsp
                            <select name="form_reg" id="form_reg">
                                <option>請選擇第三類</option>
                            </select>
                            <script>
                                $(document).on('change', '#form_cory', function(){
                                var csc_cory = $('#form_cory :selected').val();
                                    $.ajax({
                                        url:"select_global.php",
                                        method:"POST",
                                        data:{
                                            form_cory:csc_cory
                                        },
                                        success:function(result){
                                            $('#form_parts').html(result);
                                        }
                                    })//end ajax
                                    $(document).on('change', '#form_parts', function(){
                                    var csg_part = $('#form_parts :selected').val();
                                        $.ajax({
                                            url:"select_global.php",
                                            method:"POST",
                                            data:{
                                                form_part:csg_parts
                                            },
                                            success:function(result1){
                                                $('#form_reg').html(result1);
                                            }
                                        })//end ajax
                                    });
                                });
                            </script>

接收AJAX的PHP為:

$form_cory = $_POST['form_cory'];
    $query_part = "SELECT distinct csg_parts FROM cs_global WHERE csg_cory = '$form_cory'";
    echo "query_parts = " . $query_parts;
    $parts_result = $db_link->query($query_parts);
    $result = "";//把準備回傳的變數result準備好
    while($part_row_result=mysqli_fetch_assoc($parts_result)){
    $result .= "
        <option value='{$part_row_result["csg_parts"]}'>{$part_row_result['csg_parts']}</option>
    ";//將對應的型號項目遞迴列出
    };
    echo $result;//將型號項目丟回給ajax

    //第三層-區選單
    $form_parts = $_POST['form_parts'];
    $query_region = "SELECT distinct csg_reg FROM cs_global WHERE csg_parts = '$form_parts'";
    $reg_result = $db_link->query($query_reg);
    $result1 = "";//把準備回傳的變數result準備好
    while($reg_row_result=mysqli_fetch_assoc($reg_result)){
    $result1 .= "
        <option value='{$reg_row_result["csg_reg"]}'>{$region_row_result['csg_reg']}</option>
    ";//將對應的型號項目遞迴列出
    };
    echo $result1;//將型號項目丟回給ajax

而Table資料如下:
https://ithelp.ithome.com.tw/upload/images/20210602/20126422T0qlveLQZO.png

小弟還有個疑問
就是當第一類有選擇物品時,第二類會接著連動,選擇第二類物品時,第三類也會接著連動
但是當第二類有物品,而同時第二類與第三類是空值時
第二類會連動,但是第三類卻不會連動/images/emoticon/emoticon02.gif
請問當遇到這種情形時,要如何讓所有階層都能連動呢?
請各位前輩指導,謝謝

看更多先前的討論...收起先前的討論...
F12一下看看是不是出現執行期間錯誤,盡量不要把PHP碼放在HTML裡避免增加追查的困難,把AJAX到的資料用json的方式傳遞給javascript試試
ommjki iT邦新手 5 級 ‧ 2021-06-03 07:43:54 檢舉
Japhenchen 您好:

小弟目前還不會使用框架,所以才會把html及php混在一起

而在Chrome檢查裡,有出現二個錯誤如下:
第一個錯誤-

firebug-lite.js:11885 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
對應到
// Getting the native XHR object so our calls won't be logged in the Console Panel
var xhr = FBL.getNativeXHRObject();
xhr.open("get", url, false);
xhr.send();

第二個錯誤-
[Deprecation] 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
對應到
val = insecureObject[name]; // getter is safe

但小弟完全看不出來到底是那邊出問題

而您說用json方式傳遞給javascript,因小弟完全是菜鳥生手,不知要如何用json傳遞,是在ajax的變數中加上

dataType: "json",

小弟試了,只剩第一個錯誤
再加了之後,Edge就不能連動了,在Edge下F12也沒有出現錯誤,
請問小弟是不是語法有錯,沒把資料往後送呢?
而第一個錯誤又要如何除錯呢?
請japhenchen及其他前輩不吝指導,謝謝
>echo $result;//將型號項目丟回給ajax
dataType應該要指定text

-------------------------------------------------------

dataType: "json",
後端要echo一個json
也就是先存進陣列
$return_data = array('result' => $result);
再轉成json
json_encode($return_data);
前面再解析並處理

詳細原理待其他大神解釋,我也還是個菜鳥

----------------------------------------------------------

再來基本上警告跟錯誤可能需要分清楚一點
以及直接整串google基本上都會有解
當然依照環境不同,有些還是需要多花些時間尋找
haward79 iT邦新手 3 級 ‧ 2021-06-03 13:34:53 檢舉
把 php 跟 html 分離與框架並沒有直接關係,框架只是簡化東西,讓你寫起來輕鬆點而已。

基本上,應該是把 html 與 js 分開寫,然後在 html 用 script 標籤引入要執行的 js。
php 則是寫成 api,透過 ajax 呼叫 php 的 api。
淺水員 iT邦高手 3 級 ‧ 2021-06-03 14:25:39 檢舉
剛剛我把整個程式改好,但現在還不想直接給我改的程式碼
主要原因在於程式有很多不應該發生的錯誤

舉例來說 select_global.php 這個程式
先設定
$query_part = "SELECT distinct csg_parts FROM cs_global WHERE csg_cory = '$form_cory'";
再寫了
$parts_result = $db_link->query($query_parts);
一下有加 s 一下沒有加 s

很多地方都有類似的錯誤(變數名稱前後不一樣)
這怎麼可能在任何一個瀏覽器能正常執行?

請提問者把該改的錯誤先改好再發問吧

提示:
1. 偵錯可以善用 F12,然後看 network(網路)那個標籤,看送出去的參數或是回來的結果是不是跟預期一樣。
2. 把錯誤訊息打開:error_reporting(E_ALL)
ommjki iT邦新手 5 級 ‧ 2021-06-04 08:11:35 檢舉
謝謝archer9080 , haward79及淺法員三位前輩的指導,
小弟統一回覆
@archer9080:
小弟加了dataType=text後,Edge就不能連動了
至於JSON,因小弟還在剛摸索,所以等下階段再來學習;

@haward79:
您說的js用標籤引入,讓小弟終於有點明白japhenchen前輩所說的HTML及PHP都不要混入,才好Debug;

@淺水員;
小弟後來有再看程式,確實如您所說的
有部份變數設定不一致
現已修正如下方(不知小弟是否還有眼拙沒改到)
而小弟也有用F12看network
但是在Chrome上看不到送出去的參數或是回來的
不過在Edge上卻有看到回應是想要的
只不過回應會出現二次,不知這算正常嗎??

程式修正如下:
HTML部份:

<select name="form_cory" id="form_cory">
<option>請選擇第一類</option>
<?php
$query_cory = "SELECT csc_id, csc_cory FROM cs_global";
$cory_resut = $db_link->query($query_cory);
while ($cory_row_result = $cory_resut->fetch_assoc()){ ?>
<option vaule="<?php echo $cory_row_result['csc_id'];?>">
<?php echo $cory_row_result['csc_cory']?>
</option>
<?php } ?></select
>&nbsp
<select name="form_parts" id="form_parts">
<option>請選擇第二類</option></select
>&nbsp
<select name="form_reg" id="form_reg">
<option>請選擇第三類</option>
</select>
<script>
$(document).on("change", "#form_cory", function () {
var csc_cory = $("#form_cory :selected").val();
$.ajax({
url: "select_global.php",
method: "POST",
data: {
form_cory: csc_cory,
},
success: function (result) {
$("#form_parts").html(result);
},
}); //end ajax
$(document).on("change", "#form_parts", function () {
var csg_part = $("#form_parts :selected").val();
$.ajax({
url: "select_global.php",
method: "POST",
data: {
form_part: csg_parts,
},
success: function (result1) {
$("#form_reg").html(result1);
},
}); //end ajax
});
});
</script>

select_global.php部份:

$form_cory = $_POST['form_cory'];
$query_part = "SELECT distinct csg_parts FROM cs_global WHERE csg_cory = '$form_cory'";
$parts_result = $db_link->query($query_part);
$result = "";//把準備回傳的變數result準備好
while($part_row_result=mysqli_fetch_assoc($parts_result)){
$result .= "
<option value='{$part_row_result["csg_parts"]}'>{$part_row_result['csg_parts']}</option>
";//將對應的型號項目遞迴列出
};
echo $result;//將型號項目丟回給ajax

//第三層-區選單
$form_parts = $_POST['form_parts'];
$query_reg = "SELECT distinct csg_reg FROM cs_global WHERE csg_parts = '$form_parts'";
$reg_result = $db_link->query($query_reg);
$result1 = "";//把準備回傳的變數result準備好
while($reg_row_result=mysqli_fetch_assoc($reg_result)){
$result1 .= "
<option value='{$reg_row_result["csg_reg"]}'>{$reg_row_result['csg_reg']}</option>
";//將對應的型號項目遞迴列出
};
echo $result1;//將型號項目丟回給ajax

再請各位大大不吝指導
淺水員 iT邦高手 3 級 ‧ 2021-06-04 16:02:27 檢舉
你的資料表有改過,以下是你修改後,用到的三個 SQL 語句
SELECT csc_id, csc_cory FROM cs_global;
SELECT distinct csg_parts FROM cs_global WHERE csg_cory = '$form_cory';
SELECT distinct csg_reg FROM cs_global WHERE csg_parts = '$form_parts';

csc_cory 跟 csg_cory 有什麼不一樣嗎?
或是可以貼一下你 cs_global 的結構或範例嗎?也許資料表的設計上也要調整...
ommjki iT邦新手 5 級 ‧ 2021-06-05 21:37:47 檢舉
淺水員大大您好
csc_cory跟csg_cory是一樣的
小弟真的是眼拙沒改到@@"
還請各位前輩不吝指導,謝謝

尚未有邦友回答

立即登入回答