2013-01-22 32 views
1

我正在使用jQuery標籤!爲我的用戶創建一個「技能」輸入表單。我有標籤的UI - 它的工作,但我無法將用戶輸入到一個PHP數組。我想序列化這個數組並將其保存到一個mysql數據庫以供稍後顯示,但我甚至無法將數據獲取到數組中。保存jQuery標籤 - 它輸入爲php數組

這裏是JavaScript初始化標籤它:

$('#skills').tagit({  
    allowSpaces: true, 
    placeholderText: "Separate skills with a comma please", 
    autocomplete: true 
}); 

下面是HTML:

<div> 
    <label class="add_label">Skills: </label> 
    <ul id="skills" style="width: 275px; margin-bottom: 8px;"></ul> 
</div> 

這是創建其中用戶輸入應該被存儲在輸入字段中的JavaScript的:

if (!this.options.singleField) { 
     var escapedValue = label.html(); 
     tag.append('<input type="hidden" style="display:none;" value="' + escapedValue + '" name="' + this.options.fieldName + '" />'); 
} 

而這是獲取用戶輸入的PHP - 這是我的部分沒有工作。我無法從表格檢索任何數據:

$skillsArr = $link->real_escape_string($_POST['skills']); 

當我提交表單,和mysqli查詢執行,並在數據庫中我看到的「N」;序列化數組應該在哪裏。

如何將jQuery標記值轉換爲可以序列化並保存到mysql數據庫的PHP數組?

+0

在某處回顯mysql查詢,或讓它進入error_log(),以便您可以看到實際正在運行的查詢。 –

+0

在你的PHP處理程序文件中嘗試'var_dump($ _REQUEST);'來查看你提交的數據並相應地處理它。 – pierdevara

+0

或看看您的控制檯日誌中發送的與ajax請求的帖子 – mikakun

回答

1

的問題是,標籤將默認發送帶有這樣的數據發佈請求:

tags=foo&tags=bar&tags=blah 

PHP會解釋,通過使$ _ POST [「標籤」] =「胡說」。對於PHP來處理它像一個數組後的數據需要看起來像:

tags[]=foo&tags[]=bar&tags[]=blah 

解決這僅僅是通過改變fieldName參數最簡單的方法,當你設置的標籤,它,比如:

$('.taglist').tagit({ 
    allowSpaces: true, 
    placeholderText: 'add new tag here...', 
    fieldName: 'tags[]' 
}); 

通過簡單地改變名稱來包含[],它就會像PHP想要的那樣被共享,併成爲一個數組。

或者,如果你不能夠調整,你總是可以處理原始PHP數據獲取標籤作爲數組,如:

$query = array(); 
foreach (explode('&', file_get_contents('php://input')) as $kv) { 
    list($k, $v) = explode('=', $kv); 
    $k = urldecode($k); 
    $v = urldecode($v); 
    if (!isset($query[$k])) { 
     $query[$k] = $v; 
    } else { 
     if (is_array($query[$k])) { 
      $query[$k][] = $v; 
     } else { 
      $query[$k] = array($query[$k], $v); 
     } 
    } 
} 

現在$查詢[「標籤」]會預期的陣列。

注意:如果只發送一個標籤,然後它會最終被上述一串代碼,所以只要確保你施放它作爲一個數組,如果結果是在一個循環或一些事情:

foreach((array)$query['tags'] as $tag) ... 
1

我發現只需在後端執行所有查詢(php/mysqli)就容易了。

這樣,我需要在我的jQuery自動完成的唯一的事情就是:

<script> 
$(document).ready(function(){ 
    $("#tagit").tagit({ 
    autocomplete: { 
    source: "ajax-search.php", 
} 
    }); 
}); 
</script> 

我剛纔定義的文件的來源。你可以根據需要添加分隔符等(我只是改變了源代碼)。

但主要功能是從PHP文件,它返回一個JSON編碼結果。

<?php 
include("dbconnect.php"); //Including our DB Connection file 

    if (!isset($_REQUEST['term'])) //if there's no search, exit 
    exit; 

    $keyword = trim($_REQUEST['term']); 
    $keyword = mysqli_real_escape_string($db, $keyword); 
    $query = "SELECT * FROM animals WHERE english LIKE '%$keyword%' LIMIT 10"; 
    $result = mysqli_query($db, $query); //Run the Query 

    $data = array(); //initialize array 

    if ($result && mysqli_num_rows($result)){ 
    while($row = mysqli_fetch_assoc($result)){ 
     $data[] = array(
     'id' => $row['row_id'], 
    'label' => $row['english'], //This is the 'live return of the search 
    'value' => $row['eng_dir'], //The value returned. Not needed if you're returning the label 
    'latin' => $row['latin'] //Another result (you can add more) 
     ); 
    } 
    } 
    echo json_encode($data); 
    flush(); 
    ?> 

然後將標籤it.js內部文件,你可以選擇你想要把一個標籤的內容:

if (this.options.availableTags || this.options.tagSource || this.options.autocomplete.source) { 
    var autocompleteOptions = { 
    select: function(event, ui) { 
    that.createTag(ui.item.id); //pushes the ID 
that.createTag(ui.item.value); //pushes the value 
    that.createTag(ui.item.label); //pushes the label 
    that.createTag(ui.item.latin); //pushes the extra variable 
// Preventing the tag input to be updated with the chosen value. 
return false; 
    } 
    }; 
    $.extend(autocompleteOptions, this.options.autocomplete); 

上面的代碼會根據您的結果返回相同標籤的4個實例。