2013-04-12 53 views
2

我正在使用jQuery/JS/Ajax腳本從我的數據庫動態填充SELECT框,每個後續的SELECT框都是基於前一個SELECT填充的。使用jQuery的動態鏈接選擇框

例如,有人從我的第一個SELECT中選擇'England',然後填充下一個SELECT在英格蘭等城鎮。

我遇到的麻煩是獲取第二個SELECT函數來識別變量。這是一個很大的代碼,所以我不想粘貼所有,但...這是填充在頁面加載的第一個選擇框中的第一個函數:

function getTierOne() 
{ 
$tblname = $_SESSION['country']; 
$result = mysql_query("SELECT DISTINCT county FROM $tblname ORDER BY county") 
or die(mysql_error()); 
while($tier = mysql_fetch_array($result)) 
{ 
    echo '<option value="'.$tier['county'].'">'.$tier['county'].'</option>'; 
} 
} 

這是罰款,$ tblname是發佈$ _SESSION變量包含用戶國家,obvs。

問題是這樣的第一選擇框 '的onblur',第二個選擇框被提升使用這個JS函數和PHP調用:

$(document).ready(function() 
{ 
    $('#wait_1').hide(); 
    $('#drop_1').change(function() 
     { 
      $('#wait_1').show(); 
      $('#result_1').hide(); 
      $.get("func.php", 
       { 
        func: "drop_1", 
        drop_var: $('#drop_1').val() 
       }, 
      function(response) 
       { 
        $('#result_1').fadeOut(); 
        setTimeout("finishAjax('result_1', '"+escape(response)+"')", 400); 
       }); 
      return false; 
     }); 
}); 

...

if (isset($_GET['func'])&& $_GET['func'] == "drop_1") { 
drop_1($_GET['drop_var']); 
} 

其中要求這個功能:

function drop_1($drop_var) 
{ 
    include_once('functions.php'); 
    $result = mysql_query("SELECT DISTINCT town FROM $tblname WHERE county='$drop_var'") 
    or die(mysql_error()); 

    echo '<select name="drop_2" id="drop_2"> 
    <option value=" " disabled="disabled" selected="selected">Select Your Town/Nearest Town</option>'; 

    while($drop_2 = mysql_fetch_array($result)) 
    { 
    echo '<option value="'.$drop_2['town'].'">'.$drop_2['town'].'</option>'; 
    } 
    echo '</select>'; 
    echo '<input type="submit" name="submit" value="Continue" />'; 
} 

但是這個函數不會識別我的$ tblname變量,即使我使用Global!它識別的唯一變量是$ drop_var,它是第一個SELECT框的結果。

沒有人有任何想法如何,我可以。如果你使用PHP會話來存儲用戶的國家$ tblname變量傳遞到

function drop_1($drop_var) { ... 
+0

'onBlur'工作在客戶端瀏覽器上,而不是在服務器上,除非你使用'ajax',否則你不能在javascript事件上運行php函數 –

+0

我只是在使用onBlur作爲一個糟糕的描述,一旦做出選擇從第一個SELECT中調用一個JS函數,該函數又調用PHP函數 - 我將JS添加到我的問題中。 – user2246804

+0

它是一樣的,你不能從javascript調用php函數 –

回答

0

(從getTierOne(的LINE-1),它看起來像你),你應該能夠行添加到您的drop1()PHP函數的開始:

function drop_1($drop_var) 
{ 
    $tblname = $_SESSION['country']; 
    include_once('functions.php'); 
    ... 

的Jquery應該用GET參數(FUNC和dropvar),它允許PHP一起發送用戶的cookie知道哪個會話屬於該用戶,並給他們他們的會話變量bac k(您可以使用Firebug/Chrome檢查器的「網絡」選項卡檢查此內容 - 在onBlur激活並查找「Cookie」請求標頭後,查找對func.php的調用)。或者,如果你不使用會話,但你有國家存儲在客戶端(例如作爲第一個「drop_0」選擇框?),你可以讓jquery通過tier1(縣)在獲取呼叫中選擇框。即。

$.get("func.php", 
{ 
    func: "drop_1", 
    country: "VALUE OF COUNTRY HERE", 
    drop_var: $('#drop_1').val() 
}, 
function(response) 
{ ... 

並修改您的服務器端PHP代碼接受2個參數,而不是一個。

從可維護性角度考慮,不要使用多個表格(每個國家/地區一個表格),而應該使用帶有「country」列的單個表格。擁有多個相同結構的表並不是一個好主意,MySQL通常可以處理數百萬行比數百個表好得多,並且使連接和更改表的結構變得更加困難。 您還應該對輸入進行清理,而不是直接在SQL查詢中使用$ GET ['drop_var'],否則它將打破引號並打開SQL注入攻擊。 (道歉,如果你有充分的理由做這些:顯然你比我更瞭解你的具體要求!)

+0

Crashhatch - 我正在使用會話,但功能drop_1($ drop_var)將無法識別它們 - 我實際上已將所有數據存入一個可用表格(英國),我將其分成蘇格蘭,英格蘭,威爾士和北愛爾蘭 - 但我可以添加我的第一個查詢打折的地方,所以你是對的 - 謝謝你花時間回答 - upvoted,雖然沒有解決我原來的問題 - 一個很好的迴應。哦,我不能upvote - 但如果我能我會。 – user2246804

+0

很高興你解決它。如果遇到會話不再工作的問題,首先要做的兩件事是檢查cookie是否被傳遞(使用所描述的Firebug),並確保PHP的session_start()被調用爲ajax在嘗試訪問會話之前獲取請求(例如,在func.php的頂部)。 – Crashthatch